private HttpResponseDataChunk BuildError(int error, string message, string method, HttpVersion version) { HttpResponseDataChunk response = new HttpResponseDataChunk(); response.Version = version; response.ResponseCode = error; response.Message = message; response.FinalChunk = true; response.Body = new byte[0]; List <HttpHeader> headers = new List <HttpHeader>(); headers.Add(new HttpHeader("X-Proxy-Server", "CANAPE")); response.Headers = headers.ToArray(); if (method.Equals("HEAD", StringComparison.OrdinalIgnoreCase)) { response.HeadResponse = true; } else if (method.Equals("CONNECT", StringComparison.OrdinalIgnoreCase)) { response.ConnectResponse = true; } return(response); }
/// <summary> /// Run the end point /// </summary> /// <param name="adapter">The data adapter</param> public sealed override void Run(IDataAdapter adapter) { DataReader reader = new DataReader(new DataAdapterToStream(adapter)); while (true) { HttpRequestHeader request = HttpParser.ReadRequestHeader(reader, false, Logger); HttpRequestDataChunk req = request.ReadRequest(); Dictionary <string, string> headers = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); foreach (HttpHeader pair in req.Headers) { headers[pair.Name] = pair.Value; } HttpServerResponseData data = HandleRequest(req.Method, req.Path, req.Body, headers, req.Version, Logger); HttpResponseDataChunk response = new HttpResponseDataChunk(); response.Version = request.Version; response.ResponseCode = data.ResponseCode; response.Message = data.Message; List <HttpHeader> newHeaders = new List <HttpHeader>(); foreach (KeyValuePair <string, string> pair in data.Headers) { newHeaders.Add(new HttpHeader(pair.Key, pair.Value)); } if (!data.Headers.ContainsKey("content-length")) { newHeaders.Add(new HttpHeader("Content-Length", data.Body.Length.ToString())); } response.Headers = newHeaders.ToArray(); response.FinalChunk = true; if (request.Method.Equals("HEAD", StringComparison.OrdinalIgnoreCase)) { response.Body = new byte[0]; response.HeadResponse = true; } else { response.Body = data.Body; } adapter.Write(response.ToDataFrame()); if (data.CloseAfterSending || request.Version.IsVersionUnknown || request.Version.IsVersion10) { break; } } }
private void ReturnResponse(HttpRequestHeader request, int responseCode, string message, string method, HttpVersion version, IEnumerable <HttpHeader> sendHeaders, DataAdapterToStream stm) { if (request != null) { FlushRequest(request); } HttpResponseDataChunk response = new HttpResponseDataChunk(); if (_config.Version10Proxy && !version.IsVersionUnknown) { response.Version = HttpVersion.Version10; } else { response.Version = version; } response.ResponseCode = responseCode; response.Message = message; response.FinalChunk = true; response.Body = new byte[0]; List <HttpHeader> headers = new List <HttpHeader>(sendHeaders); headers.Add(new HttpHeader("X-Proxy-Server", "CANAPE")); if (response.Body.Length > 0) { headers.Add(new HttpHeader("Content-Type", "text/html")); } response.Headers = headers.ToArray(); if (method.Equals("HEAD", StringComparison.OrdinalIgnoreCase)) { response.HeadResponse = true; } else if (method.Equals("CONNECT", StringComparison.OrdinalIgnoreCase)) { response.ConnectResponse = true; } response.WriteChunk(new DataWriter(stm)); }
private void ProcessProxyResponseHeaders(HttpResponseDataChunk response) { List <HttpHeader> headers = new List <HttpHeader>(response.Headers); int i = 0; while (i < headers.Count) { HttpHeader pair = headers[i]; // We don't send connection headers if (pair.Name.Equals("Connection", StringComparison.OrdinalIgnoreCase) || pair.Name.Equals("Proxy-Connection")) { headers.RemoveAt(i); } else { ++i; } } }
private void Write(HttpResponseDataChunk chunk) { // Add proxy specific headers if (chunk.ChunkNumber == 0) { ProcessProxyResponseHeaders(chunk); lock (_requestQueue) { HttpRequestHeader request = _requestQueue.Dequeue(); // Fix up version to match the request if (_server._config.Version10Proxy && !request.Version.IsVersionUnknown) { chunk.Version = HttpVersion.Version10; } else { chunk.Version = request.Version; } if (!chunk.Version.IsVersion11) { // Remove chunked encoding for sending back 1.0 _removeChunked = true; _closeConnection = true; } else { // If not chunk encoding and no content-length then set close of end if (!chunk.ChunkedEncoding) { bool hasContentLength = false; foreach (HttpHeader header in chunk.Headers) { if (header.Name.Equals("content-length", StringComparison.OrdinalIgnoreCase)) { hasContentLength = true; break; } } if (!hasContentLength) { List <HttpHeader> headers = new List <HttpHeader>(chunk.Headers); headers.Add(new HttpHeader("Connection", "close")); chunk.Headers = headers.ToArray(); _closeConnection = true; } } } } } if (_removeChunked) { chunk.ChunkedEncoding = false; } chunk.WriteChunk(_writer); if (chunk.FinalChunk) { if (_closeConnection) { Dispose(); } } }
public override void Write(DataFrame data) { HttpResponseDataChunk chunk = data.Root.GetValue(DATA_NAME).Value; Write(chunk); }