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! Console.WriteLine("get post data start"); int content_len = 0; var ms = new MemoryStream(); if (httpHeaders.ContainsKey("Content-Length")) { content_len = Convert.ToInt32(httpHeaders["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)); } var buf = new byte[BUF_SIZE]; int to_read = content_len; while (to_read > 0) { Console.WriteLine("starting Read, to_read={0}", to_read); int numread = inputStream.Read(buf, 0, Math.Min(BUF_SIZE, to_read)); Console.WriteLine("read finished, numread={0}", numread); if (numread == 0) { if (to_read == 0) { break; } throw new Exception("client disconnected during post"); } to_read -= numread; ms.Write(buf, 0, numread); } ms.Seek(0, SeekOrigin.Begin); } Console.WriteLine("get post data end"); srv.handlePOSTRequest(this, new StreamReader(ms)); }