Ejemplo n.º 1
0
            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;
                }
            }
        }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
            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;
                    }
                }
            }
Ejemplo n.º 5
0
            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();
                    }
                }
            }
Ejemplo n.º 6
0
            public override void Write(DataFrame data)
            {
                HttpResponseDataChunk chunk = data.Root.GetValue(DATA_NAME).Value;

                Write(chunk);
            }