HttpServer.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918
  1. //==========================================================================
  2. // File: HttpServer.cs
  3. //
  4. // Summary: Implements an HttpServer to be used by the HttpServerChannel class
  5. //
  6. //
  7. // Classes: internal sealed HttpServer
  8. // internal sealed ReqMessageParser
  9. // private RequestArguments
  10. //
  11. // By :
  12. // Ahmad Tantawy [email protected]
  13. // Ahmad Kadry [email protected]
  14. // Hussein Mehanna [email protected]
  15. //
  16. //==========================================================================
  17. using System;
  18. using System.Net.Sockets;
  19. using System.Text;
  20. using System.Text.RegularExpressions;
  21. using System.Collections;
  22. using System.Runtime.Remoting.Channels;
  23. using System.IO;
  24. using System.Net;
  25. using System.Runtime.Remoting.Messaging;
  26. namespace System.Runtime.Remoting.Channels.Http
  27. {
  28. internal class RequestArguments
  29. {
  30. public RequestArguments (Socket socket, HttpServerTransportSink sink)
  31. {
  32. NetworkStream ns = new NetworkStream (socket);
  33. InputStream = ns;
  34. OutputStream = ns;
  35. Sink = sink;
  36. }
  37. public RequestArguments (Stream inputStream, Stream outputStream, HttpServerTransportSink sink)
  38. {
  39. InputStream = inputStream;
  40. OutputStream = outputStream;
  41. Sink = sink;
  42. }
  43. public Stream InputStream;
  44. public Stream OutputStream;
  45. public HttpServerTransportSink Sink;
  46. }
  47. internal sealed class HttpServer
  48. {
  49. private TcpListener listener=null;
  50. private const int nTimeOut = 1000;
  51. public HttpServer(int port)
  52. {
  53. try
  54. {
  55. listener = new TcpListener(port);
  56. }
  57. catch(NullReferenceException)
  58. {
  59. Console.WriteLine("The port is bound to another application");
  60. }
  61. }
  62. public static void ProcessRequest (object reqInfo)
  63. {
  64. if(reqInfo as RequestArguments == null)
  65. return;
  66. RequestArguments reqArg = (RequestArguments)reqInfo;
  67. //Step (1) Start Reciceve the header
  68. ArrayList Headers = RecieveHeader (reqArg);
  69. //Step (2) Start Parse the header
  70. IDictionary HeaderFields = new Hashtable();
  71. IDictionary CustomHeaders = new Hashtable();
  72. if (!ParseHeader (reqArg, Headers, HeaderFields, CustomHeaders))
  73. return;
  74. //Step (3)
  75. if (!CheckRequest (reqArg, HeaderFields, CustomHeaders))
  76. return;
  77. //Step (4) Recieve the entity body
  78. byte[] buffer;
  79. object len = HeaderFields["content-length"];
  80. if (len != null)
  81. {
  82. buffer = new byte [(int)len];
  83. if (!RecieveEntityBody (reqArg, buffer))
  84. return;
  85. }
  86. else
  87. buffer = new byte [0];
  88. //Step (5)
  89. SendRequestForChannel (reqArg, HeaderFields, CustomHeaders, buffer);
  90. }
  91. private static ArrayList RecieveHeader (RequestArguments reqArg)
  92. {
  93. bool bLastLine = false;
  94. bool bEndOfLine = false;
  95. byte[] buffer = new byte[1024];
  96. ArrayList Headers = new ArrayList();
  97. Stream ist = reqArg.InputStream;
  98. int index =0;
  99. while (!bLastLine)
  100. {
  101. //recieve line by line
  102. index = 0;
  103. bEndOfLine = false;
  104. //Step (1) is it an empty line?
  105. ist.Read (buffer, index, 1);
  106. if(buffer[index++]==13)
  107. {
  108. ist.Read (buffer, index, 1);
  109. bLastLine=true;
  110. bEndOfLine = true;
  111. }
  112. //Step (2) recieve line bytes
  113. while (!bEndOfLine)
  114. {
  115. ist.Read (buffer, index, 1);
  116. if(buffer [index++]==13)
  117. {
  118. bEndOfLine = true;
  119. ist.Read (buffer,index,1);
  120. }
  121. }
  122. //Step (3) convert bytes to a string
  123. if (bLastLine)
  124. continue;
  125. Headers.Add (Encoding.ASCII.GetString (buffer,0,index));
  126. }//end while loop
  127. return Headers;
  128. }
  129. private static bool ParseHeader (RequestArguments reqArg, ArrayList Headers, IDictionary HeaderFields, IDictionary CustomHeaders)
  130. {
  131. for (int i=0;i<Headers.Count;i++)
  132. {
  133. if (ReqMessageParser.ParseHeaderField ((string)Headers[i],HeaderFields))
  134. continue;
  135. if (!ReqMessageParser.IsCustomHeader((string)Headers[i],CustomHeaders ) )
  136. {
  137. SendResponse (reqArg, 400, null, null);
  138. return false;
  139. }
  140. }
  141. return true;
  142. }
  143. private static bool CheckRequest (RequestArguments reqArg, IDictionary HeaderFields, IDictionary CustomHeaders)
  144. {
  145. string temp;
  146. if (HeaderFields["expect"] as string == "100-continue")
  147. SendResponse (reqArg, 100, null, null);
  148. //Check the method
  149. temp = HeaderFields["method"].ToString();
  150. if (temp != "POST")
  151. return true;
  152. //Check for the content-length field
  153. if (HeaderFields["content-length"]==null)
  154. {
  155. SendResponse (reqArg, 411, null, null);
  156. return false;
  157. }
  158. return true;
  159. }
  160. private static bool RecieveEntityBody (RequestArguments reqArg, byte[] buffer)
  161. {
  162. try
  163. {
  164. int nr = 0;
  165. while (nr < buffer.Length)
  166. nr += reqArg.InputStream.Read (buffer, nr, buffer.Length - nr);
  167. }
  168. catch (SocketException e)
  169. {
  170. switch(e.ErrorCode)
  171. {
  172. case 10060 : //TimeOut
  173. SendResponse (reqArg, 408, null, null);
  174. break;
  175. default :
  176. //<Exception>
  177. break;
  178. }
  179. return false;
  180. }//end catch
  181. return true;
  182. }
  183. private static bool SendRequestForChannel (RequestArguments reqArg, IDictionary HeaderFields, IDictionary CustomHeaders, byte[] buffer)
  184. {
  185. TransportHeaders THeaders = new TransportHeaders();
  186. Stream stream = new MemoryStream(buffer);
  187. if(stream.Position !=0)
  188. stream.Seek(0,SeekOrigin.Begin);
  189. THeaders[CommonTransportKeys.RequestUri] = FixURI((string)HeaderFields["request-url"]);
  190. THeaders[CommonTransportKeys.ContentType]= HeaderFields["content-type"];
  191. THeaders[CommonTransportKeys.RequestVerb]= HeaderFields["method"];
  192. THeaders[CommonTransportKeys.HttpVersion] = HeaderFields["http-version"];
  193. THeaders[CommonTransportKeys.UserAgent] = HeaderFields["user-agent"];
  194. THeaders[CommonTransportKeys.Host] = HeaderFields["host"];
  195. THeaders[CommonTransportKeys.SoapAction] = HeaderFields["SOAPAction"];
  196. foreach(DictionaryEntry DictEntry in CustomHeaders)
  197. {
  198. THeaders[DictEntry.Key.ToString()] = DictEntry.Value.ToString();
  199. }
  200. reqArg.Sink.ServiceRequest (reqArg, stream, THeaders);
  201. return true;
  202. }
  203. private static string FixURI(string RequestURI)
  204. {
  205. if(RequestURI.IndexOf ( '.' ) == -1)
  206. return RequestURI;
  207. else
  208. return RequestURI.Substring(1);
  209. }
  210. public static bool SendResponse (RequestArguments reqArg, int httpStatusCode, ITransportHeaders headers, Stream responseStream)
  211. {
  212. byte [] headersBuffer = null;
  213. byte [] entityBuffer = null;
  214. StringBuilder responseStr;
  215. String reason = null;
  216. if (headers != null && headers[CommonTransportKeys.HttpStatusCode] != null) {
  217. // The formatter can override the result code
  218. httpStatusCode = int.Parse ((string)headers [CommonTransportKeys.HttpStatusCode]);
  219. reason = (string) headers [CommonTransportKeys.HttpReasonPhrase];
  220. }
  221. if (reason == null)
  222. reason = GetReasonPhrase (httpStatusCode);
  223. //Response Line
  224. responseStr = new StringBuilder ("HTTP/1.0 " + httpStatusCode + " " + reason + "\r\n" );
  225. if (headers != null)
  226. {
  227. foreach (DictionaryEntry entry in headers)
  228. {
  229. string key = entry.Key.ToString();
  230. if (key != CommonTransportKeys.HttpStatusCode && key != CommonTransportKeys.HttpReasonPhrase)
  231. responseStr.Append(key + ": " + entry.Value.ToString() + "\r\n");
  232. }
  233. }
  234. responseStr.Append("Server: Mono Remoting, Mono CLR " + System.Environment.Version.ToString() + "\r\n");
  235. if(responseStream != null && responseStream.Length!=0)
  236. {
  237. responseStr.Append("Content-Length: "+responseStream.Length.ToString()+"\r\n");
  238. entityBuffer = new byte[responseStream.Length];
  239. responseStream.Seek(0 , SeekOrigin.Begin);
  240. responseStream.Read(entityBuffer,0,entityBuffer.Length);
  241. }
  242. else
  243. responseStr.Append("Content-Length: 0\r\n");
  244. responseStr.Append("X-Powered-By: Mono\r\n");
  245. responseStr.Append("Connection: close\r\n");
  246. responseStr.Append("\r\n");
  247. headersBuffer = Encoding.ASCII.GetBytes (responseStr.ToString());
  248. try
  249. {
  250. //send headersBuffer
  251. reqArg.OutputStream.Write (headersBuffer, 0, headersBuffer.Length);
  252. if (entityBuffer != null)
  253. reqArg.OutputStream.Write (entityBuffer, 0, entityBuffer.Length);
  254. }
  255. catch
  256. {
  257. //<EXCEPTION>
  258. //may be its the client's fault so just return with false
  259. return false;
  260. }
  261. finally
  262. {
  263. Console.WriteLine ("Closed");
  264. reqArg.OutputStream.Close ();
  265. }
  266. return true;
  267. }
  268. internal static string GetReasonPhrase (int HttpStatusCode)
  269. {
  270. switch (HttpStatusCode)
  271. {
  272. case 100 : return "Continue" ;
  273. case 101 :return "Switching Protocols";
  274. case 200 :return "OK";
  275. case 201 :return "Created";
  276. case 202 :return "Accepted";
  277. case 203 :return "Non-Authoritative Information";
  278. case 204 :return "No Content";
  279. case 205 :return "Reset Content";
  280. case 206 :return "Partial Content";
  281. case 300 :return "Multiple Choices";
  282. case 301 :return "Moved Permanently";
  283. case 302 :return "Found";
  284. case 303 :return "See Other";
  285. case 304 :return "Not Modified";
  286. case 305 :return "Use Proxy";
  287. case 307 :return "Temporary Redirect";
  288. case 400 :return "Bad Request";
  289. case 401 :return "Unauthorized";
  290. case 402 :return "Payment Required";
  291. case 403 :return "Forbidden";
  292. case 404 :return "Not Found";
  293. case 405 :return "Method Not Allowed";
  294. case 406 :return "Not Acceptable";
  295. case 407 :return "Proxy Authentication Required";
  296. case 408 :return "Request Time-out";
  297. case 409 :return "Conflict";
  298. case 410 :return "Gone";
  299. case 411 :return "Length Required";
  300. case 412 :return "Precondition Failed";
  301. case 413 :return "Request Entity Too Large";
  302. case 414 :return "Request-URI Too Large";
  303. case 415 :return "Unsupported Media Type";
  304. case 416 :return "Requested range not satisfiable";
  305. case 417 :return "Expectation Failed";
  306. case 500 :return "Internal Server Error";
  307. case 501 :return "Not Implemented";
  308. case 502 :return "Bad Gateway";
  309. case 503 :return "Service Unavailable";
  310. case 504 :return "Gateway Time-out";
  311. case 505 :return "HTTP Version not supported";
  312. default: return "";
  313. }
  314. }
  315. }
  316. internal sealed class ReqMessageParser
  317. {
  318. private const int nCountReq = 14;
  319. private const int nCountEntity = 15;
  320. private static bool bInitialized = false;
  321. private static String [] ReqRegExpString = new String [nCountReq ];
  322. private static String [] EntityRegExpString = new String[nCountEntity];
  323. private static Regex [] ReqRegExp = new Regex[nCountReq];
  324. private static Regex [] EntityRegExp = new Regex[nCountEntity];
  325. public ReqMessageParser ()
  326. {
  327. }
  328. public static bool ParseHeaderField(string buffer,IDictionary headers)
  329. {
  330. try
  331. {
  332. if(!bInitialized)
  333. {
  334. Initialize();
  335. bInitialized =true;
  336. }
  337. if(IsRequestField(buffer,headers))
  338. return true;
  339. if(IsEntityField(buffer,headers))
  340. return true ;
  341. }
  342. catch(Exception )
  343. {
  344. //<Exception>
  345. }
  346. //Exception
  347. return false;
  348. }
  349. private static bool Initialize()
  350. {
  351. if(bInitialized)
  352. return true;
  353. bInitialized = true;
  354. //initialize array
  355. //Create all the Regular expressions
  356. InitializeRequestRegExp();
  357. InitiazeEntityRegExp();
  358. for(int i=0;i<nCountReq;i++)
  359. ReqRegExp[i] = new Regex(ReqRegExpString[i],RegexOptions.Compiled|RegexOptions.IgnoreCase);
  360. for(int i=0;i<nCountEntity;i++)
  361. EntityRegExp[i] = new Regex(EntityRegExpString[i],RegexOptions.Compiled|RegexOptions.IgnoreCase);
  362. return true;
  363. }
  364. private static void InitializeRequestRegExp()
  365. {
  366. //Request Header Fields
  367. //
  368. ReqRegExpString[0] = "^accept(\\s*:\\s*)(?<accept>\\S+)(\\s*|)(\\s*)$";
  369. ReqRegExpString[1] = "^accept-charset(\\s*:\\s*)(?<accept_charset>\\S+(\\s|\\S)*\\S)(\\s*)$";
  370. ReqRegExpString[2] = "^accept-encoding(\\s*:\\s*)(?<accept_Encoding>\\S+(\\s|\\S)*\\S)(\\s*)$";
  371. ReqRegExpString[3] = "^authorization(\\s*:\\s*)(?<authorization>\\S+(\\s|\\S)*\\S)(\\s*)$";
  372. ReqRegExpString[4] = "^accept-language(\\s*:\\s*)(?<accept_Language>\\S+(\\s|\\S)*\\S)(\\s*)$";
  373. ReqRegExpString[5] = "^from(\\s*:\\s*)(?<from>\\S+(\\s|\\S)*\\S)(\\s*)$";
  374. ReqRegExpString[6] = "^host(\\s*:\\s*)(?<host>\\S+(\\s|\\S)*\\S)(\\s*)$";
  375. ReqRegExpString[7] = "^if-modified-since(\\s*:\\s*)(?<if_modified>\\S+(\\s|\\S)*\\S)(\\s*)$";
  376. ReqRegExpString[8] = "^proxy-authorization(\\s*:\\s*)(?<proxy_auth>\\S+(\\s|\\S)*\\S)(\\s*)$";
  377. ReqRegExpString[9] = "^range(\\s*:\\s*)(?<range>\\S+(\\s|\\S)*\\S)(\\s*)$";
  378. ReqRegExpString[10] = "^user-agent(\\s*:\\s*)(?<user_agent>\\S+(\\s|\\S)*\\S)(\\s*)$";
  379. ReqRegExpString[11] = "^expect(\\s*:\\s*)(?<expect>\\S+(\\s|\\S)*\\S)(\\s*)$";
  380. ReqRegExpString[12] = "^connection(\\s*:\\s*)(?<connection>\\S+(\\s|\\S)*\\S)(\\s*)$";
  381. ReqRegExpString[13] = "^(?<method>\\w+)(\\s+)(?<request_url>\\S+)(\\s+)(?<http_version>\\S+)(\\s*)$";
  382. // ReqRegExpString[14] = "";
  383. }
  384. private static void InitiazeEntityRegExp()
  385. {
  386. EntityRegExpString[0] = "^allow(\\s*:\\s*)(?<allow>[0-9]+)(\\s*)$";
  387. EntityRegExpString[1] = "^content-encoding(\\s*:\\s*)(?<content_encoding>\\S+(\\s|\\S)*\\S)(\\s*)$";
  388. EntityRegExpString[2] = "^content-language(\\s*:\\s*)(?<content_language>\\S+(\\s|\\S)*\\S)(\\s*)$";
  389. EntityRegExpString[3] = "^content-length(\\s*:\\s*)(?<content_length>[0-9]+)(\\s*)$";
  390. EntityRegExpString[4] = "^content-range(\\s*:\\s*)(?<content_range>\\S+(\\s|\\S)*\\S)(\\s*)$";
  391. EntityRegExpString[5] = "^content-type(\\s*:\\s*)(?<content_type>\\S+(\\s|\\S)*\\S)(\\s*)$";
  392. EntityRegExpString[6] = "^content-version(\\s*:\\s*)(?<content_version>\\S+(\\s|\\S)*\\S)(\\s*)$";
  393. EntityRegExpString[7] = "^derived-from(\\s*:\\s*)(?<derived_from>\\S+(\\s|\\S)*\\S)(\\s*)$";
  394. EntityRegExpString[8] = "^expires(\\s*:\\s*)(?<expires>\\S+(\\s|\\S)*\\S)(\\s*)$";//date
  395. EntityRegExpString[9] = "^last-modified(\\s*:\\s*)(?<last_modified>\\S+(\\s|\\S)*\\S)(\\s*)$";//date
  396. EntityRegExpString[10] = "^link(\\s*:\\s*)(?<link>\\S+(\\s|\\S)*\\S)(\\s*)$";
  397. EntityRegExpString[11] = "^title(\\s*:\\s*)(?<title>\\S+(\\s|\\S)*\\S)(\\s*)$";
  398. EntityRegExpString[12] = "^transfere-encoding(\\s*:\\s*)(?<transfere_encoding>\\S+(\\s|\\S)*\\S)(\\s*)$";
  399. EntityRegExpString[13] = "^url-header(\\s*:\\s*)(?<url_header>\\S+(\\s|\\S)*\\S)(\\s*)$";
  400. EntityRegExpString[14] = "^extension-header(\\s*:\\s*)(?<extension_header>\\S+(\\s|\\S)*\\S)(\\s*)$";
  401. }
  402. private static void CopyGroupNames(Regex regEx , Match m , IDictionary headers)
  403. {
  404. if(!m.Success)
  405. return;
  406. string [] ar = regEx.GetGroupNames();
  407. GroupCollection gc = m.Groups;
  408. for(int i=0;i<ar.Length;i++)
  409. {
  410. if(! char.IsLetter(ar[i],0))
  411. continue;
  412. headers.Add(ar[i],gc[ar[i]].Value);
  413. }
  414. }
  415. private static bool IsRequestField(string buffer , IDictionary HeaderItems)
  416. {
  417. if(Request_accept(buffer , HeaderItems))
  418. return true;
  419. if(Request_accept_charset(buffer , HeaderItems))
  420. return true;
  421. if(Request_accept_encoding(buffer , HeaderItems))
  422. return true;
  423. if(Request_accept_language(buffer , HeaderItems))
  424. return true;
  425. if(Request_authorization(buffer , HeaderItems))
  426. return true;
  427. if(Request_connection(buffer , HeaderItems))
  428. return true;
  429. if(Request_expect(buffer , HeaderItems))
  430. return true;
  431. if(Request_from(buffer , HeaderItems))
  432. return true;
  433. if(Request_host(buffer , HeaderItems))
  434. return true;
  435. if(Request_modified(buffer , HeaderItems))
  436. return true;
  437. if(Request_proxy_authorization(buffer , HeaderItems))
  438. return true;
  439. if(Request_user_agent(buffer , HeaderItems))
  440. return true;
  441. if(Request_request_line(buffer , HeaderItems))
  442. return true;
  443. return false;
  444. }
  445. private static bool IsEntityField(string buffer , IDictionary HeaderItems)
  446. {
  447. if(Entity_allow(buffer , HeaderItems))
  448. return true;
  449. if(Entity_content_encoding(buffer , HeaderItems))
  450. return true;
  451. if(Entity_content_language(buffer , HeaderItems))
  452. return true;
  453. if(Entity_content_length(buffer , HeaderItems))
  454. return true;
  455. if(Entity_content_range(buffer , HeaderItems))
  456. return true;
  457. if(Entity_content_type(buffer , HeaderItems))
  458. return true;
  459. if(Entity_content_version(buffer , HeaderItems))
  460. return true;
  461. if(Entity_dervied_from(buffer , HeaderItems))
  462. return true;
  463. if(Entity_expires(buffer , HeaderItems))
  464. return true;
  465. if(Entity_extension_header(buffer , HeaderItems))
  466. return true;
  467. if(Entity_last_modified(buffer , HeaderItems))
  468. return true;
  469. if(Entity_link(buffer , HeaderItems))
  470. return true;
  471. if(Entity_title(buffer , HeaderItems))
  472. return true;
  473. if(Entity_transfere_encoding(buffer , HeaderItems))
  474. return true;
  475. if(Entity_url_header(buffer , HeaderItems))
  476. return true;
  477. return false;
  478. }
  479. public static bool IsCustomHeader(string buffer,IDictionary CustomHeader)
  480. {
  481. Regex CustomHeaderEx = new Regex("^(?<header>\\S+)(\\s*:\\s*)(?<field>\\S+(\\s|\\S)*\\S)(\\s*)",RegexOptions.Compiled);
  482. Match m = CustomHeaderEx.Match(buffer);
  483. if(!m.Success)
  484. return false;
  485. CustomHeader.Add(m.Groups["header"].Value,m.Groups["field"].Value);
  486. return true;
  487. }
  488. //********************************************************
  489. //REQUEST
  490. private static bool Request_accept(string buffer,IDictionary HeaderItems)
  491. {
  492. Match m = ReqRegExp[0].Match(buffer);
  493. if(!m.Success)
  494. return false;
  495. HeaderItems.Add("accept",m.Groups["accept"].Value);
  496. return true;
  497. }
  498. private static bool Request_accept_charset(string buffer,IDictionary HeaderItems)
  499. {
  500. Match m = ReqRegExp[1].Match(buffer);
  501. if(!m.Success)
  502. return false;
  503. HeaderItems.Add("accept-charset",m.Groups["accept_charset"].Value);
  504. return true;
  505. }
  506. private static bool Request_accept_encoding(string buffer,IDictionary HeaderItems)
  507. {
  508. Match m = ReqRegExp[2].Match(buffer);
  509. if(!m.Success)
  510. return false;
  511. HeaderItems.Add("accept-encoding",m.Groups["accept_encoding"].Value);
  512. return true;
  513. }
  514. private static bool Request_authorization(string buffer,IDictionary HeaderItems)
  515. {
  516. Match m = ReqRegExp[3].Match(buffer);
  517. if(!m.Success)
  518. return false;
  519. HeaderItems.Add("authorization",m.Groups["authorization"].Value);
  520. return true;
  521. }
  522. private static bool Request_accept_language(string buffer,IDictionary HeaderItems)
  523. {
  524. Match m = ReqRegExp[4].Match(buffer);
  525. if(!m.Success)
  526. return false;
  527. HeaderItems.Add("accept-language",m.Groups["accept_language"].Value);
  528. return true;
  529. }
  530. private static bool Request_from(string buffer,IDictionary HeaderItems)
  531. {
  532. Match m = ReqRegExp[5].Match(buffer);
  533. if(!m.Success)
  534. return false;
  535. HeaderItems.Add("from",m.Groups["from"].Value);
  536. return true;
  537. }
  538. private static bool Request_host(string buffer,IDictionary HeaderItems)
  539. {
  540. Match m = ReqRegExp[6].Match(buffer);
  541. if(!m.Success)
  542. return false;
  543. HeaderItems.Add("host",m.Groups["host"].Value);
  544. return true;
  545. }
  546. private static bool Request_modified(string buffer,IDictionary HeaderItems)
  547. {
  548. Match m = ReqRegExp[7].Match(buffer);
  549. if(!m.Success)
  550. return false;
  551. HeaderItems.Add("modified",m.Groups["modified"].Value);
  552. return true;
  553. }
  554. private static bool Request_proxy_authorization(string buffer,IDictionary HeaderItems)
  555. {
  556. Match m = ReqRegExp[8].Match(buffer);
  557. if(!m.Success)
  558. return false;
  559. HeaderItems.Add("proxy-authorization",m.Groups["proxy_authorization"].Value);
  560. return true;
  561. }
  562. private static bool Request_range(string buffer , IDictionary HeaderItems)
  563. {
  564. Match m = ReqRegExp[9].Match(buffer);
  565. if(!m.Success)
  566. return false;
  567. HeaderItems.Add("range",m.Groups["range"].Value);
  568. return true;
  569. }
  570. private static bool Request_user_agent(string buffer,IDictionary HeaderItems)
  571. {
  572. Match m = ReqRegExp[10].Match(buffer);
  573. if(!m.Success)
  574. return false;
  575. HeaderItems.Add("user-agent",m.Groups["user_agent"].Value);
  576. return true;
  577. }
  578. private static bool Request_expect(string buffer,IDictionary HeaderItems)
  579. {
  580. Match m = ReqRegExp[11].Match(buffer);
  581. if(!m.Success)
  582. return false;
  583. HeaderItems.Add("expect",m.Groups["expect"].Value);
  584. return true;
  585. }
  586. private static bool Request_connection(string buffer,IDictionary HeaderItems)
  587. {
  588. Match m = ReqRegExp[12].Match(buffer);
  589. if(!m.Success)
  590. return false;
  591. HeaderItems.Add("connection",m.Groups["connection"].Value);
  592. return true;
  593. }
  594. private static bool Request_request_line(string buffer, IDictionary HeaderItems)
  595. {
  596. Match m = ReqRegExp[13].Match(buffer);
  597. if(!m.Success)
  598. return false;
  599. //ReqRegExpString[13] = "(?<method>\\w+)(\\s+)(?<request_url>\\S+)(\\s+)(?<http_version>\\S+)";
  600. HeaderItems.Add("method",m.Groups["method"].Value);
  601. HeaderItems.Add("request-url",m.Groups["request_url"].Value);
  602. HeaderItems.Add("http-version",m.Groups["http_version"].Value);
  603. return true;
  604. }
  605. //********************************************************
  606. //********************************************************
  607. //ENTITY
  608. private static bool Entity_allow(string buffer,IDictionary HeaderItems)
  609. {
  610. Match m = EntityRegExp[0].Match(buffer);
  611. if(!m.Success)
  612. return false;
  613. HeaderItems.Add("allow",m.Groups["allow"].Value);
  614. return true;
  615. }
  616. private static bool Entity_content_encoding(string buffer,IDictionary HeaderItems)
  617. {
  618. Match m = EntityRegExp[1].Match(buffer);
  619. if(!m.Success)
  620. return false;
  621. HeaderItems.Add("content-encoding",m.Groups["content_encoding"].Value);
  622. return true;
  623. }
  624. private static bool Entity_content_language(string buffer,IDictionary HeaderItems)
  625. {
  626. Match m = EntityRegExp[2].Match(buffer);
  627. if(!m.Success)
  628. return false;
  629. HeaderItems.Add("content-language",m.Groups["content_language"].Value);
  630. return true;
  631. }
  632. private static bool Entity_content_length(string buffer,IDictionary HeaderItems)
  633. {
  634. Match m = EntityRegExp[3].Match(buffer);
  635. if(!m.Success)
  636. return false;
  637. int length;
  638. try
  639. {
  640. length = Int32.Parse(m.Groups["content_length"].ToString());
  641. }
  642. catch (Exception )
  643. {
  644. //<Exception>
  645. return false;
  646. }
  647. HeaderItems.Add("content-length",length);
  648. return true;
  649. }
  650. private static bool Entity_content_range(string buffer,IDictionary HeaderItems)
  651. {
  652. Match m = EntityRegExp[4].Match(buffer);
  653. if(!m.Success)
  654. return false;
  655. HeaderItems.Add("content-range",m.Groups["content_range"].Value);
  656. return true;
  657. }
  658. private static bool Entity_content_type(string buffer,IDictionary HeaderItems)
  659. {
  660. Match m = EntityRegExp[5].Match(buffer);
  661. if(!m.Success)
  662. return false;
  663. HeaderItems.Add("content-type",m.Groups["content_type"].Value);
  664. return true;
  665. }
  666. private static bool Entity_content_version(string buffer,IDictionary HeaderItems)
  667. {
  668. Match m = EntityRegExp[6].Match(buffer);
  669. if(!m.Success)
  670. return false;
  671. HeaderItems.Add("content-version",m.Groups["content_version"].Value);
  672. return true;
  673. }
  674. private static bool Entity_dervied_from(string buffer,IDictionary HeaderItems)
  675. {
  676. Match m = EntityRegExp[7].Match(buffer);
  677. if(!m.Success)
  678. return false;
  679. HeaderItems.Add("dervied-from",m.Groups["dervied_from"].Value);
  680. return true;
  681. }
  682. private static bool Entity_expires(string buffer,IDictionary HeaderItems)
  683. {
  684. Match m = EntityRegExp[8].Match(buffer);
  685. if(!m.Success)
  686. return false;
  687. HeaderItems.Add("expires",m.Groups["expires"].Value);
  688. return true;
  689. }
  690. private static bool Entity_last_modified(string buffer,IDictionary HeaderItems)
  691. {
  692. Match m = EntityRegExp[9].Match(buffer);
  693. if(!m.Success)
  694. return false;
  695. HeaderItems.Add("last-modified",m.Groups["last_modified"].Value);
  696. return true;
  697. }
  698. private static bool Entity_link(string buffer,IDictionary HeaderItems)
  699. {
  700. Match m = EntityRegExp[10].Match(buffer);
  701. if(!m.Success)
  702. return false;
  703. HeaderItems.Add("link",m.Groups["link"].Value);
  704. return true;
  705. }
  706. private static bool Entity_title(string buffer,IDictionary HeaderItems)
  707. {
  708. Match m = EntityRegExp[11].Match(buffer);
  709. if(!m.Success)
  710. return false;
  711. HeaderItems.Add("title",m.Groups["title"].Value);
  712. return true;
  713. }
  714. private static bool Entity_transfere_encoding(string buffer,IDictionary HeaderItems)
  715. {
  716. Match m = EntityRegExp[12].Match(buffer);
  717. if(!m.Success)
  718. return false;
  719. HeaderItems.Add("transfere-encoding",m.Groups["transfere_encoding"].Value);
  720. return true;
  721. }
  722. private static bool Entity_url_header(string buffer,IDictionary HeaderItems)
  723. {
  724. Match m = EntityRegExp[13].Match(buffer);
  725. if(!m.Success)
  726. return false;
  727. HeaderItems.Add("url-header",m.Groups["url_header"].Value);
  728. return true;
  729. }
  730. private static bool Entity_extension_header(string buffer,IDictionary HeaderItems)
  731. {
  732. Match m = EntityRegExp[14].Match(buffer);
  733. if(!m.Success)
  734. return false;
  735. HeaderItems.Add("extension-header",m.Groups["extension_header"].Value);
  736. return true;
  737. }
  738. //********************************************************
  739. }
  740. }