public static void SendResponse (RequestArguments reqArg, int httpStatusCode, ITransportHeaders headers, Stream responseStream) { byte [] headersBuffer = null; byte [] entityBuffer = null; StringBuilder responseStr; String reason = null; if (headers != null && headers[CommonTransportKeys.HttpStatusCode] != null) { // The formatter can override the result code httpStatusCode = int.Parse ((string)headers [CommonTransportKeys.HttpStatusCode]); reason = (string) headers [CommonTransportKeys.HttpReasonPhrase]; } if (reason == null) reason = GetReasonPhrase (httpStatusCode); //Response Line responseStr = new StringBuilder ("HTTP/1.0 " + httpStatusCode + " " + reason + "\r\n" ); if (headers != null) { foreach (DictionaryEntry entry in headers) { string key = entry.Key.ToString(); if (key != CommonTransportKeys.HttpStatusCode && key != CommonTransportKeys.HttpReasonPhrase) responseStr.Append(key + ": " + entry.Value.ToString() + "\r\n"); } } responseStr.Append("Server: Mono Remoting, Mono CLR " + System.Environment.Version.ToString() + "\r\n"); if(responseStream != null && responseStream.Length!=0) { responseStr.Append("Content-Length: "+responseStream.Length.ToString()+"\r\n"); entityBuffer = new byte[responseStream.Length]; responseStream.Seek(0 , SeekOrigin.Begin); responseStream.Read(entityBuffer,0,entityBuffer.Length); } else responseStr.Append("Content-Length: 0\r\n"); responseStr.Append("X-Powered-By: Mono\r\n"); responseStr.Append("Connection: close\r\n"); responseStr.Append("\r\n"); headersBuffer = Encoding.ASCII.GetBytes (responseStr.ToString()); //send headersBuffer reqArg.Stream.Write (headersBuffer, 0, headersBuffer.Length); if (entityBuffer != null) reqArg.Stream.Write (entityBuffer, 0, entityBuffer.Length); }
public static void ProcessRequest (RequestArguments reqArg) { //Step (1) Start Reciceve the header ArrayList Headers = RecieveHeader (reqArg); //Step (2) Start Parse the header IDictionary HeaderFields = new Hashtable(); IDictionary CustomHeaders = new Hashtable(); if (!ParseHeader (reqArg, Headers, HeaderFields, CustomHeaders)) return; //Step (3) if (!CheckRequest (reqArg, HeaderFields, CustomHeaders)) return; //Step (4) Recieve the entity body byte[] buffer; object len = HeaderFields["content-length"]; if (len != null) { buffer = new byte [(int)len]; if (!RecieveEntityBody (reqArg, buffer)) return; } else buffer = new byte [0]; //Step (5) SendRequestForChannel (reqArg, HeaderFields, CustomHeaders, buffer); }
private static bool RecieveEntityBody (RequestArguments reqArg, byte[] buffer) { try { int nr = 0; while (nr < buffer.Length) nr += reqArg.Stream.Read (buffer, nr, buffer.Length - nr); } catch (SocketException e) { switch(e.ErrorCode) { case 10060 : //TimeOut SendResponse (reqArg, 408, null, null); break; default : throw e; } return false; }//end catch return true; }
private static bool SendRequestForChannel (RequestArguments reqArg, IDictionary HeaderFields, IDictionary CustomHeaders, byte[] buffer) { TransportHeaders THeaders = new TransportHeaders(); Stream stream = new MemoryStream(buffer); if(stream.Position !=0) stream.Seek(0,SeekOrigin.Begin); THeaders[CommonTransportKeys.RequestUri] = FixURI((string)HeaderFields["request-url"]); THeaders[CommonTransportKeys.ContentType]= HeaderFields["content-type"]; THeaders[CommonTransportKeys.RequestVerb]= HeaderFields["method"]; THeaders[CommonTransportKeys.HttpVersion] = HeaderFields["http-version"]; THeaders[CommonTransportKeys.UserAgent] = HeaderFields["user-agent"]; THeaders[CommonTransportKeys.Host] = HeaderFields["host"]; THeaders[CommonTransportKeys.SoapAction] = HeaderFields["SOAPAction"]; THeaders[CommonTransportKeys.IPAddress] = reqArg.ClientAddress; THeaders[CommonTransportKeys.ConnectionId] = reqArg.Id; foreach(DictionaryEntry DictEntry in CustomHeaders) { THeaders[DictEntry.Key.ToString()] = DictEntry.Value.ToString(); } reqArg.Sink.ServiceRequest (reqArg, stream, THeaders); return true; }
private static bool CheckRequest (RequestArguments reqArg, IDictionary HeaderFields, IDictionary CustomHeaders) { string temp; if (HeaderFields["expect"] as string == "100-continue") SendResponse (reqArg, 100, null, null); //Check the method temp = HeaderFields["method"].ToString(); if (temp != "POST") return true; //Check for the content-length field if (HeaderFields["content-length"]==null) { SendResponse (reqArg, 411, null, null); return false; } return true; }
private static bool ParseHeader (RequestArguments reqArg, ArrayList Headers, IDictionary HeaderFields, IDictionary CustomHeaders) { for (int i=0;i<Headers.Count;i++) { if (ReqMessageParser.ParseHeaderField ((string)Headers[i],HeaderFields)) continue; if (!ReqMessageParser.IsCustomHeader((string)Headers[i],CustomHeaders ) ) { SendResponse (reqArg, 400, null, null); return false; } } return true; }
private static ArrayList RecieveHeader (RequestArguments reqArg) { bool bLastLine = false; bool bEndOfLine = false; byte[] buffer = new byte[1024]; ArrayList Headers = new ArrayList(); Stream ist = reqArg.Stream; int index =0; while (!bLastLine) { //recieve line by line index = 0; bEndOfLine = false; //Step (1) is it an empty line? ist.Read (buffer, index, 1); if(buffer[index++]==13) { ist.Read (buffer, index, 1); bLastLine=true; bEndOfLine = true; } //Step (2) recieve line bytes while (!bEndOfLine) { ist.Read (buffer, index, 1); if(buffer [index++]==13) { bEndOfLine = true; ist.Read (buffer,index,1); } } //Step (3) convert bytes to a string if (bLastLine) continue; Headers.Add (Encoding.ASCII.GetString (buffer,0,index)); }//end while loop return Headers; }
} // IServerChannelSink internal void ServiceRequest (RequestArguments reqArg, Stream requestStream, ITransportHeaders headers) { ITransportHeaders responseHeaders; Stream responseStream; ServerProcessing processing; try { processing = DispatchRequest (requestStream, headers, out responseStream, out responseHeaders); switch (processing) { case ServerProcessing.Complete: HttpServer.SendResponse (reqArg, 200, responseHeaders, responseStream); break; case ServerProcessing.OneWay: HttpServer.SendResponse (reqArg, 200, null, null); break; case ServerProcessing.Async: break; } } catch (Exception ex) { } }
internal void Listen() { try { while(true) { Socket socket = _tcpListener.AcceptSocket(); RequestArguments request = new RequestArguments (socket, _transportSink); threadPool.RunThread (new ThreadStart (request.Process)); } } catch {} }