Unverified Commit 4477f6de authored by honfika's avatar honfika Committed by GitHub

Merge pull request #377 from justcoding121/develop

Beta
parents 63ce4b3d 80de6eac
...@@ -96,7 +96,9 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -96,7 +96,9 @@ namespace Titanium.Web.Proxy.EventArguments
/// </summary> /// </summary>
public event EventHandler<MultipartRequestPartSentEventArgs> MultipartRequestPartSent; public event EventHandler<MultipartRequestPartSentEventArgs> MultipartRequestPartSent;
public ProxyEndPoint LocalEndPoint; public ProxyEndPoint LocalEndPoint { get; }
public bool IsTransparent => LocalEndPoint is TransparentProxyEndPoint;
/// <summary> /// <summary>
/// Constructor to initialize the proxy /// Constructor to initialize the proxy
......
...@@ -20,7 +20,6 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -20,7 +20,6 @@ namespace Titanium.Web.Proxy.Helpers
public async Task WriteResponseAsync(Response response, bool flush = true) public async Task WriteResponseAsync(Response response, bool flush = true)
{ {
await WriteResponseStatusAsync(response.HttpVersion, response.StatusCode, response.StatusDescription); await WriteResponseStatusAsync(response.HttpVersion, response.StatusCode, response.StatusDescription);
response.Headers.FixProxyHeaders();
await WriteHeadersAsync(response.Headers, flush); await WriteHeadersAsync(response.Headers, flush);
} }
......
...@@ -79,7 +79,7 @@ namespace Titanium.Web.Proxy.Http ...@@ -79,7 +79,7 @@ namespace Titanium.Web.Proxy.Http
/// Prepare and send the http(s) request /// Prepare and send the http(s) request
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
internal async Task SendRequest(bool enable100ContinueBehaviour) internal async Task SendRequest(bool enable100ContinueBehaviour, bool isTransparent)
{ {
var upstreamProxy = ServerConnection.UpStreamProxy; var upstreamProxy = ServerConnection.UpStreamProxy;
...@@ -89,12 +89,12 @@ namespace Titanium.Web.Proxy.Http ...@@ -89,12 +89,12 @@ namespace Titanium.Web.Proxy.Http
//prepare the request & headers //prepare the request & headers
await writer.WriteLineAsync(Request.CreateRequestLine(Request.Method, await writer.WriteLineAsync(Request.CreateRequestLine(Request.Method,
useUpstreamProxy ? Request.OriginalUrl : Request.RequestUri.PathAndQuery, useUpstreamProxy || isTransparent ? Request.OriginalUrl : Request.RequestUri.PathAndQuery,
Request.HttpVersion)); Request.HttpVersion));
//Send Authentication to Upstream proxy if needed //Send Authentication to Upstream proxy if needed
if (upstreamProxy != null if (!isTransparent && upstreamProxy != null
&& ServerConnection.IsHttps == false && ServerConnection.IsHttps == false
&& !string.IsNullOrEmpty(upstreamProxy.UserName) && !string.IsNullOrEmpty(upstreamProxy.UserName)
&& upstreamProxy.Password != null) && upstreamProxy.Password != null)
...@@ -106,7 +106,7 @@ namespace Titanium.Web.Proxy.Http ...@@ -106,7 +106,7 @@ namespace Titanium.Web.Proxy.Http
//write request headers //write request headers
foreach (var header in Request.Headers) foreach (var header in Request.Headers)
{ {
if (header.Name != KnownHeaders.ProxyAuthorization) if (isTransparent || header.Name != KnownHeaders.ProxyAuthorization)
{ {
await header.WriteToStreamAsync(writer); await header.WriteToStreamAsync(writer);
} }
......
...@@ -76,6 +76,7 @@ namespace Titanium.Web.Proxy ...@@ -76,6 +76,7 @@ namespace Titanium.Web.Proxy
response.Headers.AddHeader(KnownHeaders.ProxyAuthenticate, $"Basic realm=\"{ProxyRealm}\""); response.Headers.AddHeader(KnownHeaders.ProxyAuthenticate, $"Basic realm=\"{ProxyRealm}\"");
response.Headers.AddHeader(KnownHeaders.ProxyConnection, KnownHeaders.ProxyConnectionClose); response.Headers.AddHeader(KnownHeaders.ProxyConnection, KnownHeaders.ProxyConnectionClose);
response.Headers.FixProxyHeaders();
await clientStreamWriter.WriteResponseAsync(response); await clientStreamWriter.WriteResponseAsync(response);
return response; return response;
} }
......
...@@ -106,8 +106,11 @@ namespace Titanium.Web.Proxy ...@@ -106,8 +106,11 @@ namespace Titanium.Web.Proxy
} }
//write back successfull CONNECT response //write back successfull CONNECT response
connectArgs.WebSession.Response = ConnectResponse.CreateSuccessfullConnectResponse(version); var response = ConnectResponse.CreateSuccessfullConnectResponse(version);
await clientStreamWriter.WriteResponseAsync(connectArgs.WebSession.Response); response.Headers.FixProxyHeaders();
connectArgs.WebSession.Response = response;
await clientStreamWriter.WriteResponseAsync(response);
var clientHelloInfo = await SslTools.PeekClientHello(clientStream); var clientHelloInfo = await SslTools.PeekClientHello(clientStream);
bool isClientHello = clientHelloInfo != null; bool isClientHello = clientHelloInfo != null;
...@@ -401,14 +404,14 @@ namespace Titanium.Web.Proxy ...@@ -401,14 +404,14 @@ namespace Titanium.Web.Proxy
args.ProxyClient.ClientStreamWriter = clientStreamWriter; args.ProxyClient.ClientStreamWriter = clientStreamWriter;
//proxy authorization check //proxy authorization check
if (httpsConnectHostname == null && await CheckAuthorization(clientStreamWriter, args) == false) if (!args.IsTransparent && httpsConnectHostname == null && await CheckAuthorization(clientStreamWriter, args) == false)
{ {
break; break;
} }
PrepareRequestHeaders(args.WebSession.Request.Headers);
if (!isTransparentEndPoint) if (!isTransparentEndPoint)
{ {
PrepareRequestHeaders(args.WebSession.Request.Headers);
args.WebSession.Request.Host = args.WebSession.Request.RequestUri.Authority; args.WebSession.Request.Host = args.WebSession.Request.RequestUri.Authority;
} }
...@@ -426,10 +429,18 @@ namespace Titanium.Web.Proxy ...@@ -426,10 +429,18 @@ namespace Titanium.Web.Proxy
await BeforeRequest.InvokeAsync(this, args, ExceptionFunc); await BeforeRequest.InvokeAsync(this, args, ExceptionFunc);
} }
var response = args.WebSession.Response;
if (args.WebSession.Request.CancelRequest) if (args.WebSession.Request.CancelRequest)
{ {
await HandleHttpSessionResponse(args); await HandleHttpSessionResponse(args);
break;
if (!response.KeepAlive)
{
break;
}
continue;
} }
//create a new connection if hostname/upstream end point changes //create a new connection if hostname/upstream end point changes
...@@ -457,13 +468,16 @@ namespace Titanium.Web.Proxy ...@@ -457,13 +468,16 @@ namespace Titanium.Web.Proxy
string httpStatus = await connection.StreamReader.ReadLineAsync(); string httpStatus = await connection.StreamReader.ReadLineAsync();
Response.ParseResponseLine(httpStatus, out var responseVersion, out int responseStatusCode, out string responseStatusDescription); Response.ParseResponseLine(httpStatus, out var responseVersion, out int responseStatusCode, out string responseStatusDescription);
args.WebSession.Response.HttpVersion = responseVersion; response.HttpVersion = responseVersion;
args.WebSession.Response.StatusCode = responseStatusCode; response.StatusCode = responseStatusCode;
args.WebSession.Response.StatusDescription = responseStatusDescription; response.StatusDescription = responseStatusDescription;
await HeaderParser.ReadHeaders(connection.StreamReader, args.WebSession.Response.Headers); await HeaderParser.ReadHeaders(connection.StreamReader, response.Headers);
await clientStreamWriter.WriteResponseAsync(args.WebSession.Response); if (!args.IsTransparent)
{
await clientStreamWriter.WriteResponseAsync(response);
}
//If user requested call back then do it //If user requested call back then do it
if (BeforeResponse != null && !args.WebSession.Response.ResponseLocked) if (BeforeResponse != null && !args.WebSession.Response.ResponseLocked)
...@@ -483,7 +497,7 @@ namespace Titanium.Web.Proxy ...@@ -483,7 +497,7 @@ namespace Titanium.Web.Proxy
await HandleHttpSessionRequestInternal(connection, args); await HandleHttpSessionRequestInternal(connection, args);
//if connection is closing exit //if connection is closing exit
if (args.WebSession.Response.KeepAlive == false) if (!response.KeepAlive)
{ {
break; break;
} }
...@@ -522,7 +536,7 @@ namespace Titanium.Web.Proxy ...@@ -522,7 +536,7 @@ namespace Titanium.Web.Proxy
if (request.ExpectContinue) if (request.ExpectContinue)
{ {
args.WebSession.SetConnection(connection); args.WebSession.SetConnection(connection);
await args.WebSession.SendRequest(Enable100ContinueBehaviour); await args.WebSession.SendRequest(Enable100ContinueBehaviour, args.IsTransparent);
} }
//If 100 continue was the response inform that to the client //If 100 continue was the response inform that to the client
...@@ -546,7 +560,7 @@ namespace Titanium.Web.Proxy ...@@ -546,7 +560,7 @@ namespace Titanium.Web.Proxy
if (!request.ExpectContinue) if (!request.ExpectContinue)
{ {
args.WebSession.SetConnection(connection); args.WebSession.SetConnection(connection);
await args.WebSession.SendRequest(Enable100ContinueBehaviour); await args.WebSession.SendRequest(Enable100ContinueBehaviour, args.IsTransparent);
} }
//check if content-length is > 0 //check if content-length is > 0
......
...@@ -70,7 +70,11 @@ namespace Titanium.Web.Proxy ...@@ -70,7 +70,11 @@ namespace Titanium.Web.Proxy
//Write back response status to client //Write back response status to client
await clientStreamWriter.WriteResponseStatusAsync(response.HttpVersion, response.StatusCode, response.StatusDescription); await clientStreamWriter.WriteResponseStatusAsync(response.HttpVersion, response.StatusCode, response.StatusDescription);
response.Headers.FixProxyHeaders(); if (!args.IsTransparent)
{
response.Headers.FixProxyHeaders();
}
if (response.IsBodyRead) if (response.IsBodyRead)
{ {
bool isChunked = response.IsChunked; bool isChunked = response.IsChunked;
......
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