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
1acc1ad8
Commit
1acc1ad8
authored
Oct 28, 2016
by
Jehonathan
Committed by
GitHub
Oct 28, 2016
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #138 from aricih/release
ProcessId is fixed on HttpWebClient
parents
13bd6bc0
78aa6639
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
1096 additions
and
1014 deletions
+1096
-1014
SessionEventArgs.cs
Titanium.Web.Proxy/EventArguments/SessionEventArgs.cs
+447
-448
Tcp.cs
Titanium.Web.Proxy/Helpers/Tcp.cs
+194
-188
HttpWebClient.cs
Titanium.Web.Proxy/Http/HttpWebClient.cs
+221
-238
EndPoint.cs
Titanium.Web.Proxy/Models/EndPoint.cs
+68
-64
ExternalProxy.cs
Titanium.Web.Proxy/Models/ExternalProxy.cs
+48
-13
TcpConnection.cs
Titanium.Web.Proxy/Network/TcpConnection.cs
+1
-1
TcpConnectionFactory.cs
Titanium.Web.Proxy/Network/TcpConnectionFactory.cs
+4
-7
ProxyServer.cs
Titanium.Web.Proxy/ProxyServer.cs
+34
-1
RequestHandler.cs
Titanium.Web.Proxy/RequestHandler.cs
+36
-20
TcpRow.cs
Titanium.Web.Proxy/Tcp/TcpRow.cs
+43
-34
No files found.
Titanium.Web.Proxy/EventArguments/SessionEventArgs.cs
View file @
1acc1ad8
...
@@ -63,7 +63,6 @@ namespace Titanium.Web.Proxy.EventArguments
...
@@ -63,7 +63,6 @@ namespace Titanium.Web.Proxy.EventArguments
public
ExternalProxy
CustomUpStreamHttpsProxyUsed
{
get
;
set
;
}
public
ExternalProxy
CustomUpStreamHttpsProxyUsed
{
get
;
set
;
}
/// <summary>
/// <summary>
/// Constructor to initialize the proxy
/// Constructor to initialize the proxy
/// </summary>
/// </summary>
...
...
Titanium.Web.Proxy/Helpers/Tcp.cs
View file @
1acc1ad8
...
@@ -15,9 +15,16 @@ using Titanium.Web.Proxy.Tcp;
...
@@ -15,9 +15,16 @@ using Titanium.Web.Proxy.Tcp;
namespace
Titanium.Web.Proxy.Helpers
namespace
Titanium.Web.Proxy.Helpers
{
{
internal
enum
IpVersion
{
Ipv4
=
1
,
Ipv6
=
2
,
}
internal
partial
class
NativeMethods
internal
partial
class
NativeMethods
{
{
internal
const
int
AfInet
=
2
;
internal
const
int
AfInet
=
2
;
internal
const
int
AfInet6
=
23
;
internal
enum
TcpTableType
internal
enum
TcpTableType
{
{
...
@@ -75,19 +82,21 @@ namespace Titanium.Web.Proxy.Helpers
...
@@ -75,19 +82,21 @@ namespace Titanium.Web.Proxy.Helpers
/// Gets the extended TCP table.
/// Gets the extended TCP table.
/// </summary>
/// </summary>
/// <returns>Collection of <see cref="TcpRow"/>.</returns>
/// <returns>Collection of <see cref="TcpRow"/>.</returns>
internal
static
TcpTable
GetExtendedTcpTable
(
)
internal
static
TcpTable
GetExtendedTcpTable
(
IpVersion
ipVersion
)
{
{
List
<
TcpRow
>
tcpRows
=
new
List
<
TcpRow
>();
List
<
TcpRow
>
tcpRows
=
new
List
<
TcpRow
>();
IntPtr
tcpTable
=
IntPtr
.
Zero
;
IntPtr
tcpTable
=
IntPtr
.
Zero
;
int
tcpTableLength
=
0
;
int
tcpTableLength
=
0
;
if
(
NativeMethods
.
GetExtendedTcpTable
(
tcpTable
,
ref
tcpTableLength
,
false
,
NativeMethods
.
AfInet
,
(
int
)
NativeMethods
.
TcpTableType
.
OwnerPidAll
,
0
)
!=
0
)
var
ipVersionValue
=
ipVersion
==
IpVersion
.
Ipv4
?
NativeMethods
.
AfInet
:
NativeMethods
.
AfInet6
;
if
(
NativeMethods
.
GetExtendedTcpTable
(
tcpTable
,
ref
tcpTableLength
,
false
,
ipVersionValue
,
(
int
)
NativeMethods
.
TcpTableType
.
OwnerPidAll
,
0
)
!=
0
)
{
{
try
try
{
{
tcpTable
=
Marshal
.
AllocHGlobal
(
tcpTableLength
);
tcpTable
=
Marshal
.
AllocHGlobal
(
tcpTableLength
);
if
(
NativeMethods
.
GetExtendedTcpTable
(
tcpTable
,
ref
tcpTableLength
,
true
,
NativeMethods
.
AfInet
,
(
int
)
NativeMethods
.
TcpTableType
.
OwnerPidAll
,
0
)
==
0
)
if
(
NativeMethods
.
GetExtendedTcpTable
(
tcpTable
,
ref
tcpTableLength
,
true
,
ipVersionValue
,
(
int
)
NativeMethods
.
TcpTableType
.
OwnerPidAll
,
0
)
==
0
)
{
{
NativeMethods
.
TcpTable
table
=
(
NativeMethods
.
TcpTable
)
Marshal
.
PtrToStructure
(
tcpTable
,
typeof
(
NativeMethods
.
TcpTable
));
NativeMethods
.
TcpTable
table
=
(
NativeMethods
.
TcpTable
)
Marshal
.
PtrToStructure
(
tcpTable
,
typeof
(
NativeMethods
.
TcpTable
));
...
@@ -170,11 +179,8 @@ namespace Titanium.Web.Proxy.Helpers
...
@@ -170,11 +179,8 @@ namespace Titanium.Web.Proxy.Helpers
{
{
Stream
tunnelStream
=
tcpConnection
.
Stream
;
Stream
tunnelStream
=
tcpConnection
.
Stream
;
Task
sendRelay
;
//Now async relay all server=>client & client=>server data
//Now async relay all server=>client & client=>server data
sendRelay
=
clientStream
.
CopyToAsync
(
sb
?.
ToString
()
??
string
.
Empty
,
tunnelStream
);
var
sendRelay
=
clientStream
.
CopyToAsync
(
sb
?.
ToString
()
??
string
.
Empty
,
tunnelStream
);
var
receiveRelay
=
tunnelStream
.
CopyToAsync
(
string
.
Empty
,
clientStream
);
var
receiveRelay
=
tunnelStream
.
CopyToAsync
(
string
.
Empty
,
clientStream
);
...
...
Titanium.Web.Proxy/Http/HttpWebClient.cs
View file @
1acc1ad8
using
System
;
using
System
;
using
System.Collections.Generic
;
using
System.Collections.Generic
;
using
System.IO
;
using
System.IO
;
using
System.Linq
;
using
System.Text
;
using
System.Text
;
using
System.Threading.Tasks
;
using
System.Threading.Tasks
;
using
Titanium.Web.Proxy.Helpers
;
using
Titanium.Web.Proxy.Models
;
using
Titanium.Web.Proxy.Models
;
using
Titanium.Web.Proxy.Network
;
using
Titanium.Web.Proxy.Network
;
using
Titanium.Web.Proxy.Shared
;
using
Titanium.Web.Proxy.Shared
;
using
Titanium.Web.Proxy.Tcp
;
namespace
Titanium.Web.Proxy.Http
namespace
Titanium.Web.Proxy.Http
{
{
...
@@ -32,21 +29,7 @@ namespace Titanium.Web.Proxy.Http
...
@@ -32,21 +29,7 @@ namespace Titanium.Web.Proxy.Http
/// <summary>
/// <summary>
/// PID of the process that is created the current session
/// PID of the process that is created the current session
/// </summary>
/// </summary>
public
int
ProcessId
public
int
ProcessId
{
get
;
internal
set
;
}
{
get
{
if
(
processId
==
0
)
{
TcpRow
tcpRow
=
TcpHelper
.
GetExtendedTcpTable
().
TcpRows
.
FirstOrDefault
(
row
=>
row
.
LocalEndPoint
.
Port
==
ServerConnection
.
port
);
processId
=
tcpRow
?.
ProcessId
??
-
1
;
}
return
processId
;
}
}
/// <summary>
/// <summary>
/// Is Https?
/// Is Https?
...
...
Titanium.Web.Proxy/Models/EndPoint.cs
View file @
1acc1ad8
...
@@ -20,6 +20,10 @@ namespace Titanium.Web.Proxy.Models
...
@@ -20,6 +20,10 @@ namespace Titanium.Web.Proxy.Models
public
int
Port
{
get
;
internal
set
;
}
public
int
Port
{
get
;
internal
set
;
}
public
bool
EnableSsl
{
get
;
internal
set
;
}
public
bool
EnableSsl
{
get
;
internal
set
;
}
public
bool
IpV6Enabled
=>
IpAddress
==
IPAddress
.
IPv6Any
||
IpAddress
==
IPAddress
.
IPv6Loopback
||
IpAddress
==
IPAddress
.
IPv6None
;
internal
TcpListener
listener
{
get
;
set
;
}
internal
TcpListener
listener
{
get
;
set
;
}
}
}
...
...
Titanium.Web.Proxy/Models/ExternalProxy.cs
View file @
1acc1ad8
namespace
Titanium.Web.Proxy.Models
using
System
;
using
System.Net
;
namespace
Titanium.Web.Proxy.Models
{
{
/// <summary>
/// <summary>
/// An upstream proxy this proxy uses if any
/// An upstream proxy this proxy uses if any
/// </summary>
/// </summary>
public
class
ExternalProxy
public
class
ExternalProxy
{
{
public
string
UserName
{
get
;
set
;
}
private
static
readonly
Lazy
<
NetworkCredential
>
DefaultCredentials
=
new
Lazy
<
NetworkCredential
>(()
=>
CredentialCache
.
DefaultNetworkCredentials
);
public
string
Password
{
get
;
set
;
}
private
string
userName
;
private
string
password
;
public
bool
UseDefaultCredentials
{
get
;
set
;
}
public
string
UserName
{
get
{
return
UseDefaultCredentials
?
DefaultCredentials
.
Value
.
UserName
:
userName
;
}
set
{
userName
=
value
;
if
(
DefaultCredentials
.
Value
.
UserName
!=
userName
)
{
UseDefaultCredentials
=
false
;
}
}
}
public
string
Password
{
get
{
return
UseDefaultCredentials
?
DefaultCredentials
.
Value
.
Password
:
password
;
}
set
{
password
=
value
;
if
(
DefaultCredentials
.
Value
.
Password
!=
password
)
{
UseDefaultCredentials
=
false
;
}
}
}
public
string
HostName
{
get
;
set
;
}
public
string
HostName
{
get
;
set
;
}
public
int
Port
{
get
;
set
;
}
public
int
Port
{
get
;
set
;
}
}
}
...
...
Titanium.Web.Proxy/Network/TcpConnection.cs
View file @
1acc1ad8
...
@@ -16,7 +16,7 @@ namespace Titanium.Web.Proxy.Network
...
@@ -16,7 +16,7 @@ namespace Titanium.Web.Proxy.Network
internal
ExternalProxy
UpStreamHttpsProxy
{
get
;
set
;
}
internal
ExternalProxy
UpStreamHttpsProxy
{
get
;
set
;
}
internal
string
HostName
{
get
;
set
;
}
internal
string
HostName
{
get
;
set
;
}
internal
int
p
ort
{
get
;
set
;
}
internal
int
P
ort
{
get
;
set
;
}
internal
bool
IsHttps
{
get
;
set
;
}
internal
bool
IsHttps
{
get
;
set
;
}
...
...
Titanium.Web.Proxy/Network/TcpConnectionFactory.cs
View file @
1acc1ad8
...
@@ -49,7 +49,7 @@ namespace Titanium.Web.Proxy.Network
...
@@ -49,7 +49,7 @@ namespace Titanium.Web.Proxy.Network
SslStream
sslStream
=
null
;
SslStream
sslStream
=
null
;
//If this proxy uses another external proxy then create a tunnel request for HTTPS connections
//If this proxy uses another external proxy then create a tunnel request for HTTPS connections
if
(
externalHttpsProxy
!=
null
)
if
(
externalHttpsProxy
!=
null
&&
externalHttpsProxy
.
HostName
!=
remoteHostName
)
{
{
client
=
new
TcpClient
(
externalHttpsProxy
.
HostName
,
externalHttpsProxy
.
Port
);
client
=
new
TcpClient
(
externalHttpsProxy
.
HostName
,
externalHttpsProxy
.
Port
);
stream
=
client
.
GetStream
();
stream
=
client
.
GetStream
();
...
@@ -100,17 +100,14 @@ namespace Titanium.Web.Proxy.Network
...
@@ -100,17 +100,14 @@ namespace Titanium.Web.Proxy.Network
}
}
catch
catch
{
{
if
(
sslStream
!=
null
)
sslStream
?.
Dispose
();
{
sslStream
.
Dispose
();
}
throw
;
throw
;
}
}
}
}
else
else
{
{
if
(
externalHttpProxy
!=
null
)
if
(
externalHttpProxy
!=
null
&&
externalHttpProxy
.
HostName
!=
remoteHostName
)
{
{
client
=
new
TcpClient
(
externalHttpProxy
.
HostName
,
externalHttpProxy
.
Port
);
client
=
new
TcpClient
(
externalHttpProxy
.
HostName
,
externalHttpProxy
.
Port
);
stream
=
client
.
GetStream
();
stream
=
client
.
GetStream
();
...
@@ -133,7 +130,7 @@ namespace Titanium.Web.Proxy.Network
...
@@ -133,7 +130,7 @@ namespace Titanium.Web.Proxy.Network
UpStreamHttpProxy
=
externalHttpProxy
,
UpStreamHttpProxy
=
externalHttpProxy
,
UpStreamHttpsProxy
=
externalHttpsProxy
,
UpStreamHttpsProxy
=
externalHttpsProxy
,
HostName
=
remoteHostName
,
HostName
=
remoteHostName
,
p
ort
=
remotePort
,
P
ort
=
remotePort
,
IsHttps
=
isHttps
,
IsHttps
=
isHttps
,
TcpClient
=
client
,
TcpClient
=
client
,
StreamReader
=
new
CustomBinaryReader
(
stream
),
StreamReader
=
new
CustomBinaryReader
(
stream
),
...
...
Titanium.Web.Proxy/ProxyServer.cs
View file @
1acc1ad8
...
@@ -186,6 +186,11 @@ namespace Titanium.Web.Proxy
...
@@ -186,6 +186,11 @@ namespace Titanium.Web.Proxy
/// </summary>
/// </summary>
public
bool
ProxyRunning
=>
proxyRunning
;
public
bool
ProxyRunning
=>
proxyRunning
;
/// <summary>
/// Gets or sets a value indicating whether requests will be chained to upstream gateway.
/// </summary>
public
bool
ForwardToUpstreamGateway
{
get
;
set
;
}
/// <summary>
/// <summary>
/// Constructor
/// Constructor
/// </summary>
/// </summary>
...
@@ -348,6 +353,12 @@ namespace Titanium.Web.Proxy
...
@@ -348,6 +353,12 @@ namespace Titanium.Web.Proxy
certificateCacheManager
.
TrustRootCertificate
();
certificateCacheManager
.
TrustRootCertificate
();
}
}
if
(
ForwardToUpstreamGateway
&&
GetCustomUpStreamHttpProxyFunc
==
null
&&
GetCustomUpStreamHttpsProxyFunc
==
null
)
{
GetCustomUpStreamHttpProxyFunc
=
GetSystemUpStreamProxy
;
GetCustomUpStreamHttpsProxyFunc
=
GetSystemUpStreamProxy
;
}
foreach
(
var
endPoint
in
ProxyEndPoints
)
foreach
(
var
endPoint
in
ProxyEndPoints
)
{
{
Listen
(
endPoint
);
Listen
(
endPoint
);
...
@@ -358,6 +369,28 @@ namespace Titanium.Web.Proxy
...
@@ -358,6 +369,28 @@ namespace Titanium.Web.Proxy
proxyRunning
=
true
;
proxyRunning
=
true
;
}
}
/// <summary>
/// Gets the system up stream proxy.
/// </summary>
/// <param name="sessionEventArgs">The <see cref="SessionEventArgs"/> instance containing the event data.</param>
/// <returns><see cref="ExternalProxy"/> instance containing valid proxy configuration from PAC/WAPD scripts if any exists.</returns>
private
Task
<
ExternalProxy
>
GetSystemUpStreamProxy
(
SessionEventArgs
sessionEventArgs
)
{
// Use built-in WebProxy class to handle PAC/WAPD scripts.
var
systemProxyResolver
=
new
WebProxy
();
var
systemProxyUri
=
systemProxyResolver
.
GetProxy
(
sessionEventArgs
.
WebSession
.
Request
.
RequestUri
);
// TODO: Apply authorization
var
systemProxy
=
new
ExternalProxy
{
HostName
=
systemProxyUri
.
Host
,
Port
=
systemProxyUri
.
Port
};
return
Task
.
FromResult
(
systemProxy
);
}
/// <summary>
/// <summary>
/// Stop this proxy server
/// Stop this proxy server
/// </summary>
/// </summary>
...
...
Titanium.Web.Proxy/RequestHandler.cs
View file @
1acc1ad8
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
using
System.Collections.Generic
;
using
System.Collections.Generic
;
using
System.IO
;
using
System.IO
;
using
System.Linq
;
using
System.Linq
;
using
System.Net
;
using
System.Net.Security
;
using
System.Net.Security
;
using
System.Net.Sockets
;
using
System.Net.Sockets
;
using
System.Security.Authentication
;
using
System.Security.Authentication
;
...
@@ -16,7 +17,6 @@ using Titanium.Web.Proxy.Shared;
...
@@ -16,7 +17,6 @@ using Titanium.Web.Proxy.Shared;
using
Titanium.Web.Proxy.Http
;
using
Titanium.Web.Proxy.Http
;
using
System.Threading.Tasks
;
using
System.Threading.Tasks
;
using
Titanium.Web.Proxy.Extensions
;
using
Titanium.Web.Proxy.Extensions
;
using
System.Text
;
namespace
Titanium.Web.Proxy
namespace
Titanium.Web.Proxy
{
{
...
@@ -25,12 +25,33 @@ namespace Titanium.Web.Proxy
...
@@ -25,12 +25,33 @@ namespace Titanium.Web.Proxy
/// </summary>
/// </summary>
partial
class
ProxyServer
partial
class
ProxyServer
{
{
private
int
FindProcessIdFromLocalPort
(
int
port
,
IpVersion
ipVersion
)
{
var
tcpRow
=
TcpHelper
.
GetExtendedTcpTable
(
ipVersion
).
FirstOrDefault
(
row
=>
row
.
LocalEndPoint
.
Port
==
port
);
return
tcpRow
?.
ProcessId
??
0
;
}
private
int
GetProcessIdFromPort
(
int
port
,
bool
ipV6Enabled
)
{
var
processId
=
FindProcessIdFromLocalPort
(
port
,
IpVersion
.
Ipv4
);
if
(
processId
>
0
&&
!
ipV6Enabled
)
{
return
processId
;
}
return
FindProcessIdFromLocalPort
(
port
,
IpVersion
.
Ipv6
);
}
//This is called when client is aware of proxy
//This is called when client is aware of proxy
//So for HTTPS requests client would send CONNECT header to negotiate a secure tcp tunnel via proxy
//So for HTTPS requests client would send CONNECT header to negotiate a secure tcp tunnel via proxy
private
async
Task
HandleClient
(
ExplicitProxyEndPoint
endPoint
,
TcpClient
c
lient
)
private
async
Task
HandleClient
(
ExplicitProxyEndPoint
endPoint
,
TcpClient
tcpC
lient
)
{
{
Stream
clientStream
=
client
.
GetStream
();
var
processId
=
GetProcessIdFromPort
(((
IPEndPoint
)
tcpClient
.
Client
.
RemoteEndPoint
).
Port
,
endPoint
.
IpV6Enabled
);
Stream
clientStream
=
tcpClient
.
GetStream
();
clientStream
.
ReadTimeout
=
ConnectionTimeOutSeconds
*
1000
;
clientStream
.
ReadTimeout
=
ConnectionTimeOutSeconds
*
1000
;
clientStream
.
WriteTimeout
=
ConnectionTimeOutSeconds
*
1000
;
clientStream
.
WriteTimeout
=
ConnectionTimeOutSeconds
*
1000
;
...
@@ -145,7 +166,6 @@ namespace Titanium.Web.Proxy
...
@@ -145,7 +166,6 @@ namespace Titanium.Web.Proxy
//write back successfull CONNECT response
//write back successfull CONNECT response
await
WriteConnectResponse
(
clientStreamWriter
,
version
);
await
WriteConnectResponse
(
clientStreamWriter
,
version
);
await
TcpHelper
.
SendRaw
(
BUFFER_SIZE
,
ConnectionTimeOutSeconds
,
httpRemoteUri
.
Host
,
httpRemoteUri
.
Port
,
await
TcpHelper
.
SendRaw
(
BUFFER_SIZE
,
ConnectionTimeOutSeconds
,
httpRemoteUri
.
Host
,
httpRemoteUri
.
Port
,
httpCmd
,
version
,
null
,
httpCmd
,
version
,
null
,
false
,
SupportedSslProtocols
,
false
,
SupportedSslProtocols
,
...
@@ -157,7 +177,7 @@ namespace Titanium.Web.Proxy
...
@@ -157,7 +177,7 @@ namespace Titanium.Web.Proxy
return
;
return
;
}
}
//Now create the request
//Now create the request
await
HandleHttpSessionRequest
(
client
,
httpCmd
,
clientStream
,
clientStreamReader
,
clientStreamWriter
,
await
HandleHttpSessionRequest
(
tcpClient
,
processId
,
httpCmd
,
clientStream
,
clientStreamReader
,
clientStreamWriter
,
httpRemoteUri
.
Scheme
==
Uri
.
UriSchemeHttps
?
httpRemoteUri
.
Host
:
null
,
connectRequestHeaders
,
null
,
null
);
httpRemoteUri
.
Scheme
==
Uri
.
UriSchemeHttps
?
httpRemoteUri
.
Host
:
null
,
connectRequestHeaders
,
null
,
null
);
}
}
catch
(
Exception
ex
)
catch
(
Exception
ex
)
...
@@ -170,6 +190,8 @@ namespace Titanium.Web.Proxy
...
@@ -170,6 +190,8 @@ namespace Titanium.Web.Proxy
//So for HTTPS requests we would start SSL negotiation right away without expecting a CONNECT request from client
//So for HTTPS requests we would start SSL negotiation right away without expecting a CONNECT request from client
private
async
Task
HandleClient
(
TransparentProxyEndPoint
endPoint
,
TcpClient
tcpClient
)
private
async
Task
HandleClient
(
TransparentProxyEndPoint
endPoint
,
TcpClient
tcpClient
)
{
{
var
processId
=
GetProcessIdFromPort
(((
IPEndPoint
)
tcpClient
.
Client
.
RemoteEndPoint
).
Port
,
endPoint
.
IpV6Enabled
);
Stream
clientStream
=
tcpClient
.
GetStream
();
Stream
clientStream
=
tcpClient
.
GetStream
();
clientStream
.
ReadTimeout
=
ConnectionTimeOutSeconds
*
1000
;
clientStream
.
ReadTimeout
=
ConnectionTimeOutSeconds
*
1000
;
...
@@ -198,11 +220,8 @@ namespace Titanium.Web.Proxy
...
@@ -198,11 +220,8 @@ namespace Titanium.Web.Proxy
}
}
catch
(
Exception
)
catch
(
Exception
)
{
if
(
sslStream
!=
null
)
{
{
sslStream
.
Dispose
();
sslStream
.
Dispose
();
}
Dispose
(
sslStream
,
clientStreamReader
,
clientStreamWriter
,
null
);
Dispose
(
sslStream
,
clientStreamReader
,
clientStreamWriter
,
null
);
return
;
return
;
...
@@ -219,11 +238,10 @@ namespace Titanium.Web.Proxy
...
@@ -219,11 +238,10 @@ namespace Titanium.Web.Proxy
var
httpCmd
=
await
clientStreamReader
.
ReadLineAsync
();
var
httpCmd
=
await
clientStreamReader
.
ReadLineAsync
();
//Now create the request
//Now create the request
await
HandleHttpSessionRequest
(
tcpClient
,
httpCmd
,
clientStream
,
clientStreamReader
,
clientStreamWriter
,
await
HandleHttpSessionRequest
(
tcpClient
,
processId
,
httpCmd
,
clientStream
,
clientStreamReader
,
clientStreamWriter
,
endPoint
.
EnableSsl
?
endPoint
.
GenericCertificateName
:
null
,
null
);
endPoint
.
EnableSsl
?
endPoint
.
GenericCertificateName
:
null
,
null
);
}
}
private
async
Task
HandleHttpSessionRequestInternal
(
TcpConnection
connection
,
SessionEventArgs
args
,
ExternalProxy
customUpStreamHttpProxy
,
ExternalProxy
customUpStreamHttpsProxy
,
bool
CloseConnection
)
private
async
Task
HandleHttpSessionRequestInternal
(
TcpConnection
connection
,
SessionEventArgs
args
,
ExternalProxy
customUpStreamHttpProxy
,
ExternalProxy
customUpStreamHttpsProxy
,
bool
CloseConnection
)
{
{
try
try
...
@@ -256,10 +274,8 @@ namespace Titanium.Web.Proxy
...
@@ -256,10 +274,8 @@ namespace Titanium.Web.Proxy
customUpStreamHttpProxy
??
UpStreamHttpProxy
,
customUpStreamHttpsProxy
??
UpStreamHttpsProxy
,
args
.
ProxyClient
.
ClientStream
);
customUpStreamHttpProxy
??
UpStreamHttpProxy
,
customUpStreamHttpsProxy
??
UpStreamHttpsProxy
,
args
.
ProxyClient
.
ClientStream
);
}
}
args
.
WebSession
.
Request
.
RequestLocked
=
true
;
args
.
WebSession
.
Request
.
RequestLocked
=
true
;
//If request was cancelled by user then dispose the client
//If request was cancelled by user then dispose the client
if
(
args
.
WebSession
.
Request
.
CancelRequest
)
if
(
args
.
WebSession
.
Request
.
CancelRequest
)
{
{
...
@@ -344,23 +360,25 @@ namespace Titanium.Web.Proxy
...
@@ -344,23 +360,25 @@ namespace Titanium.Web.Proxy
return
;
return
;
}
}
if
(
CloseConnection
&&
connection
!=
null
)
if
(
CloseConnection
)
{
{
//dispose
//dispose
connection
.
Dispose
();
connection
?
.
Dispose
();
}
}
}
}
/// <summary>
/// <summary>
/// This is the core request handler method for a particular connection from client
/// This is the core request handler method for a particular connection from client
/// </summary>
/// </summary>
/// <param name="client"></param>
/// <param name="client"></param>
/// <param name="processId"></param>
/// <param name="httpCmd"></param>
/// <param name="httpCmd"></param>
/// <param name="clientStream"></param>
/// <param name="clientStream"></param>
/// <param name="clientStreamReader"></param>
/// <param name="clientStreamReader"></param>
/// <param name="clientStreamWriter"></param>
/// <param name="clientStreamWriter"></param>
/// <param name="httpsHostName"></param>
/// <param name="httpsHostName"></param>
/// <returns></returns>
/// <returns></returns>
private
async
Task
HandleHttpSessionRequest
(
TcpClient
client
,
string
httpCmd
,
Stream
clientStream
,
private
async
Task
HandleHttpSessionRequest
(
TcpClient
client
,
int
processId
,
string
httpCmd
,
Stream
clientStream
,
CustomBinaryReader
clientStreamReader
,
StreamWriter
clientStreamWriter
,
string
httpsHostName
,
List
<
HttpHeader
>
connectHeaders
,
ExternalProxy
customUpStreamHttpProxy
=
null
,
ExternalProxy
customUpStreamHttpsProxy
=
null
)
CustomBinaryReader
clientStreamReader
,
StreamWriter
clientStreamWriter
,
string
httpsHostName
,
List
<
HttpHeader
>
connectHeaders
,
ExternalProxy
customUpStreamHttpProxy
=
null
,
ExternalProxy
customUpStreamHttpsProxy
=
null
)
{
{
TcpConnection
connection
=
null
;
TcpConnection
connection
=
null
;
...
@@ -378,6 +396,8 @@ namespace Titanium.Web.Proxy
...
@@ -378,6 +396,8 @@ namespace Titanium.Web.Proxy
var
args
=
new
SessionEventArgs
(
BUFFER_SIZE
,
HandleHttpSessionResponse
);
var
args
=
new
SessionEventArgs
(
BUFFER_SIZE
,
HandleHttpSessionResponse
);
args
.
ProxyClient
.
TcpClient
=
client
;
args
.
ProxyClient
.
TcpClient
=
client
;
args
.
WebSession
.
ConnectHeaders
=
connectHeaders
;
args
.
WebSession
.
ConnectHeaders
=
connectHeaders
;
args
.
WebSession
.
ProcessId
=
processId
;
try
try
{
{
//break up the line into three components (method, remote URL & Http Version)
//break up the line into three components (method, remote URL & Http Version)
...
@@ -450,7 +470,6 @@ namespace Titanium.Web.Proxy
...
@@ -450,7 +470,6 @@ namespace Titanium.Web.Proxy
break
;
break
;
}
}
PrepareRequestHeaders
(
args
.
WebSession
.
Request
.
RequestHeaders
,
args
.
WebSession
);
PrepareRequestHeaders
(
args
.
WebSession
.
Request
.
RequestHeaders
,
args
.
WebSession
);
args
.
WebSession
.
Request
.
Host
=
args
.
WebSession
.
Request
.
RequestUri
.
Authority
;
args
.
WebSession
.
Request
.
Host
=
args
.
WebSession
.
Request
.
RequestUri
.
Authority
;
...
@@ -558,7 +577,6 @@ namespace Titanium.Web.Proxy
...
@@ -558,7 +577,6 @@ namespace Titanium.Web.Proxy
webRequest
.
Request
.
RequestHeaders
=
requestHeaders
;
webRequest
.
Request
.
RequestHeaders
=
requestHeaders
;
}
}
/// <summary>
/// <summary>
/// This is called when the request is PUT/POST to read the body
/// This is called when the request is PUT/POST to read the body
/// </summary>
/// </summary>
...
@@ -580,9 +598,7 @@ namespace Titanium.Web.Proxy
...
@@ -580,9 +598,7 @@ namespace Titanium.Web.Proxy
else
if
(
args
.
WebSession
.
Request
.
IsChunked
)
else
if
(
args
.
WebSession
.
Request
.
IsChunked
)
{
{
await
args
.
ProxyClient
.
ClientStreamReader
.
CopyBytesToStreamChunked
(
BUFFER_SIZE
,
postStream
);
await
args
.
ProxyClient
.
ClientStreamReader
.
CopyBytesToStreamChunked
(
BUFFER_SIZE
,
postStream
);
}
}
}
}
}
}
}
}
\ No newline at end of file
Titanium.Web.Proxy/Tcp/TcpRow.cs
View file @
1acc1ad8
...
@@ -20,6 +20,10 @@ namespace Titanium.Web.Proxy.Tcp
...
@@ -20,6 +20,10 @@ namespace Titanium.Web.Proxy.Tcp
int
localPort
=
(
tcpRow
.
localPort1
<<
8
)
+
(
tcpRow
.
localPort2
)
+
(
tcpRow
.
localPort3
<<
24
)
+
(
tcpRow
.
localPort4
<<
16
);
int
localPort
=
(
tcpRow
.
localPort1
<<
8
)
+
(
tcpRow
.
localPort2
)
+
(
tcpRow
.
localPort3
<<
24
)
+
(
tcpRow
.
localPort4
<<
16
);
long
localAddress
=
tcpRow
.
localAddr
;
long
localAddress
=
tcpRow
.
localAddr
;
LocalEndPoint
=
new
IPEndPoint
(
localAddress
,
localPort
);
LocalEndPoint
=
new
IPEndPoint
(
localAddress
,
localPort
);
int
remotePort
=
(
tcpRow
.
remotePort1
<<
8
)
+
(
tcpRow
.
remotePort2
)
+
(
tcpRow
.
remotePort3
<<
24
)
+
(
tcpRow
.
remotePort4
<<
16
);
long
remoteAddress
=
tcpRow
.
remoteAddr
;
RemoteEndPoint
=
new
IPEndPoint
(
remoteAddress
,
remotePort
);
}
}
/// <summary>
/// <summary>
...
@@ -27,6 +31,11 @@ namespace Titanium.Web.Proxy.Tcp
...
@@ -27,6 +31,11 @@ namespace Titanium.Web.Proxy.Tcp
/// </summary>
/// </summary>
public
IPEndPoint
LocalEndPoint
{
get
;
private
set
;
}
public
IPEndPoint
LocalEndPoint
{
get
;
private
set
;
}
/// <summary>
/// Gets the remote end point.
/// </summary>
public
IPEndPoint
RemoteEndPoint
{
get
;
private
set
;
}
/// <summary>
/// <summary>
/// Gets the process identifier.
/// Gets the process identifier.
/// </summary>
/// </summary>
...
...
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