void ServeHTTP(Socket sock) { var stream = new HttpStream(sock); var line = ReadLine(stream); if (line == null) { return; } var top = line.Trim().Split(' '); if (top.Length != 3) { return; } var req = new HttpRequest(stream) { HttpMethod = top [0], RawUrl = top [1], protocol = top [2] }; // XXX: Should use a regex to check for the scheme, could also be e.g. https:// if (req.RawUrl.StartsWith("http://")) { // .NET API specifies that the RawURL starts with the path req.RawUrl = req.RawUrl.Remove(0, "http://".Length); req.Url = new Uri(req.RawUrl); } else { req.Url = new Uri("http://" + System.Net.IPAddress.Any + ":" + port + req.RawUrl); } while (true) { var headerline = ReadLine(stream); if (headerline.Length == 0) { break; } req.Headers.AddHeaderLine(headerline); } string contentLength = req.Headers.Get("Content-Length"); if (contentLength != null) { var count = int.Parse(contentLength); var bytes = new byte[count]; var offset = 0; int len = -1; do { len = stream.Read(bytes, offset, count); offset += len; count -= len; } while (len > 0 && count > 0); req.body = System.Text.Encoding.UTF8.GetString(bytes); } string[] contentTypes = req.Headers.GetValues("Content-Type"); if (contentTypes != null && Array.IndexOf(contentTypes, "multipart/form-data") >= 0) { req.formData = MultiPartEntry.Parse(req); } if (processRequestsInMainThread) { lock (mainThreadRequests) { mainThreadRequests.Enqueue(req); } } else { ProcessRequest(req); } }
public HttpRequest(HttpStream stream) { InputStream = stream; }