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; }
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 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); }
public Task WriteRequestAsync(SwitchboardRequest request) { return WriteRequestAsync(request, CancellationToken.None); }
public Task WriteRequestAsync(SwitchboardRequest request) { return(WriteRequestAsync(request, CancellationToken.None)); }