示例#1
0
        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);
        }