Unverified Commit 94e3df95 authored by honfika's avatar honfika Committed by GitHub

Merge pull request #657 from justcoding121/master

fixes
parents e24f3cc7 3d6e72a0
...@@ -7,13 +7,13 @@ namespace Titanium.Web.Proxy.Compression ...@@ -7,13 +7,13 @@ namespace Titanium.Web.Proxy.Compression
{ {
public static HttpCompression CompressionNameToEnum(string name) public static HttpCompression CompressionNameToEnum(string name)
{ {
if (KnownHeaders.ContentEncodingGzip.Equals(name.AsSpan())) if (KnownHeaders.ContentEncodingGzip.Equals(name))
return HttpCompression.Gzip; return HttpCompression.Gzip;
if (KnownHeaders.ContentEncodingDeflate.Equals(name.AsSpan())) if (KnownHeaders.ContentEncodingDeflate.Equals(name))
return HttpCompression.Deflate; return HttpCompression.Deflate;
if (KnownHeaders.ContentEncodingBrotli.Equals(name.AsSpan())) if (KnownHeaders.ContentEncodingBrotli.Equals(name))
return HttpCompression.Brotli; return HttpCompression.Brotli;
return HttpCompression.Unsupported; return HttpCompression.Unsupported;
......
...@@ -47,7 +47,6 @@ namespace Titanium.Web.Proxy ...@@ -47,7 +47,6 @@ namespace Titanium.Web.Proxy
try try
{ {
string? connectHostname = null;
TunnelConnectSessionEventArgs? connectArgs = null; TunnelConnectSessionEventArgs? connectArgs = null;
// Client wants to create a secure tcp tunnel (probably its a HTTPS or Websocket request) // Client wants to create a secure tcp tunnel (probably its a HTTPS or Websocket request)
...@@ -62,14 +61,7 @@ namespace Titanium.Web.Proxy ...@@ -62,14 +61,7 @@ namespace Titanium.Web.Proxy
Request.ParseRequestLine(httpCmd!, out string _, out string httpUrl, out var version); Request.ParseRequestLine(httpCmd!, out string _, out string httpUrl, out var version);
connectHostname = httpUrl; var connectRequest = new ConnectRequest(httpUrl)
int idx = connectHostname.IndexOf(":");
if (idx >= 0)
{
connectHostname = connectHostname.Substring(0, idx);
}
var connectRequest = new ConnectRequest(connectHostname)
{ {
OriginalUrlData = HttpHeader.Encoding.GetBytes(httpUrl), OriginalUrlData = HttpHeader.Encoding.GetBytes(httpUrl),
HttpVersion = version HttpVersion = version
...@@ -130,7 +122,7 @@ namespace Titanium.Web.Proxy ...@@ -130,7 +122,7 @@ namespace Titanium.Web.Proxy
bool isClientHello = clientHelloInfo != null; bool isClientHello = clientHelloInfo != null;
if (clientHelloInfo != null) if (clientHelloInfo != null)
{ {
connectRequest.Scheme = ProxyServer.UriSchemeHttps; connectRequest.IsHttps = true;
connectRequest.TunnelType = TunnelType.Https; connectRequest.TunnelType = TunnelType.Https;
connectRequest.ClientHelloInfo = clientHelloInfo; connectRequest.ClientHelloInfo = clientHelloInfo;
} }
...@@ -186,6 +178,13 @@ namespace Titanium.Web.Proxy ...@@ -186,6 +178,13 @@ namespace Titanium.Web.Proxy
} }
} }
string connectHostname = httpUrl;
int idx = connectHostname.IndexOf(":");
if (idx >= 0)
{
connectHostname = connectHostname.Substring(0, idx);
}
X509Certificate2? certificate = null; X509Certificate2? certificate = null;
try try
{ {
......
...@@ -9,10 +9,10 @@ namespace Titanium.Web.Proxy.Http ...@@ -9,10 +9,10 @@ namespace Titanium.Web.Proxy.Http
/// </summary> /// </summary>
public class ConnectRequest : Request public class ConnectRequest : Request
{ {
public ConnectRequest(string hostname) public ConnectRequest(string authority)
{ {
Method = "CONNECT"; Method = "CONNECT";
Hostname = hostname; Authority = authority;
} }
public TunnelType TunnelType { get; internal set; } public TunnelType TunnelType { get; internal set; }
......
...@@ -121,6 +121,10 @@ namespace Titanium.Web.Proxy.Http ...@@ -121,6 +121,10 @@ namespace Titanium.Web.Proxy.Http
else else
{ {
url = Request.RequestUri.GetOriginalPathAndQuery(); url = Request.RequestUri.GetOriginalPathAndQuery();
if (url == string.Empty)
{
url = "/";
}
} }
var headerBuilder = new HeaderBuilder(); var headerBuilder = new HeaderBuilder();
......
...@@ -22,10 +22,10 @@ namespace Titanium.Web.Proxy.Http ...@@ -22,10 +22,10 @@ namespace Titanium.Web.Proxy.Http
/// <summary> /// <summary>
/// Is Https? /// Is Https?
/// </summary> /// </summary>
public bool IsHttps => RequestUri.Scheme == ProxyServer.UriSchemeHttps; public bool IsHttps { get; internal set; }
private ByteString originalUrlData; private ByteString originalUrlData;
private protected ByteString UrlData; private ByteString urlData;
internal ByteString OriginalUrlData internal ByteString OriginalUrlData
{ {
...@@ -37,9 +37,21 @@ namespace Titanium.Web.Proxy.Http ...@@ -37,9 +37,21 @@ namespace Titanium.Web.Proxy.Http
} }
} }
internal string Scheme { get; set; } = ProxyServer.UriSchemeHttp; private protected ByteString UrlData
{
get => urlData;
set
{
urlData = value;
var scheme = getUriScheme(UrlData);
if (scheme.Length > 0)
{
IsHttps = scheme.Equals(ProxyServer.UriSchemeHttps8);
}
}
}
internal string? Hostname { get; set; } internal string? Authority { get; set; }
/// <summary> /// <summary>
/// The original request Url. /// The original request Url.
...@@ -53,21 +65,21 @@ namespace Titanium.Web.Proxy.Http ...@@ -53,21 +65,21 @@ namespace Titanium.Web.Proxy.Http
{ {
get get
{ {
string url; string url = UrlData.GetString();
if (startsWithUriScheme(UrlData)) if (getUriScheme(UrlData).Length == 0)
{
url = UrlData.GetString();
}
else
{ {
string? host = Host ?? Hostname; string? hostAndPath = Host ?? Authority;
string? hostAndPath = host;
if (UrlData.Length > 0 && UrlData[0] == '/') if (url.StartsWith("/"))
{
hostAndPath += url;
}
else
{ {
hostAndPath += UrlData.GetString(); //throw new Exception($"Invalid URL: '{url}'");
} }
url = string.Concat(Scheme == ProxyServer.UriSchemeHttps ? "https://" : "http://", hostAndPath); url = string.Concat(IsHttps ? "https://" : "http://", hostAndPath);
} }
try try
...@@ -87,7 +99,16 @@ namespace Titanium.Web.Proxy.Http ...@@ -87,7 +99,16 @@ namespace Titanium.Web.Proxy.Http
public string Url public string Url
{ {
get => UrlData.GetString(); get => UrlData.GetString();
set => UrlData = value.GetByteString(); set
{
UrlData = value.GetByteString();
if (Host != null)
{
var uri = new Uri(value);
Host = uri.Authority;
}
}
} }
[Obsolete("This property is obsolete. Use Url property instead")] [Obsolete("This property is obsolete. Use Url property instead")]
...@@ -147,7 +168,7 @@ namespace Titanium.Web.Proxy.Http ...@@ -147,7 +168,7 @@ namespace Titanium.Web.Proxy.Http
get get
{ {
string? headerValue = Headers.GetHeaderValueOrNull(KnownHeaders.Expect); string? headerValue = Headers.GetHeaderValueOrNull(KnownHeaders.Expect);
return headerValue != null && headerValue.Equals(KnownHeaders.Expect100Continue); return KnownHeaders.Expect100Continue.Equals(headerValue);
} }
} }
...@@ -290,11 +311,11 @@ namespace Titanium.Web.Proxy.Http ...@@ -290,11 +311,11 @@ namespace Titanium.Web.Proxy.Http
return true; return true;
} }
private bool startsWithUriScheme(ByteString str) private ByteString getUriScheme(ByteString str)
{ {
if (str.Length < 3) if (str.Length < 3)
{ {
return false; return ByteString.Empty;
} }
// regex: "^[a-z]*://" // regex: "^[a-z]*://"
...@@ -310,26 +331,26 @@ namespace Titanium.Web.Proxy.Http ...@@ -310,26 +331,26 @@ namespace Titanium.Web.Proxy.Http
if (ch < 'A' || ch > 'z' || (ch > 'Z' && ch < 'a')) // ASCII letter if (ch < 'A' || ch > 'z' || (ch > 'Z' && ch < 'a')) // ASCII letter
{ {
return false; return ByteString.Empty;
} }
} }
if (str[i++] != ':') if (str[i++] != ':')
{ {
return false; return ByteString.Empty;
} }
if (str[i++] != '/') if (str[i++] != '/')
{ {
return false; return ByteString.Empty;
} }
if (str[i] != '/') if (str[i] != '/')
{ {
return false; return ByteString.Empty;
} }
return true; return new ByteString(str.Data.Slice(0, i - 2));
} }
} }
} }
...@@ -263,9 +263,9 @@ namespace Titanium.Web.Proxy.Http2 ...@@ -263,9 +263,9 @@ namespace Titanium.Web.Proxy.Http2
request.HttpVersion = HttpVersion.Version20; request.HttpVersion = HttpVersion.Version20;
request.Method = method.GetString(); request.Method = method.GetString();
request.IsHttps = headerListener.Scheme == ProxyServer.UriSchemeHttps;
request.Authority = headerListener.Authority.GetString();
request.OriginalUrlData = path; request.OriginalUrlData = path;
request.Scheme = headerListener.Scheme;
request.Hostname = headerListener.Authority.GetString();
//request.RequestUri = headerListener.GetUri(); //request.RequestUri = headerListener.GetUri();
} }
...@@ -468,9 +468,10 @@ namespace Titanium.Web.Proxy.Http2 ...@@ -468,9 +468,10 @@ namespace Titanium.Web.Proxy.Http2
if (rr is Request request) if (rr is Request request)
{ {
var uri = request.RequestUri;
encoder.EncodeHeader(writer, StaticTable.KnownHeaderMethod, request.Method.GetByteString()); encoder.EncodeHeader(writer, StaticTable.KnownHeaderMethod, request.Method.GetByteString());
encoder.EncodeHeader(writer, StaticTable.KnownHeaderAuhtority, request.RequestUri.Host.GetByteString()); encoder.EncodeHeader(writer, StaticTable.KnownHeaderAuhtority, uri.Authority.GetByteString());
encoder.EncodeHeader(writer, StaticTable.KnownHeaderScheme, request.RequestUri.Scheme.GetByteString()); encoder.EncodeHeader(writer, StaticTable.KnownHeaderScheme, uri.Scheme.GetByteString());
encoder.EncodeHeader(writer, StaticTable.KnownHeaderPath, request.Url.GetByteString(), false, encoder.EncodeHeader(writer, StaticTable.KnownHeaderPath, request.Url.GetByteString(), false,
HpackUtil.IndexType.None, false); HpackUtil.IndexType.None, false);
} }
...@@ -572,10 +573,6 @@ namespace Titanium.Web.Proxy.Http2 ...@@ -572,10 +573,6 @@ namespace Titanium.Web.Proxy.Http2
class MyHeaderListener : IHeaderListener class MyHeaderListener : IHeaderListener
{ {
private static ByteString SchemeHttp = (ByteString)ProxyServer.UriSchemeHttp;
private static ByteString SchemeHttps = (ByteString)ProxyServer.UriSchemeHttps;
private readonly Action<ByteString, ByteString> addHeaderFunc; private readonly Action<ByteString, ByteString> addHeaderFunc;
public ByteString Method { get; private set; } public ByteString Method { get; private set; }
...@@ -592,12 +589,12 @@ namespace Titanium.Web.Proxy.Http2 ...@@ -592,12 +589,12 @@ namespace Titanium.Web.Proxy.Http2
{ {
get get
{ {
if (scheme.Equals(SchemeHttp)) if (scheme.Equals(ProxyServer.UriSchemeHttp8))
{ {
return ProxyServer.UriSchemeHttp; return ProxyServer.UriSchemeHttp;
} }
if (scheme.Equals(SchemeHttps)) if (scheme.Equals(ProxyServer.UriSchemeHttps8))
{ {
return ProxyServer.UriSchemeHttps; return ProxyServer.UriSchemeHttps;
} }
......
using System.Net; using System.Diagnostics;
using System.Net;
using System.Threading.Tasks; using System.Threading.Tasks;
using Titanium.Web.Proxy.EventArguments; using Titanium.Web.Proxy.EventArguments;
using Titanium.Web.Proxy.Extensions; using Titanium.Web.Proxy.Extensions;
...@@ -9,6 +10,7 @@ namespace Titanium.Web.Proxy.Models ...@@ -9,6 +10,7 @@ namespace Titanium.Web.Proxy.Models
/// A proxy endpoint that the client is aware of. /// A proxy endpoint that the client is aware of.
/// So client application know that it is communicating with a proxy server. /// So client application know that it is communicating with a proxy server.
/// </summary> /// </summary>
[DebuggerDisplay("Explicit: {IpAddress}:{Port}")]
public class ExplicitProxyEndPoint : ProxyEndPoint public class ExplicitProxyEndPoint : ProxyEndPoint
{ {
/// <summary> /// <summary>
......
using System.Net; using System.Diagnostics;
using System.Net;
using System.Threading.Tasks; using System.Threading.Tasks;
using Titanium.Web.Proxy.EventArguments; using Titanium.Web.Proxy.EventArguments;
using Titanium.Web.Proxy.Extensions; using Titanium.Web.Proxy.Extensions;
...@@ -9,6 +10,7 @@ namespace Titanium.Web.Proxy.Models ...@@ -9,6 +10,7 @@ namespace Titanium.Web.Proxy.Models
/// A proxy end point client is not aware of. /// A proxy end point client is not aware of.
/// Useful when requests are redirected to this proxy end point through port forwarding via router. /// Useful when requests are redirected to this proxy end point through port forwarding via router.
/// </summary> /// </summary>
[DebuggerDisplay("Explicit: {IpAddress}:{Port}")]
public class TransparentProxyEndPoint : ProxyEndPoint public class TransparentProxyEndPoint : ProxyEndPoint
{ {
/// <summary> /// <summary>
......
...@@ -125,9 +125,10 @@ namespace Titanium.Web.Proxy.Network.Tcp ...@@ -125,9 +125,10 @@ namespace Titanium.Web.Proxy.Network.Tcp
session.CustomUpStreamProxyUsed = customUpStreamProxy; session.CustomUpStreamProxyUsed = customUpStreamProxy;
var uri = session.HttpClient.Request.RequestUri;
return GetConnectionCacheKey( return GetConnectionCacheKey(
session.HttpClient.Request.RequestUri.Host, uri.Host,
session.HttpClient.Request.RequestUri.Port, uri.Port,
isHttps, applicationProtocols, isHttps, applicationProtocols,
session.HttpClient.UpStreamEndPoint ?? server.UpStreamEndPoint, session.HttpClient.UpStreamEndPoint ?? server.UpStreamEndPoint,
customUpStreamProxy ?? (isHttps ? server.UpStreamHttpsProxy : server.UpStreamHttpProxy)); customUpStreamProxy ?? (isHttps ? server.UpStreamHttpsProxy : server.UpStreamHttpProxy));
...@@ -179,9 +180,10 @@ namespace Titanium.Web.Proxy.Network.Tcp ...@@ -179,9 +180,10 @@ namespace Titanium.Web.Proxy.Network.Tcp
session.CustomUpStreamProxyUsed = customUpStreamProxy; session.CustomUpStreamProxyUsed = customUpStreamProxy;
var uri = session.HttpClient.Request.RequestUri;
return await GetServerConnection( return await GetServerConnection(
session.HttpClient.Request.RequestUri.Host, uri.Host,
session.HttpClient.Request.RequestUri.Port, uri.Port,
session.HttpClient.Request.HttpVersion, session.HttpClient.Request.HttpVersion,
isHttps, applicationProtocols, isConnect, isHttps, applicationProtocols, isConnect,
server, session, session.HttpClient.UpStreamEndPoint ?? server.UpStreamEndPoint, server, session, session.HttpClient.UpStreamEndPoint ?? server.UpStreamEndPoint,
...@@ -372,9 +374,11 @@ namespace Titanium.Web.Proxy.Network.Tcp ...@@ -372,9 +374,11 @@ namespace Titanium.Web.Proxy.Network.Tcp
if (useUpstreamProxy && (isConnect || isHttps)) if (useUpstreamProxy && (isConnect || isHttps))
{ {
var writer = new HttpRequestWriter(stream, proxyServer.BufferPool); var writer = new HttpRequestWriter(stream, proxyServer.BufferPool);
var connectRequest = new ConnectRequest(remoteHostName) string authority = $"{remoteHostName}:{remotePort}";
var connectRequest = new ConnectRequest(authority)
{ {
OriginalUrlData = HttpHeader.Encoding.GetBytes($"{remoteHostName}:{remotePort}"), IsHttps = isHttps,
OriginalUrlData = HttpHeader.Encoding.GetBytes(authority),
HttpVersion = httpVersion HttpVersion = httpVersion
}; };
......
...@@ -32,6 +32,10 @@ namespace Titanium.Web.Proxy ...@@ -32,6 +32,10 @@ namespace Titanium.Web.Proxy
internal static readonly string UriSchemeHttp = Uri.UriSchemeHttp; internal static readonly string UriSchemeHttp = Uri.UriSchemeHttp;
internal static readonly string UriSchemeHttps = Uri.UriSchemeHttps; internal static readonly string UriSchemeHttps = Uri.UriSchemeHttps;
internal static ByteString UriSchemeHttp8 = (ByteString)UriSchemeHttp;
internal static ByteString UriSchemeHttps8 = (ByteString)UriSchemeHttps;
/// <summary> /// <summary>
/// A default exception log func. /// A default exception log func.
/// </summary> /// </summary>
......
...@@ -84,8 +84,8 @@ namespace Titanium.Web.Proxy ...@@ -84,8 +84,8 @@ namespace Titanium.Web.Proxy
var request = args.HttpClient.Request; var request = args.HttpClient.Request;
if (connectRequest != null) if (connectRequest != null)
{ {
request.Scheme = connectRequest.Scheme; request.IsHttps = connectRequest.IsHttps;
request.Hostname = connectRequest.Hostname; request.Authority = connectRequest.Authority;
} }
request.OriginalUrlData = HttpHeader.Encoding.GetBytes(httpUrl); request.OriginalUrlData = HttpHeader.Encoding.GetBytes(httpUrl);
......
...@@ -34,7 +34,7 @@ namespace Titanium.Web.Proxy.IntegrationTests.Helpers ...@@ -34,7 +34,7 @@ namespace Titanium.Web.Proxy.IntegrationTests.Helpers
var buffer = new byte[1024]; var buffer = new byte[1024];
var responseMsg = string.Empty; var responseMsg = string.Empty;
Response response = null; Response response;
while ((response = HttpMessageParsing.ParseResponse(responseMsg)) == null) while ((response = HttpMessageParsing.ParseResponse(responseMsg)) == null)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment