public static byte[] HandleRequest(string method, string uri, string query, Dictionary <string, string> headers, IPAddress ip) { var nuri = new Url { Scheme = "http", HostName = GetHeader(headers, "Host"), Port = null, BasePath = "", Path = uri, Query = query }; var contentLength = ExpectedLength(headers); var bodyStream = Stream.Null; if (contentLength > 0) { var bodyBytes = GameInterface.ReadHTTPBody((int)contentLength); bodyStream = new MemoryStream(bodyBytes); } var body = new RequestStream(bodyStream, contentLength, false); var headerDictionary = headers.ToDictionary(kv => kv.Key, kv => (IEnumerable <string>) new[] { kv.Value }, StringComparer.OrdinalIgnoreCase); var request = new Request(method, nuri, body, headerDictionary, ip.ToString()); var context = _engine.HandleRequest(request); var responseStatusCode = context.Response.StatusCode; var responseStream = new MemoryStream(); context.Response.Contents(responseStream); responseStream.Position = 0; var response = new StringBuilder(); response.Append("HTTP/1.0 "); response.Append(((int)responseStatusCode).ToString()); response.Append(" "); response.Append(_statusCodes[(int)responseStatusCode]); response.Append("\r\n"); foreach (var header in context.Response.Headers) { response.Append(header.Key); response.Append(": "); response.Append(string.Join(", ", header.Value)); response.Append("\r\n"); } if (context.Response.ContentType != null) { response.Append("Content-Type: "); response.Append(context.Response.ContentType); response.Append("\r\n"); } if (context.Response.Cookies != null && context.Response.Cookies.Count != 0) { var cookies = context.Response.Cookies.Select(cookie => cookie.ToString()).ToArray(); response.Append("Set-Cookie: "); response.Append(string.Join(", ", cookies)); response.Append("\r\n"); } response.Append("\r\n"); var headerBytes = Encoding.UTF8.GetBytes(response.ToString()); var dataBytes = new byte[responseStream.Length + headerBytes.Length]; Array.Copy(headerBytes, dataBytes, headerBytes.Length); responseStream.Read(dataBytes, headerBytes.Length, (int)responseStream.Length); //Log.Debug(context.Trace.TraceLog.ToString()); context.Dispose(); return(dataBytes); }