Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
T
Titanium-Web-Proxy
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Titanium-Web-Proxy
Commits
17abd9b8
Unverified
Commit
17abd9b8
authored
Dec 24, 2019
by
honfika
Committed by
GitHub
Dec 24, 2019
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #711 from justcoding121/master
stable
parents
30b18236
d21ea354
Hide whitespace changes
Inline
Side-by-side
Showing
33 changed files
with
213 additions
and
139 deletions
+213
-139
launch.json
.vscode/launch.json
+2
-2
ProxyTestController.cs
.../Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs
+11
-0
Titanium.Web.Proxy.Examples.Basic.NetCore.csproj
...es.Basic/Titanium.Web.Proxy.Examples.Basic.NetCore.csproj
+1
-1
Titanium.Web.Proxy.Examples.Basic.csproj
...y.Examples.Basic/Titanium.Web.Proxy.Examples.Basic.csproj
+1
-1
Titanium.Web.Proxy.Examples.WindowsService.csproj
...Service/Titanium.Web.Proxy.Examples.WindowsService.csproj
+3
-3
MainWindow.xaml
examples/Titanium.Web.Proxy.Examples.Wpf/MainWindow.xaml
+1
-1
MainWindow.xaml.cs
examples/Titanium.Web.Proxy.Examples.Wpf/MainWindow.xaml.cs
+2
-1
SessionListItem.cs
examples/Titanium.Web.Proxy.Examples.Wpf/SessionListItem.cs
+3
-1
Titanium.Web.Proxy.Examples.Wpf.NetCore.csproj
...amples.Wpf/Titanium.Web.Proxy.Examples.Wpf.NetCore.csproj
+1
-1
Titanium.Web.Proxy.Examples.Wpf.csproj
...Proxy.Examples.Wpf/Titanium.Web.Proxy.Examples.Wpf.csproj
+1
-1
EmptyProxyEventArgs.cs
src/Titanium.Web.Proxy/EventArguments/EmptyProxyEventArgs.cs
+12
-0
SessionEventArgs.cs
src/Titanium.Web.Proxy/EventArguments/SessionEventArgs.cs
+3
-3
SessionEventArgsBase.cs
...Titanium.Web.Proxy/EventArguments/SessionEventArgsBase.cs
+24
-5
ExplicitClientHandler.cs
src/Titanium.Web.Proxy/ExplicitClientHandler.cs
+12
-10
StreamExtensions.cs
src/Titanium.Web.Proxy/Extensions/StreamExtensions.cs
+3
-3
HttpClientStream.cs
src/Titanium.Web.Proxy/Helpers/HttpClientStream.cs
+2
-2
HttpServerStream.cs
src/Titanium.Web.Proxy/Helpers/HttpServerStream.cs
+2
-2
HttpStream.cs
src/Titanium.Web.Proxy/Helpers/HttpStream.cs
+36
-22
NullWriter.cs
src/Titanium.Web.Proxy/Helpers/NullWriter.cs
+4
-0
WinHttpWebProxyFinder.cs
...tanium.Web.Proxy/Helpers/WinHttp/WinHttpWebProxyFinder.cs
+2
-11
HttpWebClient.cs
src/Titanium.Web.Proxy/Http/HttpWebClient.cs
+2
-0
Response.cs
src/Titanium.Web.Proxy/Http/Response.cs
+7
-0
ExternalProxy.cs
src/Titanium.Web.Proxy/Models/ExternalProxy.cs
+33
-1
TcpConnectionFactory.cs
src/Titanium.Web.Proxy/Network/Tcp/TcpConnectionFactory.cs
+20
-18
RequestHandler.cs
src/Titanium.Web.Proxy/RequestHandler.cs
+1
-1
Titanium.Web.Proxy.NetCore.csproj
src/Titanium.Web.Proxy/Titanium.Web.Proxy.NetCore.csproj
+5
-14
Titanium.Web.Proxy.csproj
src/Titanium.Web.Proxy/Titanium.Web.Proxy.csproj
+2
-2
Titanium.Web.Proxy.nuspec
src/Titanium.Web.Proxy/Titanium.Web.Proxy.nuspec
+6
-6
TransparentClientHandler.cs
src/Titanium.Web.Proxy/TransparentClientHandler.cs
+5
-6
WinAuthHandler.cs
src/Titanium.Web.Proxy/WinAuthHandler.cs
+1
-1
NestedProxyTests.cs
...s/Titanium.Web.Proxy.IntegrationTests/NestedProxyTests.cs
+1
-5
TestProxyServer.cs
...anium.Web.Proxy.IntegrationTests/Setup/TestProxyServer.cs
+2
-11
Titanium.Web.Proxy.IntegrationTests.csproj
...tegrationTests/Titanium.Web.Proxy.IntegrationTests.csproj
+2
-4
No files found.
.vscode/launch.json
View file @
17abd9b8
...
...
@@ -5,7 +5,7 @@
"name"
:
"NetCore|Debug|Basic Example"
,
"type"
:
"coreclr"
,
"request"
:
"launch"
,
"program"
:
"${workspaceRoot}/examples/Titanium.Web.Proxy.Examples.Basic/bin/Debug/netcoreapp
2.0
/Titanium.Web.Proxy.Examples.Basic.NetCore.dll"
,
"program"
:
"${workspaceRoot}/examples/Titanium.Web.Proxy.Examples.Basic/bin/Debug/netcoreapp
3.1
/Titanium.Web.Proxy.Examples.Basic.NetCore.dll"
,
"args"
:
[],
"cwd"
:
"${workspaceRoot}"
,
"stopAtEntry"
:
false
,
...
...
@@ -16,7 +16,7 @@
"name"
:
"NetCore|Release|Basic Example"
,
"type"
:
"coreclr"
,
"request"
:
"launch"
,
"program"
:
"${workspaceRoot}/examples/Titanium.Web.Proxy.Examples.Basic/bin/Release/netcoreapp
2.0
/Titanium.Web.Proxy.Examples.Basic.NetCore.dll"
,
"program"
:
"${workspaceRoot}/examples/Titanium.Web.Proxy.Examples.Basic/bin/Release/netcoreapp
3.1
/Titanium.Web.Proxy.Examples.Basic.NetCore.dll"
,
"args"
:
[],
"cwd"
:
"${workspaceRoot}"
,
"stopAtEntry"
:
false
,
...
...
examples/Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs
View file @
17abd9b8
...
...
@@ -207,6 +207,17 @@ namespace Titanium.Web.Proxy.Examples.Basic
{
e
.
GetState
().
PipelineInfo
.
AppendLine
(
nameof
(
onRequest
)
+
":"
+
e
.
HttpClient
.
Request
.
RequestUri
);
var
clientLocalIp
=
e
.
ClientLocalEndPoint
.
Address
;
if
(!
clientLocalIp
.
Equals
(
IPAddress
.
Loopback
)
&&
!
clientLocalIp
.
Equals
(
IPAddress
.
IPv6Loopback
))
{
e
.
HttpClient
.
UpStreamEndPoint
=
new
IPEndPoint
(
clientLocalIp
,
0
);
}
if
(
e
.
HttpClient
.
Request
.
Url
.
Contains
(
"yahoo.com"
))
{
e
.
CustomUpStreamProxy
=
new
ExternalProxy
(
"localhost"
,
8888
);
}
await
writeToConsole
(
"Active Client Connections:"
+
((
ProxyServer
)
sender
).
ClientConnectionCount
);
await
writeToConsole
(
e
.
HttpClient
.
Request
.
Url
);
...
...
examples/Titanium.Web.Proxy.Examples.Basic/Titanium.Web.Proxy.Examples.Basic.NetCore.csproj
View file @
17abd9b8
...
...
@@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp
2
.1</TargetFrameworks>
<TargetFrameworks>netcoreapp
3
.1</TargetFrameworks>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<LangVersion>7.1</LangVersion>
</PropertyGroup>
...
...
examples/Titanium.Web.Proxy.Examples.Basic/Titanium.Web.Proxy.Examples.Basic.csproj
View file @
17abd9b8
...
...
@@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>net461;netcoreapp3.
0
</TargetFrameworks>
<TargetFrameworks>net461;netcoreapp3.
1
</TargetFrameworks>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<LangVersion>7.1</LangVersion>
</PropertyGroup>
...
...
examples/Titanium.Web.Proxy.Examples.WindowsService/Titanium.Web.Proxy.Examples.WindowsService.csproj
View file @
17abd9b8
...
...
@@ -103,16 +103,16 @@
</ItemGroup>
<ItemGroup>
<PackageReference
Include=
"Microsoft.Win32.Registry"
>
<Version>
4.
6
.0
</Version>
<Version>
4.
7
.0
</Version>
</PackageReference>
<PackageReference
Include=
"System.Numerics.Vectors"
>
<Version>
4.5.0
</Version>
</PackageReference>
<PackageReference
Include=
"System.Runtime.CompilerServices.Unsafe"
>
<Version>
4.
6
.0
</Version>
<Version>
4.
7
.0
</Version>
</PackageReference>
<PackageReference
Include=
"System.ServiceProcess.ServiceController"
>
<Version>
4.
6
.0
</Version>
<Version>
4.
7
.0
</Version>
</PackageReference>
<PackageReference
Include=
"System.Threading.Tasks.Extensions"
>
<Version>
4.5.3
</Version>
...
...
examples/Titanium.Web.Proxy.Examples.Wpf/MainWindow.xaml
View file @
17abd9b8
...
...
@@ -31,7 +31,7 @@
<GridViewColumn Header="Process" DisplayMemberBinding="{Binding Process}" />
<GridViewColumn Header="SentBytes" DisplayMemberBinding="{Binding SentDataCount}" />
<GridViewColumn Header="ReceivedBytes" DisplayMemberBinding="{Binding ReceivedDataCount}" />
<GridViewColumn Header="Client
EndPoint" DisplayMemberBinding="{Binding Client
EndPoint}" />
<GridViewColumn Header="Client
RemoteEndPoint" DisplayMemberBinding="{Binding ClientRemote
EndPoint}" />
<GridViewColumn Header="ClientConnectionId" DisplayMemberBinding="{Binding ClientConnectionId}" />
<GridViewColumn Header="ServerConnectionId" DisplayMemberBinding="{Binding ServerConnectionId}" />
</GridView>
...
...
examples/Titanium.Web.Proxy.Examples.Wpf/MainWindow.xaml.cs
View file @
17abd9b8
...
...
@@ -229,7 +229,8 @@ namespace Titanium.Web.Proxy.Examples.Wpf
ClientConnectionId
=
e
.
ClientConnectionId
,
ServerConnectionId
=
e
.
ServerConnectionId
,
HttpClient
=
e
.
HttpClient
,
ClientEndPoint
=
e
.
ClientEndPoint
,
ClientRemoteEndPoint
=
e
.
ClientRemoteEndPoint
,
ClientLocalEndPoint
=
e
.
ClientLocalEndPoint
,
IsTunnelConnect
=
isTunnelConnect
};
...
...
examples/Titanium.Web.Proxy.Examples.Wpf/SessionListItem.cs
View file @
17abd9b8
...
...
@@ -38,7 +38,9 @@ namespace Titanium.Web.Proxy.Examples.Wpf
public
HttpWebClient
HttpClient
{
get
;
set
;
}
public
IPEndPoint
ClientEndPoint
{
get
;
set
;
}
public
IPEndPoint
ClientLocalEndPoint
{
get
;
set
;
}
public
IPEndPoint
ClientRemoteEndPoint
{
get
;
set
;
}
public
bool
IsTunnelConnect
{
get
;
set
;
}
...
...
examples/Titanium.Web.Proxy.Examples.Wpf/Titanium.Web.Proxy.Examples.Wpf.NetCore.csproj
View file @
17abd9b8
...
...
@@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFrameworks>netcoreapp3.
0
</TargetFrameworks>
<TargetFrameworks>netcoreapp3.
1
</TargetFrameworks>
<UseWPF>true</UseWPF>
</PropertyGroup>
...
...
examples/Titanium.Web.Proxy.Examples.Wpf/Titanium.Web.Proxy.Examples.Wpf.csproj
View file @
17abd9b8
...
...
@@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFrameworks>net461;netcoreapp3.
0
</TargetFrameworks>
<TargetFrameworks>net461;netcoreapp3.
1
</TargetFrameworks>
<UseWPF>true</UseWPF>
</PropertyGroup>
...
...
src/Titanium.Web.Proxy/EventArguments/EmptyProxyEventArgs.cs
0 → 100644
View file @
17abd9b8
using
System
;
using
Titanium.Web.Proxy.Network.Tcp
;
namespace
Titanium.Web.Proxy.EventArguments
{
public
class
EmptyProxyEventArgs
:
ProxyEventArgsBase
{
internal
EmptyProxyEventArgs
(
TcpClientConnection
clientConnection
)
:
base
(
clientConnection
)
{
}
}
}
src/Titanium.Web.Proxy/EventArguments/SessionEventArgs.cs
View file @
17abd9b8
...
...
@@ -25,7 +25,7 @@ namespace Titanium.Web.Proxy.EventArguments
/// </summary>
private
bool
reRequest
;
private
WebSocketDecoder
webSocketDecoder
;
private
WebSocketDecoder
?
webSocketDecoder
;
/// <summary>
/// Is this session a HTTP/2 promise?
...
...
@@ -190,7 +190,7 @@ namespace Titanium.Web.Proxy.EventArguments
private
async
Task
<
byte
[
]>
readBodyAsync
(
bool
isRequest
,
CancellationToken
cancellationToken
)
{
using
var
bodyStream
=
new
MemoryStream
();
using
var
writer
=
new
HttpStream
(
bodyStream
,
BufferPool
);
using
var
writer
=
new
HttpStream
(
bodyStream
,
BufferPool
,
cancellationToken
);
if
(
isRequest
)
{
...
...
@@ -221,7 +221,7 @@ namespace Titanium.Web.Proxy.EventArguments
var
reader
=
isRequest
?
(
HttpStream
)
ClientStream
:
HttpClient
.
Connection
.
Stream
;
await
reader
.
CopyBodyAsync
(
requestResponse
,
true
,
new
NullWriter
()
,
TransformationMode
.
None
,
null
,
cancellationToken
);
await
reader
.
CopyBodyAsync
(
requestResponse
,
true
,
NullWriter
.
Instance
,
TransformationMode
.
None
,
null
,
cancellationToken
);
}
/// <summary>
...
...
src/Titanium.Web.Proxy/EventArguments/SessionEventArgsBase.cs
View file @
17abd9b8
...
...
@@ -59,7 +59,7 @@ namespace Titanium.Web.Proxy.EventArguments
ClientStream
=
clientStream
;
HttpClient
=
new
HttpWebClient
(
connectRequest
,
request
,
new
Lazy
<
int
>(()
=>
clientStream
.
Connection
.
GetProcessId
(
endPoint
)));
Local
EndPoint
=
endPoint
;
Proxy
EndPoint
=
endPoint
;
EnableWinAuth
=
server
.
EnableWinAuth
&&
isWindowsAuthenticationSupported
;
}
...
...
@@ -94,9 +94,17 @@ namespace Titanium.Web.Proxy.EventArguments
public
bool
IsHttps
=>
HttpClient
.
Request
.
IsHttps
;
/// <summary>
/// Client End Point.
/// Client
Local
End Point.
/// </summary>
public
IPEndPoint
ClientEndPoint
=>
(
IPEndPoint
)
ClientConnection
.
RemoteEndPoint
;
public
IPEndPoint
ClientLocalEndPoint
=>
(
IPEndPoint
)
ClientConnection
.
LocalEndPoint
;
/// <summary>
/// Client Remote End Point.
/// </summary>
public
IPEndPoint
ClientRemoteEndPoint
=>
(
IPEndPoint
)
ClientConnection
.
RemoteEndPoint
;
[
Obsolete
(
"Use ClientRemoteEndPoint instead."
)]
public
IPEndPoint
ClientEndPoint
=>
ClientRemoteEndPoint
;
/// <summary>
/// The web client used to communicate with server for this session.
...
...
@@ -106,6 +114,14 @@ namespace Titanium.Web.Proxy.EventArguments
[
Obsolete
(
"Use HttpClient instead."
)]
public
HttpWebClient
WebSession
=>
HttpClient
;
/// <summary>
/// Gets or sets the custom up stream proxy.
/// </summary>
/// <value>
/// The custom up stream proxy.
/// </value>
public
IExternalProxy
?
CustomUpStreamProxy
{
get
;
set
;
}
/// <summary>
/// Are we using a custom upstream HTTP(S) proxy?
/// </summary>
...
...
@@ -114,12 +130,15 @@ namespace Titanium.Web.Proxy.EventArguments
/// <summary>
/// Local endpoint via which we make the request.
/// </summary>
public
ProxyEndPoint
LocalEndPoint
{
get
;
}
public
ProxyEndPoint
ProxyEndPoint
{
get
;
}
[
Obsolete
(
"Use ProxyEndPoint instead."
)]
public
ProxyEndPoint
LocalEndPoint
=>
ProxyEndPoint
;
/// <summary>
/// Is this a transparent endpoint?
/// </summary>
public
bool
IsTransparent
=>
Local
EndPoint
is
TransparentProxyEndPoint
;
public
bool
IsTransparent
=>
Proxy
EndPoint
is
TransparentProxyEndPoint
;
/// <summary>
/// The last exception that happened.
...
...
src/Titanium.Web.Proxy/ExplicitClientHandler.cs
View file @
17abd9b8
...
...
@@ -33,13 +33,10 @@ namespace Titanium.Web.Proxy
var
cancellationTokenSource
=
new
CancellationTokenSource
();
var
cancellationToken
=
cancellationTokenSource
.
Token
;
var
clientStream
=
new
HttpClientStream
(
clientConnection
,
clientConnection
.
GetStream
(),
BufferPool
);
var
clientStream
=
new
HttpClientStream
(
clientConnection
,
clientConnection
.
GetStream
(),
BufferPool
,
cancellationToken
);
Task
<
TcpServerConnection
>?
prefetchConnectionTask
=
null
;
bool
closeServerConnection
=
false
;
bool
calledRequestHandler
=
false
;
SslStream
?
sslStream
=
null
;
try
{
...
...
@@ -191,6 +188,7 @@ namespace Titanium.Web.Proxy
}
X509Certificate2
?
certificate
=
null
;
SslStream
?
sslStream
=
null
;
try
{
sslStream
=
new
SslStream
(
clientStream
,
false
);
...
...
@@ -221,7 +219,7 @@ namespace Titanium.Web.Proxy
#endif
// HTTPS server created - we can now decrypt the client's traffic
clientStream
=
new
HttpClientStream
(
clientStream
.
Connection
,
sslStream
,
BufferPool
);
clientStream
=
new
HttpClientStream
(
clientStream
.
Connection
,
sslStream
,
BufferPool
,
cancellationToken
);
sslStream
=
null
;
// clientStream was created, no need to keep SSL stream reference
clientStream
.
DataRead
+=
(
o
,
args
)
=>
connectArgs
.
OnDecryptedDataSent
(
args
.
Buffer
,
args
.
Offset
,
args
.
Count
);
...
...
@@ -229,6 +227,8 @@ namespace Titanium.Web.Proxy
}
catch
(
Exception
e
)
{
sslStream
?.
Dispose
();
var
certName
=
certificate
?.
GetNameInfo
(
X509NameType
.
SimpleName
,
false
);
throw
new
ProxyConnectException
(
$"Couldn't authenticate host '
{
connectHostname
}
' with certificate '
{
certName
}
'."
,
e
,
connectArgs
);
...
...
@@ -374,10 +374,11 @@ namespace Titanium.Web.Proxy
}
}
calledRequestHandler
=
true
;
var
prefetchTask
=
prefetchConnectionTask
;
prefetchConnectionTask
=
null
;
// Now create the request
await
handleHttpSessionRequest
(
endPoint
,
clientStream
,
cancellationTokenSource
,
connectArgs
,
prefetch
Connection
Task
);
await
handleHttpSessionRequest
(
endPoint
,
clientStream
,
cancellationTokenSource
,
connectArgs
,
prefetchTask
);
}
catch
(
ProxyException
e
)
{
...
...
@@ -401,12 +402,13 @@ namespace Titanium.Web.Proxy
}
finally
{
if
(!
ca
lledRequestHandler
)
if
(!
ca
ncellationTokenSource
.
IsCancellationRequested
)
{
await
tcpConnectionFactory
.
Release
(
prefetchConnectionTask
,
closeServerConnection
);
cancellationTokenSource
.
Cancel
(
);
}
sslStream
?.
Dispose
();
await
tcpConnectionFactory
.
Release
(
prefetchConnectionTask
,
closeServerConnection
);
clientStream
.
Dispose
();
}
}
...
...
src/Titanium.Web.Proxy/Extensions/StreamExtensions.cs
View file @
17abd9b8
...
...
@@ -42,8 +42,8 @@ namespace Titanium.Web.Proxy.Extensions
{
// cancellation is not working on Socket ReadAsync
// https://github.com/dotnet/corefx/issues/15033
int
num
=
await
input
.
ReadAsync
(
buffer
,
0
,
buffer
.
Length
,
CancellationToken
.
None
)
.
w
ithCancellation
(
cancellationToken
);
int
num
=
await
input
.
ReadAsync
(
buffer
,
0
,
buffer
.
Length
,
cancellationToken
)
.
W
ithCancellation
(
cancellationToken
);
int
bytesRead
;
if
((
bytesRead
=
num
)
!=
0
&&
!
cancellationToken
.
IsCancellationRequested
)
{
...
...
@@ -62,7 +62,7 @@ namespace Titanium.Web.Proxy.Extensions
}
}
private
static
async
Task
<
T
>
w
ithCancellation
<
T
>(
this
Task
<
T
>
task
,
CancellationToken
cancellationToken
)
where
T
:
struct
internal
static
async
Task
<
T
>
W
ithCancellation
<
T
>(
this
Task
<
T
>
task
,
CancellationToken
cancellationToken
)
where
T
:
struct
{
var
tcs
=
new
TaskCompletionSource
<
bool
>();
using
(
cancellationToken
.
Register
(
s
=>
((
TaskCompletionSource
<
bool
>)
s
).
TrySetResult
(
true
),
tcs
))
...
...
src/Titanium.Web.Proxy/Helpers/HttpClientStream.cs
View file @
17abd9b8
...
...
@@ -12,8 +12,8 @@ namespace Titanium.Web.Proxy.Helpers
{
public
TcpClientConnection
Connection
{
get
;
}
internal
HttpClientStream
(
TcpClientConnection
connection
,
Stream
stream
,
IBufferPool
bufferPool
)
:
base
(
stream
,
bufferPool
)
internal
HttpClientStream
(
TcpClientConnection
connection
,
Stream
stream
,
IBufferPool
bufferPool
,
CancellationToken
cancellationToken
)
:
base
(
stream
,
bufferPool
,
cancellationToken
)
{
Connection
=
connection
;
}
...
...
src/Titanium.Web.Proxy/Helpers/HttpServerStream.cs
View file @
17abd9b8
...
...
@@ -10,8 +10,8 @@ namespace Titanium.Web.Proxy.Helpers
{
internal
sealed
class
HttpServerStream
:
HttpStream
{
internal
HttpServerStream
(
Stream
stream
,
IBufferPool
bufferPool
)
:
base
(
stream
,
bufferPool
)
internal
HttpServerStream
(
Stream
stream
,
IBufferPool
bufferPool
,
CancellationToken
cancellationToken
)
:
base
(
stream
,
bufferPool
,
cancellationToken
)
{
}
...
...
src/Titanium.Web.Proxy/Helpers/HttpStream.cs
View file @
17abd9b8
...
...
@@ -9,6 +9,7 @@ using System.Threading;
using
System.Threading.Tasks
;
using
Titanium.Web.Proxy.Compression
;
using
Titanium.Web.Proxy.EventArguments
;
using
Titanium.Web.Proxy.Extensions
;
using
Titanium.Web.Proxy.Http
;
using
Titanium.Web.Proxy.Models
;
using
Titanium.Web.Proxy.Shared
;
...
...
@@ -19,7 +20,7 @@ namespace Titanium.Web.Proxy.Helpers
{
internal
class
HttpStream
:
Stream
,
IHttpStreamWriter
,
IHttpStreamReader
,
IPeekStream
{
private
readonly
bool
swallowException
;
private
readonly
bool
isNetworkStream
;
private
readonly
bool
leaveOpen
;
private
readonly
byte
[]
streamBuffer
;
...
...
@@ -37,6 +38,7 @@ namespace Titanium.Web.Proxy.Helpers
private
bool
closedRead
;
private
readonly
IBufferPool
bufferPool
;
private
readonly
CancellationToken
cancellationToken
;
public
event
EventHandler
<
DataEventArgs
>?
DataRead
;
...
...
@@ -71,18 +73,20 @@ namespace Titanium.Web.Proxy.Helpers
/// </summary>
/// <param name="baseStream">The base stream.</param>
/// <param name="bufferPool">Bufferpool.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="leaveOpen"><see langword="true" /> to leave the stream open after disposing the <see cref="T:CustomBufferedStream" /> object; otherwise, <see langword="false" />.</param>
internal
HttpStream
(
Stream
baseStream
,
IBufferPool
bufferPool
,
bool
leaveOpen
=
false
)
internal
HttpStream
(
Stream
baseStream
,
IBufferPool
bufferPool
,
CancellationToken
cancellationToken
,
bool
leaveOpen
=
false
)
{
if
(
baseStream
is
NetworkStream
)
{
swallowException
=
true
;
isNetworkStream
=
true
;
}
this
.
baseStream
=
baseStream
;
this
.
leaveOpen
=
leaveOpen
;
streamBuffer
=
bufferPool
.
GetBuffer
();
this
.
bufferPool
=
bufferPool
;
this
.
cancellationToken
=
cancellationToken
;
}
/// <summary>
...
...
@@ -102,7 +106,7 @@ namespace Titanium.Web.Proxy.Helpers
catch
{
closedWrite
=
true
;
if
(!
swallowException
)
if
(!
isNetworkStream
)
throw
;
}
}
...
...
@@ -181,7 +185,7 @@ namespace Titanium.Web.Proxy.Helpers
catch
{
closedWrite
=
true
;
if
(!
swallowException
)
if
(!
isNetworkStream
)
throw
;
}
}
...
...
@@ -228,7 +232,7 @@ namespace Titanium.Web.Proxy.Helpers
catch
{
closedWrite
=
true
;
if
(!
swallowException
)
if
(!
isNetworkStream
)
throw
;
}
}
...
...
@@ -450,7 +454,7 @@ namespace Titanium.Web.Proxy.Helpers
catch
{
closedWrite
=
true
;
if
(!
swallowException
)
if
(!
isNetworkStream
)
throw
;
}
}
...
...
@@ -476,7 +480,7 @@ namespace Titanium.Web.Proxy.Helpers
catch
{
closedWrite
=
true
;
if
(!
swallowException
)
if
(!
isNetworkStream
)
throw
;
}
finally
...
...
@@ -609,7 +613,7 @@ namespace Titanium.Web.Proxy.Helpers
}
catch
{
if
(!
swallowException
)
if
(!
isNetworkStream
)
throw
;
}
finally
...
...
@@ -655,7 +659,13 @@ namespace Titanium.Web.Proxy.Helpers
bool
result
=
false
;
try
{
int
readBytes
=
await
baseStream
.
ReadAsync
(
streamBuffer
,
bufferLength
,
bytesToRead
,
cancellationToken
);
var
readTask
=
baseStream
.
ReadAsync
(
streamBuffer
,
bufferLength
,
bytesToRead
,
cancellationToken
);
if
(
isNetworkStream
)
{
readTask
=
readTask
.
WithCancellation
(
cancellationToken
);
}
int
readBytes
=
await
readTask
;
result
=
readBytes
>
0
;
if
(
result
)
{
...
...
@@ -665,7 +675,7 @@ namespace Titanium.Web.Proxy.Helpers
}
catch
{
if
(!
swallowException
)
if
(!
isNetworkStream
)
throw
;
}
finally
...
...
@@ -771,14 +781,18 @@ namespace Titanium.Web.Proxy.Helpers
return
base
.
BeginRead
(
buffer
,
offset
,
count
,
callback
,
state
);
}
var
vAsyncResult
=
this
.
ReadAsync
(
buffer
,
offset
,
count
);
var
vAsyncResult
=
this
.
ReadAsync
(
buffer
,
offset
,
count
,
cancellationToken
);
if
(
isNetworkStream
)
{
vAsyncResult
=
vAsyncResult
.
WithCancellation
(
cancellationToken
);
}
vAsyncResult
.
ContinueWith
(
pAsyncResult
=>
{
// use TaskExtended to pass State as AsyncObject
// callback will call EndRead (otherwise, it will block)
callback
?.
Invoke
(
new
TaskResult
<
int
>(
pAsyncResult
,
state
));
});
}
,
cancellationToken
);
return
vAsyncResult
;
}
...
...
@@ -811,12 +825,12 @@ namespace Titanium.Web.Proxy.Helpers
return
base
.
BeginWrite
(
buffer
,
offset
,
count
,
callback
,
state
);
}
var
vAsyncResult
=
this
.
WriteAsync
(
buffer
,
offset
,
count
);
var
vAsyncResult
=
this
.
WriteAsync
(
buffer
,
offset
,
count
,
cancellationToken
);
vAsyncResult
.
ContinueWith
(
pAsyncResult
=>
{
callback
?.
Invoke
(
new
TaskResult
(
pAsyncResult
,
state
));
});
}
,
cancellationToken
);
return
vAsyncResult
;
}
...
...
@@ -868,7 +882,7 @@ namespace Titanium.Web.Proxy.Helpers
catch
{
closedWrite
=
true
;
if
(!
swallowException
)
if
(!
isNetworkStream
)
throw
;
}
finally
...
...
@@ -893,7 +907,7 @@ namespace Titanium.Web.Proxy.Helpers
catch
{
closedWrite
=
true
;
if
(!
swallowException
)
if
(!
isNetworkStream
)
throw
;
}
}
...
...
@@ -940,7 +954,7 @@ namespace Titanium.Web.Proxy.Helpers
catch
{
closedWrite
=
true
;
if
(!
swallowException
)
if
(!
isNetworkStream
)
throw
;
}
}
...
...
@@ -964,7 +978,7 @@ namespace Titanium.Web.Proxy.Helpers
catch
{
closedWrite
=
true
;
if
(!
swallowException
)
if
(!
isNetworkStream
)
throw
;
}
}
...
...
@@ -1011,7 +1025,7 @@ namespace Titanium.Web.Proxy.Helpers
try
{
var
http
=
new
HttpStream
(
s
,
bufferPool
,
true
);
var
http
=
new
HttpStream
(
s
,
bufferPool
,
cancellationToken
,
true
);
await
http
.
CopyBodyAsync
(
writer
,
false
,
-
1
,
onCopy
,
cancellationToken
);
}
finally
...
...
@@ -1196,7 +1210,7 @@ namespace Titanium.Web.Proxy.Helpers
catch
{
closedWrite
=
true
;
if
(!
swallowException
)
if
(!
isNetworkStream
)
throw
;
}
}
...
...
@@ -1217,7 +1231,7 @@ namespace Titanium.Web.Proxy.Helpers
}
catch
{
if
(!
swallowException
)
if
(!
isNetworkStream
)
throw
;
}
}
...
...
src/Titanium.Web.Proxy/Helpers/NullWriter.cs
View file @
17abd9b8
...
...
@@ -8,6 +8,10 @@ namespace Titanium.Web.Proxy.Helpers
{
public
static
NullWriter
Instance
{
get
;
}
=
new
NullWriter
();
private
NullWriter
()
{
}
public
void
Write
(
byte
[]
buffer
,
int
offset
,
int
count
)
{
}
...
...
src/Titanium.Web.Proxy/Helpers/WinHttp/WinHttpWebProxyFinder.cs
View file @
17abd9b8
...
...
@@ -114,11 +114,7 @@ namespace Titanium.Web.Proxy.Helpers.WinHttp
}
// TODO: Apply authorization
var
systemProxy
=
new
ExternalProxy
{
HostName
=
proxyStr
,
Port
=
port
};
var
systemProxy
=
new
ExternalProxy
(
proxyStr
,
port
);
return
systemProxy
;
}
...
...
@@ -134,12 +130,7 @@ namespace Titanium.Web.Proxy.Helpers.WinHttp
HttpSystemProxyValue
?
value
=
null
;
if
(
ProxyInfo
?.
Proxies
?.
TryGetValue
(
protocolType
.
Value
,
out
value
)
==
true
)
{
var
systemProxy
=
new
ExternalProxy
{
HostName
=
value
!.
HostName
,
Port
=
value
.
Port
};
var
systemProxy
=
new
ExternalProxy
(
value
!.
HostName
,
value
.
Port
);
return
systemProxy
;
}
}
...
...
src/Titanium.Web.Proxy/Http/HttpWebClient.cs
View file @
17abd9b8
...
...
@@ -166,6 +166,8 @@ namespace Titanium.Web.Proxy.Http
return
;
}
Response
.
RequestMethod
=
Request
.
Method
;
var
httpStatus
=
await
Connection
.
Stream
.
ReadResponseStatus
(
cancellationToken
);
Response
.
HttpVersion
=
httpStatus
.
Version
;
Response
.
StatusCode
=
httpStatus
.
StatusCode
;
...
...
src/Titanium.Web.Proxy/Http/Response.cs
View file @
17abd9b8
...
...
@@ -36,6 +36,8 @@ namespace Titanium.Web.Proxy.Http
/// </summary>
public
string
StatusDescription
{
get
;
set
;
}
=
string
.
Empty
;
internal
string
RequestMethod
{
get
;
set
;
}
/// <summary>
/// Has response body?
/// </summary>
...
...
@@ -43,6 +45,11 @@ namespace Titanium.Web.Proxy.Http
{
get
{
if
(
RequestMethod
==
"HEAD"
)
{
return
false
;
}
long
contentLength
=
ContentLength
;
// If content length is set to 0 the response has no body
...
...
src/Titanium.Web.Proxy/Models/ExternalProxy.cs
View file @
17abd9b8
...
...
@@ -69,6 +69,39 @@ namespace Titanium.Web.Proxy.Models
/// </summary>
public
int
Port
{
get
;
set
;
}
/// <summary>
/// Initializes a new instance of the <see cref="ExternalProxy"/> class.
/// </summary>
public
ExternalProxy
()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="ExternalProxy"/> class.
/// </summary>
/// <param name="hostName">Name of the host.</param>
/// <param name="port">The port.</param>
public
ExternalProxy
(
string
hostName
,
int
port
)
{
HostName
=
hostName
;
Port
=
port
;
}
/// <summary>
/// Initializes a new instance of the <see cref="ExternalProxy"/> class.
/// </summary>
/// <param name="hostName">Name of the host.</param>
/// <param name="port">The port.</param>
/// <param name="userName">Name of the user.</param>
/// <param name="password">The password.</param>
public
ExternalProxy
(
string
hostName
,
int
port
,
string
userName
,
string
password
)
{
HostName
=
hostName
;
Port
=
port
;
UserName
=
userName
;
Password
=
password
;
}
/// <summary>
/// returns data in Hostname:port format.
/// </summary>
...
...
@@ -77,6 +110,5 @@ namespace Titanium.Web.Proxy.Models
{
return
$"
{
HostName
}
:
{
Port
}
"
;
}
}
}
src/Titanium.Web.Proxy/Network/Tcp/TcpConnectionFactory.cs
View file @
17abd9b8
...
...
@@ -114,10 +114,10 @@ namespace Titanium.Web.Proxy.Network.Tcp
applicationProtocols
=
new
List
<
SslApplicationProtocol
>
{
applicationProtocol
};
}
IExternalProxy
?
customUpStreamProxy
=
null
;
IExternalProxy
?
customUpStreamProxy
=
session
.
CustomUpStreamProxy
;
bool
isHttps
=
session
.
IsHttps
;
if
(
server
.
GetCustomUpStreamProxyFunc
!=
null
)
if
(
customUpStreamProxy
==
null
&&
server
.
GetCustomUpStreamProxyFunc
!=
null
)
{
customUpStreamProxy
=
await
server
.
GetCustomUpStreamProxyFunc
(
session
);
}
...
...
@@ -169,10 +169,10 @@ namespace Titanium.Web.Proxy.Network.Tcp
internal
async
Task
<
TcpServerConnection
>
GetServerConnection
(
ProxyServer
proxyServer
,
SessionEventArgsBase
session
,
bool
isConnect
,
List
<
SslApplicationProtocol
>?
applicationProtocols
,
bool
noCache
,
CancellationToken
cancellationToken
)
{
IExternalProxy
?
customUpStreamProxy
=
null
;
IExternalProxy
?
customUpStreamProxy
=
session
.
CustomUpStreamProxy
;
bool
isHttps
=
session
.
IsHttps
;
if
(
proxyServer
.
GetCustomUpStreamProxyFunc
!=
null
)
if
(
customUpStreamProxy
==
null
&&
proxyServer
.
GetCustomUpStreamProxyFunc
!=
null
)
{
customUpStreamProxy
=
await
proxyServer
.
GetCustomUpStreamProxyFunc
(
session
);
}
...
...
@@ -445,7 +445,7 @@ retry:
await
proxyServer
.
InvokeServerConnectionCreateEvent
(
tcpClient
);
stream
=
new
HttpServerStream
(
tcpClient
.
GetStream
(),
proxyServer
.
BufferPool
);
stream
=
new
HttpServerStream
(
tcpClient
.
GetStream
(),
proxyServer
.
BufferPool
,
cancellationToken
);
if
(
externalProxy
!=
null
&&
(
isConnect
||
isHttps
))
{
...
...
@@ -487,7 +487,7 @@ retry:
(
sender
,
targetHost
,
localCertificates
,
remoteCertificate
,
acceptableIssuers
)
=>
proxyServer
.
SelectClientCertificate
(
sender
,
sessionArgs
,
targetHost
,
localCertificates
,
remoteCertificate
,
acceptableIssuers
));
stream
=
new
HttpServerStream
(
sslStream
,
proxyServer
.
BufferPool
);
stream
=
new
HttpServerStream
(
sslStream
,
proxyServer
.
BufferPool
,
cancellationToken
);
var
options
=
new
SslClientAuthenticationOptions
{
...
...
@@ -580,20 +580,22 @@ retry:
internal
async
Task
Release
(
Task
<
TcpServerConnection
>?
connectionCreateTask
,
bool
closeServerConnection
)
{
if
(
connectionCreateTask
!
=
null
)
if
(
connectionCreateTask
=
=
null
)
{
TcpServerConnection
?
connection
=
null
;
try
{
connection
=
await
connectionCreateTask
;
}
catch
{
}
finally
return
;
}
TcpServerConnection
?
connection
=
null
;
try
{
connection
=
await
connectionCreateTask
;
}
catch
{
}
finally
{
if
(
connection
!=
null
)
{
if
(
connection
!=
null
)
{
await
Release
(
connection
,
closeServerConnection
);
}
await
Release
(
connection
,
closeServerConnection
);
}
}
}
...
...
src/Titanium.Web.Proxy/RequestHandler.cs
View file @
17abd9b8
...
...
@@ -272,7 +272,7 @@ namespace Titanium.Web.Proxy
cancellationToken
);
// for connection pool, retry fails until cache is exhausted.
return
await
retryPolicy
<
ServerConnectionException
>().
ExecuteAsync
(
async
(
connection
)
=>
return
await
retryPolicy
<
ServerConnectionException
>().
ExecuteAsync
(
async
connection
=>
{
// set the connection and send request headers
args
.
HttpClient
.
SetConnection
(
connection
);
...
...
src/Titanium.Web.Proxy/Titanium.Web.Proxy.NetCore.csproj
View file @
17abd9b8
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.
0;netcoreapp2.
1</TargetFrameworks>
<TargetFrameworks>netstandard2.1</TargetFrameworks>
<RootNamespace>Titanium.Web.Proxy</RootNamespace>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<SignAssembly>True</SignAssembly>
<AssemblyOriginatorKeyFile>StrongNameKey.snk</AssemblyOriginatorKeyFile>
<DelaySign>False</DelaySign>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<Nullable>enable</Nullable>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BrotliSharpLib" Version="0.3.3" />
<PackageReference Include="Portable.BouncyCastle" Version="1.8.5.2" />
<PackageReference Include="System.Buffers" Version="4.5.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)'
== 'netstandard2.0
'">
<ItemGroup Condition="'$(TargetFramework)'
!= 'net45
'">
<PackageReference Include="Microsoft.Win32.Registry">
<Version>4.
6
.0</Version>
<Version>4.
7
.0</Version>
</PackageReference>
<PackageReference Include="System.Security.Principal.Windows">
<Version>4.6.0</Version>
</PackageReference>
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp2.1'">
<PackageReference Include="Microsoft.Win32.Registry">
<Version>4.6.0</Version>
</PackageReference>
<PackageReference Include="System.Security.Principal.Windows">
<Version>4.6.0</Version>
<Version>4.7.0</Version>
</PackageReference>
</ItemGroup>
...
...
src/Titanium.Web.Proxy/Titanium.Web.Proxy.csproj
View file @
17abd9b8
...
...
@@ -25,10 +25,10 @@
<ItemGroup Condition="'$(TargetFramework)' != 'net45'">
<PackageReference Include="Microsoft.Win32.Registry">
<Version>4.
6
.0</Version>
<Version>4.
7
.0</Version>
</PackageReference>
<PackageReference Include="System.Security.Principal.Windows">
<Version>4.
6
.0</Version>
<Version>4.
7
.0</Version>
</PackageReference>
</ItemGroup>
...
...
src/Titanium.Web.Proxy/Titanium.Web.Proxy.nuspec
View file @
17abd9b8
...
...
@@ -24,26 +24,26 @@
<group
targetFramework=
"net461"
>
<dependency
id=
"BrotliSharpLib"
version=
"0.3.3"
/>
<dependency
id=
"Portable.BouncyCastle"
version=
"1.8.5.2"
/>
<dependency
id=
"Microsoft.Win32.Registry"
version=
"4.
6
.0"
/>
<dependency
id=
"Microsoft.Win32.Registry"
version=
"4.
7
.0"
/>
<dependency
id=
"System.Buffers"
version=
"4.5.0"
/>
<dependency
id=
"System.Memory"
version=
"4.5.3"
/>
<dependency
id=
"System.Threading.Tasks.Extensions"
version=
"4.5.3"
/>
<dependency
id=
"System.Security.Principal.Windows"
version=
"4.
6
.0"
/>
<dependency
id=
"System.Security.Principal.Windows"
version=
"4.
7
.0"
/>
</group>
<group
targetFramework=
"netstandard2.0"
>
<dependency
id=
"BrotliSharpLib"
version=
"0.3.3"
/>
<dependency
id=
"Portable.BouncyCastle"
version=
"1.8.5.2"
/>
<dependency
id=
"Microsoft.Win32.Registry"
version=
"4.
6
.0"
/>
<dependency
id=
"Microsoft.Win32.Registry"
version=
"4.
7
.0"
/>
<dependency
id=
"System.Buffers"
version=
"4.5.0"
/>
<dependency
id=
"System.Memory"
version=
"4.5.3"
/>
<dependency
id=
"System.Threading.Tasks.Extensions"
version=
"4.5.3"
/>
<dependency
id=
"System.Security.Principal.Windows"
version=
"4.
6
.0"
/>
<dependency
id=
"System.Security.Principal.Windows"
version=
"4.
7
.0"
/>
</group>
<group
targetFramework=
"netstandard2.1"
>
<dependency
id=
"BrotliSharpLib"
version=
"0.3.3"
/>
<dependency
id=
"Portable.BouncyCastle"
version=
"1.8.5.2"
/>
<dependency
id=
"Microsoft.Win32.Registry"
version=
"4.
6
.0"
/>
<dependency
id=
"System.Security.Principal.Windows"
version=
"4.
6
.0"
/>
<dependency
id=
"Microsoft.Win32.Registry"
version=
"4.
7
.0"
/>
<dependency
id=
"System.Security.Principal.Windows"
version=
"4.
7
.0"
/>
</group>
</dependencies>
</metadata>
...
...
src/Titanium.Web.Proxy/TransparentClientHandler.cs
View file @
17abd9b8
...
...
@@ -30,9 +30,7 @@ namespace Titanium.Web.Proxy
var
cancellationTokenSource
=
new
CancellationTokenSource
();
var
cancellationToken
=
cancellationTokenSource
.
Token
;
var
clientStream
=
new
HttpClientStream
(
clientConnection
,
clientConnection
.
GetStream
(),
BufferPool
);
SslStream
?
sslStream
=
null
;
var
clientStream
=
new
HttpClientStream
(
clientConnection
,
clientConnection
.
GetStream
(),
BufferPool
,
cancellationToken
);
try
{
...
...
@@ -57,6 +55,7 @@ namespace Titanium.Web.Proxy
// do client authentication using certificate
X509Certificate2
?
certificate
=
null
;
SslStream
?
sslStream
=
null
;
try
{
sslStream
=
new
SslStream
(
clientStream
,
false
);
...
...
@@ -69,17 +68,18 @@ namespace Titanium.Web.Proxy
await
sslStream
.
AuthenticateAsServerAsync
(
certificate
,
false
,
SslProtocols
.
Tls
,
false
);
// HTTPS server created - we can now decrypt the client's traffic
clientStream
=
new
HttpClientStream
(
clientStream
.
Connection
,
sslStream
,
BufferPool
);
clientStream
=
new
HttpClientStream
(
clientStream
.
Connection
,
sslStream
,
BufferPool
,
cancellationToken
);
sslStream
=
null
;
// clientStream was created, no need to keep SSL stream reference
}
catch
(
Exception
e
)
{
sslStream
?.
Dispose
();
var
certName
=
certificate
?.
GetNameInfo
(
X509NameType
.
SimpleName
,
false
);
var
session
=
new
SessionEventArgs
(
this
,
endPoint
,
clientStream
,
null
,
cancellationTokenSource
);
throw
new
ProxyConnectException
(
$"Couldn't authenticate host '
{
httpsHostName
}
' with certificate '
{
certName
}
'."
,
e
,
session
);
}
}
else
{
...
...
@@ -146,7 +146,6 @@ namespace Titanium.Web.Proxy
}
finally
{
sslStream
?.
Dispose
();
clientStream
.
Dispose
();
}
}
...
...
src/Titanium.Web.Proxy/WinAuthHandler.cs
View file @
17abd9b8
...
...
@@ -175,7 +175,7 @@ namespace Titanium.Web.Proxy
// Add custom div to body to clarify that the proxy (not the client browser) failed authentication
string
authErrorMessage
=
"<div class=\"inserted-by-proxy\"><h2>NTLM authentication through Titanium.Web.Proxy ("
+
args
.
Client
Connection
.
LocalEndPoint
+
args
.
ClientLocalEndPoint
+
") failed. Please check credentials.</h2></div>"
;
string
originalErrorMessage
=
"<div class=\"inserted-by-proxy\"><h3>Response from remote web server below.</h3></div><br/>"
;
...
...
tests/Titanium.Web.Proxy.IntegrationTests/NestedProxyTests.cs
View file @
17abd9b8
...
...
@@ -59,11 +59,7 @@ namespace Titanium.Web.Proxy.IntegrationTests
{
Assert
.
AreEqual
(
"Test"
,
session
.
UserData
);
return
await
Task
.
FromResult
(
new
Models
.
ExternalProxy
{
HostName
=
"localhost"
,
Port
=
proxy2
.
ProxyEndPoints
[
0
].
Port
});
return
await
Task
.
FromResult
(
new
Models
.
ExternalProxy
(
"localhost"
,
proxy2
.
ProxyEndPoints
[
0
].
Port
));
};
var
client
=
testSuite
.
GetClient
(
proxy1
,
true
);
...
...
tests/Titanium.Web.Proxy.IntegrationTests/Setup/TestProxyServer.cs
View file @
17abd9b8
...
...
@@ -22,17 +22,8 @@ namespace Titanium.Web.Proxy.IntegrationTests.Setup
if
(
upStreamProxy
!=
null
)
{
ProxyServer
.
UpStreamHttpProxy
=
new
ExternalProxy
{
HostName
=
"localhost"
,
Port
=
upStreamProxy
.
ProxyEndPoints
[
0
].
Port
};
ProxyServer
.
UpStreamHttpsProxy
=
new
ExternalProxy
{
HostName
=
"localhost"
,
Port
=
upStreamProxy
.
ProxyEndPoints
[
0
].
Port
};
ProxyServer
.
UpStreamHttpProxy
=
new
ExternalProxy
(
"localhost"
,
upStreamProxy
.
ProxyEndPoints
[
0
].
Port
);
ProxyServer
.
UpStreamHttpsProxy
=
new
ExternalProxy
(
"localhost"
,
upStreamProxy
.
ProxyEndPoints
[
0
].
Port
);
}
ProxyServer
.
Start
();
...
...
tests/Titanium.Web.Proxy.IntegrationTests/Titanium.Web.Proxy.IntegrationTests.csproj
View file @
17abd9b8
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.
0
</TargetFramework>
<TargetFramework>netcoreapp3.
1
</TargetFramework>
<AssemblyOriginatorKeyFile>StrongNameKey.snk</AssemblyOriginatorKeyFile>
<SignAssembly>true</SignAssembly>
</PropertyGroup>
...
...
@@ -14,9 +14,7 @@
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Https" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.0.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
<PackageReference Include="MSTest.TestAdapter" Version="2.0.0" />
<PackageReference Include="MSTest.TestFramework" Version="2.0.0" />
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment