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
d90adbb1
Commit
d90adbb1
authored
Jul 21, 2019
by
Honfika
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
various fixes
parent
17a4efec
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
272 additions
and
66 deletions
+272
-66
ProxyTestController.cs
.../Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs
+4
-4
MainWindow.xaml
examples/Titanium.Web.Proxy.Examples.Wpf/MainWindow.xaml
+1
-0
MainWindow.xaml.cs
examples/Titanium.Web.Proxy.Examples.Wpf/MainWindow.xaml.cs
+38
-6
ExplicitClientHandler.cs
src/Titanium.Web.Proxy/ExplicitClientHandler.cs
+8
-5
TcpConnectionFactory.cs
src/Titanium.Web.Proxy/Network/Tcp/TcpConnectionFactory.cs
+2
-2
ProxyServer.cs
src/Titanium.Web.Proxy/ProxyServer.cs
+15
-1
RequestHandler.cs
src/Titanium.Web.Proxy/RequestHandler.cs
+10
-5
DefaultBufferPool.cs
....Web.Proxy/StreamExtended/BufferPool/DefaultBufferPool.cs
+4
-14
IBufferPool.cs
...tanium.Web.Proxy/StreamExtended/BufferPool/IBufferPool.cs
+1
-0
CustomBufferedStream.cs
....Web.Proxy/StreamExtended/Network/CustomBufferedStream.cs
+120
-23
TaskResult.cs
src/Titanium.Web.Proxy/StreamExtended/Network/TaskResult.cs
+58
-0
Titanium.Web.Proxy.Mono.csproj
src/Titanium.Web.Proxy/Titanium.Web.Proxy.Mono.csproj
+1
-0
Titanium.Web.Proxy.NetCore.csproj
src/Titanium.Web.Proxy/Titanium.Web.Proxy.NetCore.csproj
+1
-0
Titanium.Web.Proxy.csproj
src/Titanium.Web.Proxy/Titanium.Web.Proxy.csproj
+1
-0
Titanium.Web.Proxy.nuspec
src/Titanium.Web.Proxy/Titanium.Web.Proxy.nuspec
+2
-0
TransparentClientHandler.cs
src/Titanium.Web.Proxy/TransparentClientHandler.cs
+6
-6
No files found.
examples/Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs
View file @
d90adbb1
...
@@ -119,7 +119,7 @@ namespace Titanium.Web.Proxy.Examples.Basic
...
@@ -119,7 +119,7 @@ namespace Titanium.Web.Proxy.Examples.Basic
private
async
Task
onBeforeTunnelConnectRequest
(
object
sender
,
TunnelConnectSessionEventArgs
e
)
private
async
Task
onBeforeTunnelConnectRequest
(
object
sender
,
TunnelConnectSessionEventArgs
e
)
{
{
string
hostname
=
e
.
HttpClient
.
Request
.
RequestUri
.
Host
;
string
hostname
=
e
.
HttpClient
.
Request
.
RequestUri
.
Host
;
await
writeToConsole
(
"Tunnel to: "
+
hostname
);
//
await writeToConsole("Tunnel to: " + hostname);
if
(
hostname
.
Contains
(
"dropbox.com"
))
if
(
hostname
.
Contains
(
"dropbox.com"
))
{
{
...
@@ -138,8 +138,8 @@ namespace Titanium.Web.Proxy.Examples.Basic
...
@@ -138,8 +138,8 @@ namespace Titanium.Web.Proxy.Examples.Basic
// intecept & cancel redirect or update requests
// intecept & cancel redirect or update requests
private
async
Task
onRequest
(
object
sender
,
SessionEventArgs
e
)
private
async
Task
onRequest
(
object
sender
,
SessionEventArgs
e
)
{
{
await
writeToConsole
(
"Active Client Connections:"
+
((
ProxyServer
)
sender
).
ClientConnectionCount
);
//
await writeToConsole("Active Client Connections:" + ((ProxyServer)sender).ClientConnectionCount);
await
writeToConsole
(
e
.
HttpClient
.
Request
.
Url
);
//
await writeToConsole(e.HttpClient.Request.Url);
// store it in the UserData property
// store it in the UserData property
// It can be a simple integer, Guid, or any type
// It can be a simple integer, Guid, or any type
...
@@ -189,7 +189,7 @@ namespace Titanium.Web.Proxy.Examples.Basic
...
@@ -189,7 +189,7 @@ namespace Titanium.Web.Proxy.Examples.Basic
private
async
Task
onResponse
(
object
sender
,
SessionEventArgs
e
)
private
async
Task
onResponse
(
object
sender
,
SessionEventArgs
e
)
{
{
await
writeToConsole
(
"Active Server Connections:"
+
((
ProxyServer
)
sender
).
ServerConnectionCount
);
//
await writeToConsole("Active Server Connections:" + ((ProxyServer)sender).ServerConnectionCount);
string
ext
=
System
.
IO
.
Path
.
GetExtension
(
e
.
HttpClient
.
Request
.
RequestUri
.
AbsolutePath
);
string
ext
=
System
.
IO
.
Path
.
GetExtension
(
e
.
HttpClient
.
Request
.
RequestUri
.
AbsolutePath
);
...
...
examples/Titanium.Web.Proxy.Examples.Wpf/MainWindow.xaml
View file @
d90adbb1
...
@@ -54,6 +54,7 @@
...
@@ -54,6 +54,7 @@
</TabItem>
</TabItem>
</TabControl>
</TabControl>
<StackPanel Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="3" Orientation="Horizontal">
<StackPanel Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="3" Orientation="Horizontal">
<ToggleButton IsChecked="True" Content="On/Off" Click="ButtonProxyOnOff_OnClick" />
<TextBlock Text="ClientConnectionCount:" />
<TextBlock Text="ClientConnectionCount:" />
<TextBlock Text="{Binding ClientConnectionCount}" Margin="10,0,20,0" />
<TextBlock Text="{Binding ClientConnectionCount}" Margin="10,0,20,0" />
<TextBlock Text="ServerConnectionCount:" />
<TextBlock Text="ServerConnectionCount:" />
...
...
examples/Titanium.Web.Proxy.Examples.Wpf/MainWindow.xaml.cs
View file @
d90adbb1
...
@@ -8,6 +8,7 @@ using System.Text;
...
@@ -8,6 +8,7 @@ using System.Text;
using
System.Threading.Tasks
;
using
System.Threading.Tasks
;
using
System.Windows
;
using
System.Windows
;
using
System.Windows.Controls
;
using
System.Windows.Controls
;
using
System.Windows.Controls.Primitives
;
using
System.Windows.Input
;
using
System.Windows.Input
;
using
System.Windows.Media.Imaging
;
using
System.Windows.Media.Imaging
;
using
Titanium.Web.Proxy.EventArguments
;
using
Titanium.Web.Proxy.EventArguments
;
...
@@ -284,15 +285,26 @@ namespace Titanium.Web.Proxy.Examples.Wpf
...
@@ -284,15 +285,26 @@ namespace Titanium.Web.Proxy.Examples.Wpf
{
{
if
(
e
.
Key
==
Key
.
Delete
)
if
(
e
.
Key
==
Key
.
Delete
)
{
{
bool
isSelected
=
false
;
var
selectedItems
=
((
ListView
)
sender
).
SelectedItems
;
var
selectedItems
=
((
ListView
)
sender
).
SelectedItems
;
Sessions
.
SuppressNotification
=
true
;
Sessions
.
SuppressNotification
=
true
;
foreach
(
var
item
in
selectedItems
.
Cast
<
SessionListItem
>().
ToArray
())
foreach
(
var
item
in
selectedItems
.
Cast
<
SessionListItem
>().
ToArray
())
{
{
if
(
item
==
SelectedSession
)
{
isSelected
=
true
;
}
Sessions
.
Remove
(
item
);
Sessions
.
Remove
(
item
);
sessionDictionary
.
Remove
(
item
.
HttpClient
);
sessionDictionary
.
Remove
(
item
.
HttpClient
);
}
}
Sessions
.
SuppressNotification
=
false
;
Sessions
.
SuppressNotification
=
false
;
if
(
isSelected
)
{
SelectedSession
=
null
;
}
}
}
}
}
...
@@ -300,6 +312,9 @@ namespace Titanium.Web.Proxy.Examples.Wpf
...
@@ -300,6 +312,9 @@ namespace Titanium.Web.Proxy.Examples.Wpf
{
{
if
(
SelectedSession
==
null
)
if
(
SelectedSession
==
null
)
{
{
TextBoxRequest
.
Text
=
null
;
TextBoxResponse
.
Text
=
string
.
Empty
;
ImageResponse
.
Source
=
null
;
return
;
return
;
}
}
...
@@ -307,7 +322,7 @@ namespace Titanium.Web.Proxy.Examples.Wpf
...
@@ -307,7 +322,7 @@ namespace Titanium.Web.Proxy.Examples.Wpf
var
session
=
SelectedSession
.
HttpClient
;
var
session
=
SelectedSession
.
HttpClient
;
var
request
=
session
.
Request
;
var
request
=
session
.
Request
;
var
fullData
=
(
request
.
IsBodyRead
?
request
.
Body
:
null
)
??
new
byte
[
0
]
;
var
fullData
=
(
request
.
IsBodyRead
?
request
.
Body
:
null
)
??
Array
.
Empty
<
byte
>()
;
var
data
=
fullData
;
var
data
=
fullData
;
bool
truncated
=
data
.
Length
>
truncateLimit
;
bool
truncated
=
data
.
Length
>
truncateLimit
;
if
(
truncated
)
if
(
truncated
)
...
@@ -324,7 +339,7 @@ namespace Titanium.Web.Proxy.Examples.Wpf
...
@@ -324,7 +339,7 @@ namespace Titanium.Web.Proxy.Examples.Wpf
TextBoxRequest
.
Text
=
sb
.
ToString
();
TextBoxRequest
.
Text
=
sb
.
ToString
();
var
response
=
session
.
Response
;
var
response
=
session
.
Response
;
fullData
=
(
response
.
IsBodyRead
?
response
.
Body
:
null
)
??
new
byte
[
0
]
;
fullData
=
(
response
.
IsBodyRead
?
response
.
Body
:
null
)
??
Array
.
Empty
<
byte
>()
;
data
=
fullData
;
data
=
fullData
;
truncated
=
data
.
Length
>
truncateLimit
;
truncated
=
data
.
Length
>
truncateLimit
;
if
(
truncated
)
if
(
truncated
)
...
@@ -348,16 +363,33 @@ namespace Titanium.Web.Proxy.Examples.Wpf
...
@@ -348,16 +363,33 @@ namespace Titanium.Web.Proxy.Examples.Wpf
try
try
{
{
using
(
MemoryStream
stream
=
new
MemoryStream
(
fullData
))
if
(
fullData
.
Length
>
0
)
{
using
(
var
stream
=
new
MemoryStream
(
fullData
))
{
{
ImageResponse
.
Source
=
ImageResponse
.
Source
=
BitmapFrame
.
Create
(
stream
,
BitmapCreateOptions
.
None
,
BitmapCacheOption
.
OnLoad
);
BitmapFrame
.
Create
(
stream
,
BitmapCreateOptions
.
None
,
BitmapCacheOption
.
OnLoad
);
}
}
}
}
}
catch
catch
{
{
ImageResponse
.
Source
=
null
;
ImageResponse
.
Source
=
null
;
}
}
}
}
private
void
ButtonProxyOnOff_OnClick
(
object
sender
,
RoutedEventArgs
e
)
{
var
button
=
(
ToggleButton
)
sender
;
if
(
button
.
IsChecked
==
true
)
{
proxyServer
.
SetAsSystemProxy
((
ExplicitProxyEndPoint
)
proxyServer
.
ProxyEndPoints
[
0
],
ProxyProtocolType
.
AllHttp
);
}
else
{
proxyServer
.
RestoreOriginalProxySettings
();
}
}
}
}
}
}
src/Titanium.Web.Proxy/ExplicitClientHandler.cs
View file @
d90adbb1
...
@@ -265,8 +265,8 @@ namespace Titanium.Web.Proxy
...
@@ -265,8 +265,8 @@ namespace Titanium.Web.Proxy
try
try
{
{
await
clientStream
.
ReadAsync
(
data
,
0
,
available
,
cancellationToken
);
// clientStream.Available should be at most BufferSize because it is using the same buffer size
// clientStream.Available should be at most BufferSize because it is using the same buffer size
await
clientStream
.
ReadAsync
(
data
,
0
,
available
,
cancellationToken
);
await
connection
.
StreamWriter
.
WriteAsync
(
data
,
0
,
available
,
true
,
cancellationToken
);
await
connection
.
StreamWriter
.
WriteAsync
(
data
,
0
,
available
,
true
,
cancellationToken
);
}
}
finally
finally
...
@@ -279,11 +279,14 @@ namespace Titanium.Web.Proxy
...
@@ -279,11 +279,14 @@ namespace Titanium.Web.Proxy
((
ConnectResponse
)
connectArgs
.
HttpClient
.
Response
).
ServerHelloInfo
=
serverHelloInfo
;
((
ConnectResponse
)
connectArgs
.
HttpClient
.
Response
).
ServerHelloInfo
=
serverHelloInfo
;
}
}
if
(!
clientStream
.
IsClosed
&&
!
connection
.
Stream
.
IsClosed
)
{
await
TcpHelper
.
SendRaw
(
clientStream
,
connection
.
Stream
,
BufferPool
,
BufferSize
,
await
TcpHelper
.
SendRaw
(
clientStream
,
connection
.
Stream
,
BufferPool
,
BufferSize
,
(
buffer
,
offset
,
count
)
=>
{
connectArgs
.
OnDataSent
(
buffer
,
offset
,
count
);
},
(
buffer
,
offset
,
count
)
=>
{
connectArgs
.
OnDataSent
(
buffer
,
offset
,
count
);
},
(
buffer
,
offset
,
count
)
=>
{
connectArgs
.
OnDataReceived
(
buffer
,
offset
,
count
);
},
(
buffer
,
offset
,
count
)
=>
{
connectArgs
.
OnDataReceived
(
buffer
,
offset
,
count
);
},
connectArgs
.
CancellationTokenSource
,
ExceptionFunc
);
connectArgs
.
CancellationTokenSource
,
ExceptionFunc
);
}
}
}
finally
finally
{
{
await
tcpConnectionFactory
.
Release
(
connection
,
true
);
await
tcpConnectionFactory
.
Release
(
connection
,
true
);
...
...
src/Titanium.Web.Proxy/Network/Tcp/TcpConnectionFactory.cs
View file @
d90adbb1
...
@@ -481,6 +481,7 @@ namespace Titanium.Web.Proxy.Network.Tcp
...
@@ -481,6 +481,7 @@ namespace Titanium.Web.Proxy.Network.Tcp
{
{
try
try
{
{
var
cutOff
=
DateTime
.
Now
.
AddSeconds
(-
1
*
Server
.
ConnectionTimeOutSeconds
);
foreach
(
var
item
in
cache
)
foreach
(
var
item
in
cache
)
{
{
var
queue
=
item
.
Value
;
var
queue
=
item
.
Value
;
...
@@ -489,7 +490,6 @@ namespace Titanium.Web.Proxy.Network.Tcp
...
@@ -489,7 +490,6 @@ namespace Titanium.Web.Proxy.Network.Tcp
{
{
if
(
queue
.
TryDequeue
(
out
var
connection
))
if
(
queue
.
TryDequeue
(
out
var
connection
))
{
{
var
cutOff
=
DateTime
.
Now
.
AddSeconds
(-
1
*
Server
.
ConnectionTimeOutSeconds
);
if
(!
Server
.
EnableConnectionPool
if
(!
Server
.
EnableConnectionPool
||
connection
.
LastAccess
<
cutOff
)
||
connection
.
LastAccess
<
cutOff
)
{
{
...
@@ -512,7 +512,7 @@ namespace Titanium.Web.Proxy.Network.Tcp
...
@@ -512,7 +512,7 @@ namespace Titanium.Web.Proxy.Network.Tcp
var
emptyKeys
=
cache
.
Where
(
x
=>
x
.
Value
.
Count
==
0
).
Select
(
x
=>
x
.
Key
).
ToList
();
var
emptyKeys
=
cache
.
Where
(
x
=>
x
.
Value
.
Count
==
0
).
Select
(
x
=>
x
.
Key
).
ToList
();
foreach
(
string
key
in
emptyKeys
)
foreach
(
string
key
in
emptyKeys
)
{
{
cache
.
TryRemove
(
key
,
out
var
_
);
cache
.
TryRemove
(
key
,
out
_
);
}
}
}
}
finally
finally
...
...
src/Titanium.Web.Proxy/ProxyServer.cs
View file @
d90adbb1
...
@@ -516,6 +516,20 @@ namespace Titanium.Web.Proxy
...
@@ -516,6 +516,20 @@ namespace Titanium.Web.Proxy
DisableSystemProxy
(
ProxyProtocolType
.
Https
);
DisableSystemProxy
(
ProxyProtocolType
.
Https
);
}
}
/// <summary>
/// Restores the original proxy settings.
/// </summary>
public
void
RestoreOriginalProxySettings
()
{
if
(!
RunTime
.
IsWindows
)
{
throw
new
NotSupportedException
(
@"Setting system proxy settings are only supported in Windows.
Please manually configure your operating system to use this proxy's port and address."
);
}
systemProxySettingsManager
.
RestoreOriginalSettings
();
}
/// <summary>
/// <summary>
/// Clear the specified proxy setting for current machine.
/// Clear the specified proxy setting for current machine.
/// </summary>
/// </summary>
...
@@ -524,7 +538,7 @@ namespace Titanium.Web.Proxy
...
@@ -524,7 +538,7 @@ namespace Titanium.Web.Proxy
if
(!
RunTime
.
IsWindows
)
if
(!
RunTime
.
IsWindows
)
{
{
throw
new
NotSupportedException
(
@"Setting system proxy settings are only supported in Windows.
throw
new
NotSupportedException
(
@"Setting system proxy settings are only supported in Windows.
Please manually conf
ugure you
operating system to use this proxy's port and address."
);
Please manually conf
igure your
operating system to use this proxy's port and address."
);
}
}
systemProxySettingsManager
.
RemoveProxy
(
protocolType
);
systemProxySettingsManager
.
RemoveProxy
(
protocolType
);
...
...
src/Titanium.Web.Proxy/RequestHandler.cs
View file @
d90adbb1
...
@@ -65,6 +65,11 @@ namespace Titanium.Web.Proxy
...
@@ -65,6 +65,11 @@ namespace Titanium.Web.Proxy
// (assuming HTTP connection is kept alive by client)
// (assuming HTTP connection is kept alive by client)
while
(
true
)
while
(
true
)
{
{
if
(
clientStream
.
IsClosed
)
{
return
;
}
// read the request line
// read the request line
string
httpCmd
=
await
clientStream
.
ReadLineAsync
(
cancellationToken
);
string
httpCmd
=
await
clientStream
.
ReadLineAsync
(
cancellationToken
);
...
@@ -255,11 +260,11 @@ namespace Titanium.Web.Proxy
...
@@ -255,11 +260,11 @@ namespace Titanium.Web.Proxy
throw
new
Exception
(
"Session was terminated by user."
);
throw
new
Exception
(
"Session was terminated by user."
);
}
}
//Release server connection for each HTTP session instead of per client connection.
//
Release server connection for each HTTP session instead of per client connection.
//This will be more efficient especially when client is idly holding server connection
//
This will be more efficient especially when client is idly holding server connection
//between sessions without using it.
//
between sessions without using it.
//Do not release authenticated connections for performance reasons.
//
Do not release authenticated connections for performance reasons.
//Otherwise it will keep authenticating per session.
//
Otherwise it will keep authenticating per session.
if
(
EnableConnectionPool
&&
connection
!=
null
if
(
EnableConnectionPool
&&
connection
!=
null
&&
!
connection
.
IsWinAuthenticated
)
&&
!
connection
.
IsWinAuthenticated
)
{
{
...
...
src/Titanium.Web.Proxy/StreamExtended/BufferPool/DefaultBufferPool.cs
View file @
d90adbb1
using
System.Collections.Concurrent
;
using
System.Buffers
;
using
System.Collections.Concurrent
;
namespace
Titanium.Web.Proxy.StreamExtended.BufferPool
namespace
Titanium.Web.Proxy.StreamExtended.BufferPool
{
{
...
@@ -10,8 +11,6 @@ namespace Titanium.Web.Proxy.StreamExtended.BufferPool
...
@@ -10,8 +11,6 @@ namespace Titanium.Web.Proxy.StreamExtended.BufferPool
/// </summary>
/// </summary>
public
class
DefaultBufferPool
:
IBufferPool
public
class
DefaultBufferPool
:
IBufferPool
{
{
private
readonly
ConcurrentStack
<
byte
[
]>
buffers
=
new
ConcurrentStack
<
byte
[
]>
();
/// <summary>
/// <summary>
/// Gets a buffer.
/// Gets a buffer.
/// </summary>
/// </summary>
...
@@ -19,12 +18,7 @@ namespace Titanium.Web.Proxy.StreamExtended.BufferPool
...
@@ -19,12 +18,7 @@ namespace Titanium.Web.Proxy.StreamExtended.BufferPool
/// <returns></returns>
/// <returns></returns>
public
byte
[]
GetBuffer
(
int
bufferSize
)
public
byte
[]
GetBuffer
(
int
bufferSize
)
{
{
if
(!
buffers
.
TryPop
(
out
var
buffer
)
||
buffer
.
Length
!=
bufferSize
)
return
ArrayPool
<
byte
>.
Shared
.
Rent
(
bufferSize
);
{
buffer
=
new
byte
[
bufferSize
];
}
return
buffer
;
}
}
/// <summary>
/// <summary>
...
@@ -33,15 +27,11 @@ namespace Titanium.Web.Proxy.StreamExtended.BufferPool
...
@@ -33,15 +27,11 @@ namespace Titanium.Web.Proxy.StreamExtended.BufferPool
/// <param name="buffer">The buffer.</param>
/// <param name="buffer">The buffer.</param>
public
void
ReturnBuffer
(
byte
[]
buffer
)
public
void
ReturnBuffer
(
byte
[]
buffer
)
{
{
if
(
buffer
!=
null
)
ArrayPool
<
byte
>.
Shared
.
Return
(
buffer
);
{
buffers
.
Push
(
buffer
);
}
}
}
public
void
Dispose
()
public
void
Dispose
()
{
{
buffers
.
Clear
();
}
}
}
}
}
}
src/Titanium.Web.Proxy/StreamExtended/BufferPool/IBufferPool.cs
View file @
d90adbb1
...
@@ -9,6 +9,7 @@ namespace Titanium.Web.Proxy.StreamExtended.BufferPool
...
@@ -9,6 +9,7 @@ namespace Titanium.Web.Proxy.StreamExtended.BufferPool
public
interface
IBufferPool
:
IDisposable
public
interface
IBufferPool
:
IDisposable
{
{
byte
[]
GetBuffer
(
int
bufferSize
);
byte
[]
GetBuffer
(
int
bufferSize
);
void
ReturnBuffer
(
byte
[]
buffer
);
void
ReturnBuffer
(
byte
[]
buffer
);
}
}
}
}
src/Titanium.Web.Proxy/StreamExtended/Network/CustomBufferedStream.cs
View file @
d90adbb1
This diff is collapsed.
Click to expand it.
src/Titanium.Web.Proxy/StreamExtended/Network/TaskResult.cs
0 → 100644
View file @
d90adbb1
using
System
;
using
System.Threading
;
using
System.Threading.Tasks
;
namespace
Titanium.Web.Proxy.StreamExtended.Network
{
/// <summary>
/// Mimic a Task but you can set AsyncState
/// </summary>
/// <typeparam name="T"></typeparam>
public
class
TaskResult
:
IAsyncResult
{
Task
Task
;
readonly
object
asyncState
;
public
TaskResult
(
Task
pTask
,
object
state
)
{
Task
=
pTask
;
asyncState
=
state
;
}
public
object
AsyncState
=>
asyncState
;
public
WaitHandle
AsyncWaitHandle
=>
((
IAsyncResult
)
Task
).
AsyncWaitHandle
;
public
bool
CompletedSynchronously
=>
((
IAsyncResult
)
Task
).
CompletedSynchronously
;
public
bool
IsCompleted
=>
Task
.
IsCompleted
;
public
void
GetResult
()
{
this
.
Task
.
GetAwaiter
().
GetResult
();
}
}
/// <summary>
/// Mimic a Task<T> but you can set AsyncState
/// </summary>
/// <typeparam name="T"></typeparam>
public
class
TaskResult
<
T
>
:
IAsyncResult
{
Task
<
T
>
Task
;
readonly
object
asyncState
;
public
TaskResult
(
Task
<
T
>
pTask
,
object
state
)
{
Task
=
pTask
;
asyncState
=
state
;
}
public
object
AsyncState
=>
asyncState
;
public
WaitHandle
AsyncWaitHandle
=>
((
IAsyncResult
)
Task
).
AsyncWaitHandle
;
public
bool
CompletedSynchronously
=>
((
IAsyncResult
)
Task
).
CompletedSynchronously
;
public
bool
IsCompleted
=>
Task
.
IsCompleted
;
public
T
Result
=>
Task
.
Result
;
}
}
src/Titanium.Web.Proxy/Titanium.Web.Proxy.Mono.csproj
View file @
d90adbb1
...
@@ -14,6 +14,7 @@
...
@@ -14,6 +14,7 @@
<ItemGroup>
<ItemGroup>
<PackageReference Include="BrotliSharpLib" Version="0.3.3" />
<PackageReference Include="BrotliSharpLib" Version="0.3.3" />
<PackageReference Include="Portable.BouncyCastle" Version="1.8.5" />
<PackageReference Include="Portable.BouncyCastle" Version="1.8.5" />
<PackageReference Include="System.Buffers" Version="4.5.0" />
</ItemGroup>
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net461'">
<ItemGroup Condition="'$(TargetFramework)' == 'net461'">
...
...
src/Titanium.Web.Proxy/Titanium.Web.Proxy.NetCore.csproj
View file @
d90adbb1
...
@@ -14,6 +14,7 @@
...
@@ -14,6 +14,7 @@
<ItemGroup>
<ItemGroup>
<PackageReference Include="BrotliSharpLib" Version="0.3.3" />
<PackageReference Include="BrotliSharpLib" Version="0.3.3" />
<PackageReference Include="Portable.BouncyCastle" Version="1.8.5" />
<PackageReference Include="Portable.BouncyCastle" Version="1.8.5" />
<PackageReference Include="System.Buffers" Version="4.5.0" />
</ItemGroup>
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
...
...
src/Titanium.Web.Proxy/Titanium.Web.Proxy.csproj
View file @
d90adbb1
...
@@ -14,6 +14,7 @@
...
@@ -14,6 +14,7 @@
<ItemGroup>
<ItemGroup>
<PackageReference Include="BrotliSharpLib" Version="0.3.3" />
<PackageReference Include="BrotliSharpLib" Version="0.3.3" />
<PackageReference Include="Portable.BouncyCastle" Version="1.8.5" />
<PackageReference Include="Portable.BouncyCastle" Version="1.8.5" />
<PackageReference Include="System.Buffers" Version="4.5.0" />
</ItemGroup>
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
...
...
src/Titanium.Web.Proxy/Titanium.Web.Proxy.nuspec
View file @
d90adbb1
...
@@ -18,12 +18,14 @@
...
@@ -18,12 +18,14 @@
<dependency
id=
"Portable.BouncyCastle"
version=
"1.8.5"
/>
<dependency
id=
"Portable.BouncyCastle"
version=
"1.8.5"
/>
<dependency
id=
"BrotliSharpLib"
version=
"0.3.3"
/>
<dependency
id=
"BrotliSharpLib"
version=
"0.3.3"
/>
<dependency
id=
"Microsoft.Win32.Registry"
version=
"4.5.0"
/>
<dependency
id=
"Microsoft.Win32.Registry"
version=
"4.5.0"
/>
<dependency
id=
"System.Buffers"
version=
"4.5.0"
/>
<dependency
id=
"System.Security.Principal.Windows"
version=
"4.5.1"
/>
<dependency
id=
"System.Security.Principal.Windows"
version=
"4.5.1"
/>
</group>
</group>
<group
targetFramework=
"netcoreapp2.1"
>
<group
targetFramework=
"netcoreapp2.1"
>
<dependency
id=
"Portable.BouncyCastle"
version=
"1.8.5"
/>
<dependency
id=
"Portable.BouncyCastle"
version=
"1.8.5"
/>
<dependency
id=
"BrotliSharpLib"
version=
"0.3.3"
/>
<dependency
id=
"BrotliSharpLib"
version=
"0.3.3"
/>
<dependency
id=
"Microsoft.Win32.Registry"
version=
"4.5.0"
/>
<dependency
id=
"Microsoft.Win32.Registry"
version=
"4.5.0"
/>
<dependency
id=
"System.Buffers"
version=
"4.5.0"
/>
<dependency
id=
"System.Security.Principal.Windows"
version=
"4.5.1"
/>
<dependency
id=
"System.Security.Principal.Windows"
version=
"4.5.1"
/>
</group>
</group>
</dependencies>
</dependencies>
...
...
src/Titanium.Web.Proxy/TransparentClientHandler.cs
View file @
d90adbb1
...
@@ -103,7 +103,6 @@ namespace Titanium.Web.Proxy
...
@@ -103,7 +103,6 @@ namespace Titanium.Web.Proxy
try
try
{
{
CustomBufferedStream
serverStream
=
null
;
int
available
=
clientStream
.
Available
;
int
available
=
clientStream
.
Available
;
if
(
available
>
0
)
if
(
available
>
0
)
...
@@ -114,9 +113,7 @@ namespace Titanium.Web.Proxy
...
@@ -114,9 +113,7 @@ namespace Titanium.Web.Proxy
{
{
// clientStream.Available should be at most BufferSize because it is using the same buffer size
// clientStream.Available should be at most BufferSize because it is using the same buffer size
await
clientStream
.
ReadAsync
(
data
,
0
,
available
,
cancellationToken
);
await
clientStream
.
ReadAsync
(
data
,
0
,
available
,
cancellationToken
);
serverStream
=
connection
.
Stream
;
await
connection
.
StreamWriter
.
WriteAsync
(
data
,
0
,
available
,
true
,
cancellationToken
);
await
serverStream
.
WriteAsync
(
data
,
0
,
available
,
cancellationToken
);
await
serverStream
.
FlushAsync
(
cancellationToken
);
}
}
finally
finally
{
{
...
@@ -124,9 +121,12 @@ namespace Titanium.Web.Proxy
...
@@ -124,9 +121,12 @@ namespace Titanium.Web.Proxy
}
}
}
}
await
TcpHelper
.
SendRaw
(
clientStream
,
serverStream
,
BufferPool
,
BufferSize
,
if
(!
clientStream
.
IsClosed
&&
!
connection
.
Stream
.
IsClosed
)
{
await
TcpHelper
.
SendRaw
(
clientStream
,
connection
.
Stream
,
BufferPool
,
BufferSize
,
null
,
null
,
cancellationTokenSource
,
ExceptionFunc
);
null
,
null
,
cancellationTokenSource
,
ExceptionFunc
);
}
}
}
finally
finally
{
{
await
tcpConnectionFactory
.
Release
(
connection
,
true
);
await
tcpConnectionFactory
.
Release
(
connection
,
true
);
...
...
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