Unverified Commit 2b38dec9 authored by honfika's avatar honfika Committed by GitHub

Merge pull request #732 from justcoding121/master

stable
parents 82ac9634 fcb8301f
......@@ -128,7 +128,7 @@
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/new/master/apiSpec/new?filename=Titanium_Web_Proxy_Http_HttpWebClient_ConnectRequest.md&amp;value=---%0Auid%3A%20Titanium.Web.Proxy.Http.HttpWebClient.ConnectRequest%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">Improve this Doc</a>
</span>
<span class="small pull-right mobile-hide">
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/blob/master/src/Titanium.Web.Proxy/Http/HttpWebClient.cs/#L66">View Source</a>
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/blob/master/src/Titanium.Web.Proxy/Http/HttpWebClient.cs/#L67">View Source</a>
</span>
<a id="Titanium_Web_Proxy_Http_HttpWebClient_ConnectRequest_" data-uid="Titanium.Web.Proxy.Http.HttpWebClient.ConnectRequest*"></a>
<h4 id="Titanium_Web_Proxy_Http_HttpWebClient_ConnectRequest" data-uid="Titanium.Web.Proxy.Http.HttpWebClient.ConnectRequest">ConnectRequest</h4>
......@@ -159,7 +159,7 @@
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/new/master/apiSpec/new?filename=Titanium_Web_Proxy_Http_HttpWebClient_IsHttps.md&amp;value=---%0Auid%3A%20Titanium.Web.Proxy.Http.HttpWebClient.IsHttps%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">Improve this Doc</a>
</span>
<span class="small pull-right mobile-hide">
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/blob/master/src/Titanium.Web.Proxy/Http/HttpWebClient.cs/#L87">View Source</a>
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/blob/master/src/Titanium.Web.Proxy/Http/HttpWebClient.cs/#L88">View Source</a>
</span>
<a id="Titanium_Web_Proxy_Http_HttpWebClient_IsHttps_" data-uid="Titanium.Web.Proxy.Http.HttpWebClient.IsHttps*"></a>
<h4 id="Titanium_Web_Proxy_Http_HttpWebClient_IsHttps" data-uid="Titanium.Web.Proxy.Http.HttpWebClient.IsHttps">IsHttps</h4>
......@@ -190,7 +190,7 @@
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/new/master/apiSpec/new?filename=Titanium_Web_Proxy_Http_HttpWebClient_ProcessId.md&amp;value=---%0Auid%3A%20Titanium.Web.Proxy.Http.HttpWebClient.ProcessId%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">Improve this Doc</a>
</span>
<span class="small pull-right mobile-hide">
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/blob/master/src/Titanium.Web.Proxy/Http/HttpWebClient.cs/#L82">View Source</a>
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/blob/master/src/Titanium.Web.Proxy/Http/HttpWebClient.cs/#L83">View Source</a>
</span>
<a id="Titanium_Web_Proxy_Http_HttpWebClient_ProcessId_" data-uid="Titanium.Web.Proxy.Http.HttpWebClient.ProcessId*"></a>
<h4 id="Titanium_Web_Proxy_Http_HttpWebClient_ProcessId" data-uid="Titanium.Web.Proxy.Http.HttpWebClient.ProcessId">ProcessId</h4>
......@@ -222,7 +222,7 @@ If client is remote then this will return</p>
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/new/master/apiSpec/new?filename=Titanium_Web_Proxy_Http_HttpWebClient_Request.md&amp;value=---%0Auid%3A%20Titanium.Web.Proxy.Http.HttpWebClient.Request%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">Improve this Doc</a>
</span>
<span class="small pull-right mobile-hide">
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/blob/master/src/Titanium.Web.Proxy/Http/HttpWebClient.cs/#L71">View Source</a>
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/blob/master/src/Titanium.Web.Proxy/Http/HttpWebClient.cs/#L72">View Source</a>
</span>
<a id="Titanium_Web_Proxy_Http_HttpWebClient_Request_" data-uid="Titanium.Web.Proxy.Http.HttpWebClient.Request*"></a>
<h4 id="Titanium_Web_Proxy_Http_HttpWebClient_Request" data-uid="Titanium.Web.Proxy.Http.HttpWebClient.Request">Request</h4>
......@@ -253,7 +253,7 @@ If client is remote then this will return</p>
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/new/master/apiSpec/new?filename=Titanium_Web_Proxy_Http_HttpWebClient_Response.md&amp;value=---%0Auid%3A%20Titanium.Web.Proxy.Http.HttpWebClient.Response%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">Improve this Doc</a>
</span>
<span class="small pull-right mobile-hide">
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/blob/master/src/Titanium.Web.Proxy/Http/HttpWebClient.cs/#L76">View Source</a>
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/blob/master/src/Titanium.Web.Proxy/Http/HttpWebClient.cs/#L77">View Source</a>
</span>
<a id="Titanium_Web_Proxy_Http_HttpWebClient_Response_" data-uid="Titanium.Web.Proxy.Http.HttpWebClient.Response*"></a>
<h4 id="Titanium_Web_Proxy_Http_HttpWebClient_Response" data-uid="Titanium.Web.Proxy.Http.HttpWebClient.Response">Response</h4>
......@@ -284,7 +284,7 @@ If client is remote then this will return</p>
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/new/master/apiSpec/new?filename=Titanium_Web_Proxy_Http_HttpWebClient_UpStreamEndPoint.md&amp;value=---%0Auid%3A%20Titanium.Web.Proxy.Http.HttpWebClient.UpStreamEndPoint%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">Improve this Doc</a>
</span>
<span class="small pull-right mobile-hide">
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/blob/master/src/Titanium.Web.Proxy/Http/HttpWebClient.cs/#L61">View Source</a>
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/blob/master/src/Titanium.Web.Proxy/Http/HttpWebClient.cs/#L62">View Source</a>
</span>
<a id="Titanium_Web_Proxy_Http_HttpWebClient_UpStreamEndPoint_" data-uid="Titanium.Web.Proxy.Http.HttpWebClient.UpStreamEndPoint*"></a>
<h4 id="Titanium_Web_Proxy_Http_HttpWebClient_UpStreamEndPoint" data-uid="Titanium.Web.Proxy.Http.HttpWebClient.UpStreamEndPoint">UpStreamEndPoint</h4>
......@@ -315,7 +315,7 @@ If client is remote then this will return</p>
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/new/master/apiSpec/new?filename=Titanium_Web_Proxy_Http_HttpWebClient_UserData.md&amp;value=---%0Auid%3A%20Titanium.Web.Proxy.Http.HttpWebClient.UserData%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">Improve this Doc</a>
</span>
<span class="small pull-right mobile-hide">
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/blob/master/src/Titanium.Web.Proxy/Http/HttpWebClient.cs/#L56">View Source</a>
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/blob/master/src/Titanium.Web.Proxy/Http/HttpWebClient.cs/#L57">View Source</a>
</span>
<a id="Titanium_Web_Proxy_Http_HttpWebClient_UserData_" data-uid="Titanium.Web.Proxy.Http.HttpWebClient.UserData*"></a>
<h4 id="Titanium_Web_Proxy_Http_HttpWebClient_UserData" data-uid="Titanium.Web.Proxy.Http.HttpWebClient.UserData">UserData</h4>
......@@ -352,7 +352,7 @@ If client is remote then this will return</p>
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/new/master/apiSpec/new?filename=Titanium_Web_Proxy_Http_HttpWebClient.md&amp;value=---%0Auid%3A%20Titanium.Web.Proxy.Http.HttpWebClient%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A" class="contribution-link">Improve this Doc</a>
</li>
<li>
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/blob/master/src/Titanium.Web.Proxy/Http/HttpWebClient.cs/#L13" class="contribution-link">View Source</a>
<a href="https://github.com/justcoding121/Titanium-Web-Proxy/blob/master/src/Titanium.Web.Proxy/Http/HttpWebClient.cs/#L14" class="contribution-link">View Source</a>
</li>
</ul>
</div>
......
......@@ -103,7 +103,7 @@ namespace Titanium.Web.Proxy
}
// write back successful CONNECT response
var response = ConnectResponse.CreateSuccessfulConnectResponse(requestLine.Version);
var response = ConnectResponse.CreateSuccessfulConnectResponse(connectRequest.HttpVersion);
// Set ContentLength explicitly to properly handle HTTP 1.0
response.ContentLength = 0;
......
using System;
using Titanium.Web.Proxy.Models;
namespace Titanium.Web.Proxy.Extensions
{
internal static class UriExtensions
{
internal static string GetOriginalPathAndQuery(this Uri uri)
public static string GetOriginalPathAndQuery(this Uri uri)
{
string leftPart = uri.GetLeftPart(UriPartial.Authority);
if (uri.OriginalString.StartsWith(leftPart))
......@@ -12,5 +13,47 @@ namespace Titanium.Web.Proxy.Extensions
return uri.IsWellFormedOriginalString() ? uri.PathAndQuery : uri.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
}
public static ByteString GetScheme(ByteString str)
{
if (str.Length < 3)
{
return ByteString.Empty;
}
// regex: "^[a-z]*://"
int i;
for (i = 0; i < str.Length - 3; i++)
{
byte ch = str[i];
if (ch == ':')
{
break;
}
if (ch < 'A' || ch > 'z' || (ch > 'Z' && ch < 'a')) // ASCII letter
{
return ByteString.Empty;
}
}
if (str[i++] != ':')
{
return ByteString.Empty;
}
if (str[i++] != '/')
{
return ByteString.Empty;
}
if (str[i] != '/')
{
return ByteString.Empty;
}
return new ByteString(str.Data.Slice(0, i - 2));
}
}
}
......@@ -2,6 +2,7 @@
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using Titanium.Web.Proxy.Extensions;
using Titanium.Web.Proxy.Models;
using Titanium.Web.Proxy.Network.Tcp;
......@@ -113,10 +114,21 @@ namespace Titanium.Web.Proxy.Http
string? upstreamProxyPassword = null;
string url;
if (!useUpstreamProxy || isTransparent)
if (isTransparent)
{
url = Request.RequestUriString;
}
else if (!useUpstreamProxy)
{
if (UriExtensions.GetScheme(Request.RequestUriString8).Length == 0)
{
url = Request.RequestUriString;
}
else
{
url = Request.RequestUri.GetOriginalPathAndQuery();
}
}
else
{
url = Request.RequestUri.ToString();
......@@ -129,6 +141,11 @@ namespace Titanium.Web.Proxy.Http
}
}
if (url == string.Empty)
{
url = "/";
}
// prepare the request & headers
var headerBuilder = new HeaderBuilder();
headerBuilder.WriteRequestLine(Request.Method, url, Request.HttpVersion);
......
......@@ -30,7 +30,7 @@ namespace Titanium.Web.Proxy.Http
set
{
requestUriString8 = value;
var scheme = getUriScheme(value);
var scheme = UriExtensions.GetScheme(value);
if (scheme.Length > 0)
{
IsHttps = scheme.Equals(ProxyServer.UriSchemeHttps8);
......@@ -71,7 +71,7 @@ namespace Titanium.Web.Proxy.Http
get
{
string url = RequestUriString8.GetString();
if (getUriScheme(RequestUriString8).Length == 0)
if (UriExtensions.GetScheme(RequestUriString8).Length == 0)
{
string? hostAndPath = Host ?? Authority.GetString();
......@@ -105,7 +105,7 @@ namespace Titanium.Web.Proxy.Http
{
RequestUriString8 = (ByteString)value;
var scheme = getUriScheme(RequestUriString8);
var scheme = UriExtensions.GetScheme(RequestUriString8);
if (scheme.Length > 0 && Host != null)
{
var uri = new Uri(value);
......@@ -307,47 +307,5 @@ namespace Titanium.Web.Proxy.Http
return true;
}
private ByteString getUriScheme(ByteString str)
{
if (str.Length < 3)
{
return ByteString.Empty;
}
// regex: "^[a-z]*://"
int i;
for (i = 0; i < str.Length - 3; i++)
{
byte ch = str[i];
if (ch == ':')
{
break;
}
if (ch < 'A' || ch > 'z' || (ch > 'Z' && ch < 'a')) // ASCII letter
{
return ByteString.Empty;
}
}
if (str[i++] != ':')
{
return ByteString.Empty;
}
if (str[i++] != '/')
{
return ByteString.Empty;
}
if (str[i] != '/')
{
return ByteString.Empty;
}
return new ByteString(str.Data.Slice(0, i - 2));
}
}
}
......@@ -30,14 +30,14 @@ namespace Titanium.Web.Proxy.Network
/// <inheritdoc />
public X509Certificate2? LoadCertificate(string subjectName, X509KeyStorageFlags storageFlags)
{
string path = Path.Combine(getCertificatePath(), subjectName + defaultCertificateFileExtension);
return loadCertificate(path, string.Empty, storageFlags);
string filePath = Path.Combine(getCertificatePath(false), subjectName + defaultCertificateFileExtension);
return loadCertificate(filePath, string.Empty, storageFlags);
}
/// <inheritdoc />
public void SaveCertificate(string subjectName, X509Certificate2 certificate)
{
string filePath = Path.Combine(getCertificatePath(), subjectName + defaultCertificateFileExtension);
string filePath = Path.Combine(getCertificatePath(true), subjectName + defaultCertificateFileExtension);
byte[] exported = certificate.Export(X509ContentType.Pkcs12);
File.WriteAllBytes(filePath, exported);
}
......@@ -46,9 +46,13 @@ namespace Titanium.Web.Proxy.Network
{
try
{
Directory.Delete(getCertificatePath(), true);
string path = getCertificatePath(false);
if (Directory.Exists(path))
{
Directory.Delete(path, true);
}
}
catch (DirectoryNotFoundException)
catch (Exception)
{
// do nothing
}
......@@ -89,14 +93,14 @@ namespace Titanium.Web.Proxy.Network
string.IsNullOrEmpty(pathOrName) ? defaultRootCertificateFileName : pathOrName);
}
private string getCertificatePath()
private string getCertificatePath(bool create)
{
if (certificatePath == null)
{
string path = getRootCertificateDirectory();
string certPath = Path.Combine(path, defaultCertificateDirectoryName);
if (!Directory.Exists(certPath))
if (create && !Directory.Exists(certPath))
{
Directory.CreateDirectory(certPath);
}
......
......@@ -439,7 +439,7 @@ namespace Titanium.Web.Proxy
if (systemProxySettingsManager == null)
{
throw new NotSupportedException(@"Setting system proxy settings are only supported in Windows.
Please manually confugure you operating system to use this proxy's port and address.");
Please manually configure you operating system to use this proxy's port and address.");
}
validateEndPointAsSystemProxy(endPoint);
......
......@@ -68,9 +68,10 @@ namespace Titanium.Web.Proxy
UserData = connectArgs?.UserData
};
var request = args.HttpClient.Request;
if (isHttps)
{
args.HttpClient.Request.IsHttps = true;
request.IsHttps = true;
}
try
......@@ -81,7 +82,6 @@ namespace Titanium.Web.Proxy
await HeaderParser.ReadHeaders(clientStream, args.HttpClient.Request.Headers,
cancellationToken);
var request = args.HttpClient.Request;
if (connectRequest != null)
{
request.IsHttps = connectRequest.IsHttps;
......@@ -93,6 +93,12 @@ namespace Titanium.Web.Proxy
request.Method = requestLine.Method;
request.HttpVersion = requestLine.Version;
// we need this to syphon out data from connection if API user changes them.
request.SetOriginalHeaders();
// If user requested interception do it
await onBeforeRequest(args);
if (!args.IsTransparent && !args.IsSocks)
{
// proxy authorization check
......@@ -117,12 +123,6 @@ namespace Titanium.Web.Proxy
await args.GetRequestBody(cancellationToken);
}
// we need this to syphon out data from connection if API user changes them.
request.SetOriginalHeaders();
// If user requested interception do it
await onBeforeRequest(args);
var response = args.HttpClient.Response;
if (request.CancelRequest)
......
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