Пример #1
0
        public override void Handle(ProxyRequest req)
        {
            HttpWebRequest hreq = null;

            this.CancelSource.Token.Register(() =>
            {
                try
                {
                    hreq.Abort();
                }
                catch
                {
                }
            });

            do
            {
                using (req)
                    using (var resp = new ProxyResponse(this.ProxyStream))
                    {
                        hreq = req.CreateRequest(null, true) as HttpWebRequest;
                        if (req.RequestBodyReader != null)
                        {
                            var hreqStream = hreq.GetRequestStream();
                            req.RequestBodyReader.CopyTo(hreqStream);
                        }

                        HttpWebResponse hresp = null;

                        try
                        {
                            hresp = hreq.GetResponse() as HttpWebResponse;
                        }
                        catch (WebException ex)
                        {
                            hresp = ex.Response as HttpWebResponse;
                        }
                        catch
                        {
                        }

                        if (hresp == null)
                        {
                            resp.StatusCode = HttpStatusCode.InternalServerError;

                            req.RequestBodyReader?.CopyTo(Stream.Null);
                        }
                        else
                        {
                            using (hresp)
                            {
                                if (req.KeepAlive)
                                {
                                    resp.Headers.Set(HttpResponseHeader.Connection, "Keep-Alive");
                                    resp.Headers.Set(HttpResponseHeader.KeepAlive, "timeout=30");
                                }

                                using (var hrespBody = hresp.GetResponseStream())
                                    resp.FromHttpWebResponse(hresp, hrespBody);
                            }
                        }

                        if (!req.KeepAlive)
                        {
                            break;
                        }
                    }
            } while (ProxyRequest.TryParse(this.ProxyStream, false, out req));
        }