public void process() { // we can't use a StreamReader for input, because it buffers up extra data on us inside it's // "processed" view of the world, and we want the data raw after the headers inputStream = new BufferedStream(socket.GetStream()); // we probably shouldn't be using a streamwriter for all output from handlers either outputStream = new StreamWriter(new BufferedStream(socket.GetStream())); try { parseRequest(); readHeaders(); if (http_method.Equals("GET")) { handleGETRequest(); } else if (http_method.Equals("POST")) { handlePOSTRequest(); } } catch (Exception e) { MoaLog.Debug(String.Format("Exception: {0}", e.ToString())); writeFailure(); } }
public void readHeaders() { MoaLog.Debug(String.Format("readHeaders()")); String line; while ((line = streamReadLine(inputStream)) != null) { if (line.Equals("")) { MoaLog.Debug(String.Format("got headers")); return; } int separator = line.IndexOf(':'); if (separator == -1) { throw new Exception("invalid http header line: " + line); } String name = line.Substring(0, separator); int pos = separator + 1; while ((pos < line.Length) && (line[pos] == ' ')) { pos++; // strip any spaces } string value = line.Substring(pos, line.Length - pos); MoaLog.Debug(String.Format("header: {0}:{1}", name, value)); http_req_headers[name] = value; } }
public override void handlePOSTRequest(HttpProcessor p, StreamReader inputData) { MoaLog.Debug(String.Format("POST request: {0}", p.http_url)); string data = inputData.ReadToEnd(); p.writeSuccess(); p.outputStream.WriteLine("<html><body><h1>test server</h1>"); p.outputStream.WriteLine("<a href=/test>return</a><p>"); p.outputStream.WriteLine("postbody: <pre>{0}</pre>", data); }
public void parseRequest() { String request = streamReadLine(inputStream); string[] tokens = request.Split(' '); if (tokens.Length != 3) { throw new Exception("invalid http request line"); } http_method = tokens[0].ToUpper(); http_url = tokens[1]; http_protocol_versionstring = tokens[2]; MoaLog.Debug(String.Format("starting: {0}", request)); }
public void handlePOSTRequest() { // this post data processing just reads everything into a memory stream. // this is fine for smallish things, but for large stuff we should really // hand an input stream to the request processor. However, the input stream // we hand him needs to let him see the "end of the stream" at this content // length, because otherwise he won't know when he's seen it all! MoaLog.Debug(String.Format("get post data start")); int content_len = 0; MemoryStream ms = new MemoryStream(); if (this.http_req_headers.ContainsKey("Content-Length")) { content_len = Convert.ToInt32(this.http_req_headers["Content-Length"]); if (content_len > MAX_POST_SIZE) { throw new Exception( String.Format("POST Content-Length({0}) too big for this simple server", content_len)); } byte[] buf = new byte[BUF_SIZE]; int to_read = content_len; while (to_read > 0) { MoaLog.Debug(String.Format("starting Read, to_read={0}", to_read)); int numread = this.inputStream.Read(buf, 0, Math.Min(BUF_SIZE, to_read)); MoaLog.Debug(String.Format("read finished, numread={0}", numread)); if (numread == 0) { if (to_read == 0) { break; } else { throw new Exception("client disconnected during post"); } } to_read -= numread; ms.Write(buf, 0, numread); } ms.Seek(0, SeekOrigin.Begin); } MoaLog.Debug(String.Format("get post data end")); srv.handlePOSTRequest(this, new StreamReader(ms)); }
public override void handleGETRequest(HttpProcessor p) { if (p.http_url.Equals("/Test.png")) { Stream fs = File.Open("../../Test.png", FileMode.Open); p.writeSuccess("image/png"); fs.CopyTo(p.outputStream.BaseStream); p.outputStream.BaseStream.Flush(); } MoaLog.Debug(String.Format("request: {0}", p.http_url)); p.writeSuccess(); p.outputStream.WriteLine("<html><body><h1>test server</h1>"); p.outputStream.WriteLine("Current Time: " + DateTime.Now.ToString()); p.outputStream.WriteLine("url : {0}", p.http_url); p.outputStream.WriteLine("<form method=post action=/form>"); p.outputStream.WriteLine("<input type=text name=foo value=foovalue>"); p.outputStream.WriteLine("<input type=submit name=bar value=barvalue>"); p.outputStream.WriteLine("</form>"); }