diff --git a/src/Titanium.Web.Proxy/Extensions/UriExtensions.cs b/src/Titanium.Web.Proxy/Extensions/UriExtensions.cs new file mode 100644 index 000000000..5003c622f --- /dev/null +++ b/src/Titanium.Web.Proxy/Extensions/UriExtensions.cs @@ -0,0 +1,16 @@ +using System; + +namespace Titanium.Web.Proxy.Extensions +{ + internal static class UriExtensions + { + internal static string GetOriginalPathAndQuery(this Uri uri) + { + string leftPart = uri.GetLeftPart(UriPartial.Authority); + if (uri.OriginalString.StartsWith(leftPart)) + return uri.OriginalString.Substring(leftPart.Length); + + return uri.IsWellFormedOriginalString() ? uri.PathAndQuery : uri.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped); + } + } +} diff --git a/src/Titanium.Web.Proxy/Http/HttpWebClient.cs b/src/Titanium.Web.Proxy/Http/HttpWebClient.cs index 1fba12e5c..92b18d858 100644 --- a/src/Titanium.Web.Proxy/Http/HttpWebClient.cs +++ b/src/Titanium.Web.Proxy/Http/HttpWebClient.cs @@ -104,8 +104,7 @@ internal async Task SendRequest(bool enable100ContinueBehaviour, bool isTranspar } else { - var uri = Request.RequestUri; - url = uri.IsWellFormedOriginalString() ? uri.PathAndQuery : uri.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped); + url = Request.RequestUri.GetOriginalPathAndQuery(); } // prepare the request & headers diff --git a/src/Titanium.Web.Proxy/Network/Tcp/TcpConnectionFactory.cs b/src/Titanium.Web.Proxy/Network/Tcp/TcpConnectionFactory.cs index 258513b0c..1548164c2 100644 --- a/src/Titanium.Web.Proxy/Network/Tcp/TcpConnectionFactory.cs +++ b/src/Titanium.Web.Proxy/Network/Tcp/TcpConnectionFactory.cs @@ -327,6 +327,9 @@ private async Task createServerConnection(string remoteHost { throw new Exception($"Could not establish connection to {hostname}", e); } + + // dispose the current TcpClient and try the next address + tcpClient?.Dispose(); } }