private void SetForwardedForHeader(SwitchboardContext context, SwitchboardRequest request)
        {
            string remoteAddress       = context.InboundConnection.RemoteEndPoint.Address.ToString();
            string currentForwardedFor = request.Headers["X-Forwarded-For"];

            request.Headers["X-Forwarded-For"] = string.IsNullOrEmpty(currentForwardedFor) ? remoteAddress : currentForwardedFor + ", " + remoteAddress;
        }
예제 #2
0
        public async Task WriteRequestAsync(SwitchboardRequest request, CancellationToken ct)
        {
            var writeStream = this.GetWriteStream();

            var ms = new MemoryStream();
            var sw = new StreamWriter(ms, headerEncoding);

            sw.NewLine = "\r\n";
            sw.WriteLine("{0} {1} HTTP/1.{2}", request.Method, request.RequestUri, request.ProtocolVersion.Minor);

            for (int i = 0; i < request.Headers.Count; i++)
                sw.WriteLine("{0}: {1}", request.Headers.GetKey(i), request.Headers.Get(i));

            sw.WriteLine();
            sw.Flush();

            await writeStream.WriteAsync(ms.GetBuffer(), 0, (int)ms.Length)
                .ConfigureAwait(continueOnCapturedContext: false);

            if (request.RequestBody != null)
            {
                await request.RequestBody.CopyToAsync(writeStream)
                    .ConfigureAwait(continueOnCapturedContext: false);
            }

            await writeStream.FlushAsync()
                .ConfigureAwait(continueOnCapturedContext: false);
        }
예제 #3
0
        public async Task WriteRequestAsync(SwitchboardRequest request, CancellationToken ct)
        {
            var writeStream = this.GetWriteStream();

            var ms = new MemoryStream();
            var sw = new StreamWriter(ms, headerEncoding);

            sw.NewLine = "\r\n";
            sw.WriteLine("{0} {1} HTTP/1.{2}", request.Method, request.RequestUri, request.ProtocolVersion.Minor);

            for (int i = 0; i < request.Headers.Count; i++)
            {
                sw.WriteLine("{0}: {1}", request.Headers.GetKey(i), request.Headers.Get(i));
            }

            sw.WriteLine();
            sw.Flush();

            await writeStream.WriteAsync(ms.GetBuffer(), 0, (int)ms.Length)
            .ConfigureAwait(continueOnCapturedContext: false);

            if (request.RequestBody != null)
            {
                await request.RequestBody.CopyToAsync(writeStream)
                .ConfigureAwait(continueOnCapturedContext: false);
            }

            await writeStream.FlushAsync()
            .ConfigureAwait(continueOnCapturedContext: false);
        }
        public async Task <SwitchboardResponse> GetResponseAsync(SwitchboardContext context, SwitchboardRequest request)
        {
            var originalHost = request.Headers["Host"];

            if (this.RewriteHost)
            {
                request.Headers["Host"] = this.backendUri.Host + (this.backendUri.IsDefaultPort ? string.Empty : ":" + this.backendUri.Port);
            }

            if (this.AddForwardedForHeader)
            {
                SetForwardedForHeader(context, request);
            }

            var sw = Stopwatch.StartNew();

            IPAddress ip;

            if (this.backendUri.HostNameType == UriHostNameType.IPv4)
            {
                ip = IPAddress.Parse(this.backendUri.Host);
            }
            else
            {
                var ipAddresses = await Dns.GetHostAddressesAsync(this.backendUri.Host);

                ip = ipAddresses[0];
            }

            var backendEp = new IPEndPoint(ip, this.backendUri.Port);

            Debug.WriteLine("{0}: Resolved upstream server to {1} in {2}ms, opening connection", context.InboundConnection.RemoteEndPoint, backendEp, sw.Elapsed.TotalMilliseconds);

            if (this.backendUri.Scheme != "https")
            {
                await context.OpenOutboundConnectionAsync(backendEp);
            }
            else
            {
                await context.OpenSecureOutboundConnectionAsync(backendEp, this.backendUri.Host);
            }

            Debug.WriteLine("{0}: Outbound connection established, sending request", context.InboundConnection.RemoteEndPoint);
            sw.Restart();
            await context.OutboundConnection.WriteRequestAsync(request, cancellationTokenSource.Token);

            Debug.WriteLine("{0}: Handler sent request in {1}ms", context.InboundConnection.RemoteEndPoint, sw.Elapsed.TotalMilliseconds);

            var response = await context.OutboundConnection.ReadResponseAsync();

            return(response);
        }
예제 #5
0
 public Task WriteRequestAsync(SwitchboardRequest request)
 {
     return WriteRequestAsync(request, CancellationToken.None);
 }
예제 #6
0
 public Task WriteRequestAsync(SwitchboardRequest request)
 {
     return(WriteRequestAsync(request, CancellationToken.None));
 }