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
3ff60c1d
Commit
3ff60c1d
authored
Jul 14, 2016
by
titanium007
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add stress test
parent
e27a4f92
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
325 additions
and
39 deletions
+325
-39
CertificateManagerTests.cs
...s/Titanium.Web.Proxy.UnitTests/CertificateManagerTests.cs
+51
-0
ConnectionManagerTests.cs
Tests/Titanium.Web.Proxy.UnitTests/ConnectionManagerTests.cs
+85
-0
AssemblyInfo.cs
...s/Titanium.Web.Proxy.UnitTests/Properties/AssemblyInfo.cs
+36
-0
Titanium.Web.Proxy.UnitTests.csproj
...m.Web.Proxy.UnitTests/Titanium.Web.Proxy.UnitTests.csproj
+90
-0
Titanium.Web.Proxy.sln
Titanium.Web.Proxy.sln
+9
-0
HttpWebClient.cs
Titanium.Web.Proxy/Http/HttpWebClient.cs
+2
-2
CachedTcpConnection.cs
Titanium.Web.Proxy/Network/CachedTcpConnection.cs
+2
-2
TcpConnectionManager.cs
Titanium.Web.Proxy/Network/TcpConnectionManager.cs
+22
-24
AssemblyInfo.cs
Titanium.Web.Proxy/Properties/AssemblyInfo.cs
+2
-0
ProxyServer.cs
Titanium.Web.Proxy/ProxyServer.cs
+12
-6
RequestHandler.cs
Titanium.Web.Proxy/RequestHandler.cs
+12
-3
Titanium.Web.Proxy.csproj
Titanium.Web.Proxy/Titanium.Web.Proxy.csproj
+2
-2
No files found.
Tests/Titanium.Web.Proxy.UnitTests/CertificateManagerTests.cs
0 → 100644
View file @
3ff60c1d
using
System
;
using
Microsoft.VisualStudio.TestTools.UnitTesting
;
using
Titanium.Web.Proxy.Network
;
using
System.Threading.Tasks
;
using
System.Collections.Generic
;
namespace
Titanium.Web.Proxy.UnitTests
{
[
TestClass
]
public
class
CertificateManagerTests
{
private
readonly
static
string
[]
hostNames
=
new
string
[]
{
"facebook.com"
,
"youtube.com"
,
"google.com"
,
"bing.com"
,
"yahoo.com"
};
private
readonly
Random
random
=
new
Random
();
[
TestMethod
]
public
async
Task
Simple_Create_Certificate_Stress_Test
()
{
var
tasks
=
new
List
<
Task
>();
var
mgr
=
new
CertificateManager
(
"Titanium"
,
"Titanium Root Certificate Authority"
);
mgr
.
ClearIdleCertificates
(
1
);
for
(
int
i
=
0
;
i
<
1000
;
i
++)
{
foreach
(
var
host
in
hostNames
)
{
tasks
.
Add
(
Task
.
Run
(
async
()
=>
{
await
Task
.
Delay
(
random
.
Next
(
0
,
10
)
*
1000
);
//get the connection
var
certificate
=
await
mgr
.
CreateCertificate
(
host
,
false
);
Assert
.
IsNotNull
(
certificate
);
}));
}
}
await
Task
.
WhenAll
(
tasks
.
ToArray
());
mgr
.
StopClearIdleCertificates
();
}
}
}
Tests/Titanium.Web.Proxy.UnitTests/ConnectionManagerTests.cs
0 → 100644
View file @
3ff60c1d
using
System
;
using
Microsoft.VisualStudio.TestTools.UnitTesting
;
using
Titanium.Web.Proxy.Network
;
using
System.Threading.Tasks
;
using
System.Collections.Generic
;
using
System.Diagnostics
;
namespace
Titanium.Web.Proxy.UnitTests
{
[
TestClass
]
public
class
ConnectionManagerTests
{
private
readonly
static
string
[]
hostNames
=
new
string
[]
{
"facebook.com"
,
"youtube.com"
,
"google.com"
,
"bing.com"
,
"yahoo.com"
};
private
readonly
Random
random
=
new
Random
();
[
TestMethod
]
public
async
Task
Simple_Create_Connection_Stress_Test
()
{
var
tasks
=
new
List
<
Task
>();
var
mgr
=
new
TcpConnectionManager
();
mgr
.
ClearIdleConnections
(
1
);
for
(
int
i
=
0
;
i
<
1000
;
i
++)
{
foreach
(
var
host
in
hostNames
)
{
tasks
.
Add
(
Task
.
Run
(
async
()
=>
{
await
Task
.
Delay
(
random
.
Next
(
0
,
10
)
*
1000
);
//get the connection
var
httpConnection
=
await
mgr
.
GetClient
(
host
,
80
,
false
,
new
Version
(
1
,
1
),
null
,
null
,
8096
,
System
.
Security
.
Authentication
.
SslProtocols
.
Default
,
120
,
null
,
null
);
//simulate a work with the connection
await
Task
.
Delay
(
random
.
Next
(
0
,
10
)
*
1000
);
//print total number of connections on cache
Debug
.
WriteLine
(
mgr
.
connectionCache
.
Count
);
Assert
.
IsNotNull
(
httpConnection
);
Assert
.
IsNotNull
(
httpConnection
.
TcpClient
);
Assert
.
IsTrue
(
httpConnection
.
TcpClient
.
Connected
);
//release
await
mgr
.
ReleaseClient
(
httpConnection
);
}));
tasks
.
Add
(
Task
.
Run
(
async
()
=>
{
await
Task
.
Delay
(
random
.
Next
(
0
,
10
)
*
1000
);
//get the connection
var
httpsConnection
=
await
mgr
.
GetClient
(
host
,
443
,
true
,
new
Version
(
1
,
1
),
null
,
null
,
8096
,
System
.
Security
.
Authentication
.
SslProtocols
.
Default
,
120
,
null
,
null
);
//simulate a work with the connection
await
Task
.
Delay
(
random
.
Next
(
0
,
10
)
*
1000
);
//print total number of connections on cache
Debug
.
WriteLine
(
mgr
.
connectionCache
.
Count
);
Assert
.
IsNotNull
(
httpsConnection
);
Assert
.
IsNotNull
(
httpsConnection
.
TcpClient
);
Assert
.
IsTrue
(
httpsConnection
.
TcpClient
.
Connected
);
//release
await
mgr
.
ReleaseClient
(
httpsConnection
);
}));
}
}
await
Task
.
WhenAll
(
tasks
.
ToArray
());
mgr
.
StopClearIdleConnections
();
}
}
}
Tests/Titanium.Web.Proxy.UnitTests/Properties/AssemblyInfo.cs
0 → 100644
View file @
3ff60c1d
using
System.Reflection
;
using
System.Runtime.CompilerServices
;
using
System.Runtime.InteropServices
;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Titanium.Web.Proxy.UnitTests")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Titanium.Web.Proxy.UnitTests")]
[assembly: AssemblyCopyright("Copyright © 2016")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("b517e3d0-d03b-436f-ab03-34ba0d5321af")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
Tests/Titanium.Web.Proxy.UnitTests/Titanium.Web.Proxy.UnitTests.csproj
0 → 100644
View file @
3ff60c1d
<?xml version="1.0" encoding="utf-8"?>
<Project
ToolsVersion=
"14.0"
DefaultTargets=
"Build"
xmlns=
"http://schemas.microsoft.com/developer/msbuild/2003"
>
<PropertyGroup>
<Configuration
Condition=
" '$(Configuration)' == '' "
>
Debug
</Configuration>
<Platform
Condition=
" '$(Platform)' == '' "
>
AnyCPU
</Platform>
<ProjectGuid>
{B517E3D0-D03B-436F-AB03-34BA0D5321AF}
</ProjectGuid>
<OutputType>
Library
</OutputType>
<AppDesignerFolder>
Properties
</AppDesignerFolder>
<RootNamespace>
Titanium.Web.Proxy.UnitTests
</RootNamespace>
<AssemblyName>
Titanium.Web.Proxy.UnitTests
</AssemblyName>
<TargetFrameworkVersion>
v4.5.1
</TargetFrameworkVersion>
<FileAlignment>
512
</FileAlignment>
<ProjectTypeGuids>
{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
</ProjectTypeGuids>
<VisualStudioVersion
Condition=
"'$(VisualStudioVersion)' == ''"
>
10.0
</VisualStudioVersion>
<VSToolsPath
Condition=
"'$(VSToolsPath)' == ''"
>
$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
</VSToolsPath>
<ReferencePath>
$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages
</ReferencePath>
<IsCodedUITest>
False
</IsCodedUITest>
<TestProjectType>
UnitTest
</TestProjectType>
</PropertyGroup>
<PropertyGroup
Condition=
" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "
>
<DebugSymbols>
true
</DebugSymbols>
<DebugType>
full
</DebugType>
<Optimize>
false
</Optimize>
<OutputPath>
bin\Debug\
</OutputPath>
<DefineConstants>
DEBUG;TRACE
</DefineConstants>
<ErrorReport>
prompt
</ErrorReport>
<WarningLevel>
4
</WarningLevel>
</PropertyGroup>
<PropertyGroup
Condition=
" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "
>
<DebugType>
pdbonly
</DebugType>
<Optimize>
true
</Optimize>
<OutputPath>
bin\Release\
</OutputPath>
<DefineConstants>
TRACE
</DefineConstants>
<ErrorReport>
prompt
</ErrorReport>
<WarningLevel>
4
</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference
Include=
"System"
/>
</ItemGroup>
<Choose>
<When
Condition=
"('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'"
>
<ItemGroup>
<Reference
Include=
"Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
/>
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<Reference
Include=
"Microsoft.VisualStudio.QualityTools.UnitTestFramework"
/>
</ItemGroup>
</Otherwise>
</Choose>
<ItemGroup>
<Compile
Include=
"CertificateManagerTests.cs"
/>
<Compile
Include=
"ConnectionManagerTests.cs"
/>
<Compile
Include=
"Properties\AssemblyInfo.cs"
/>
</ItemGroup>
<ItemGroup>
<ProjectReference
Include=
"..\..\Titanium.Web.Proxy\Titanium.Web.Proxy.csproj"
>
<Project>
{8d73a1be-868c-42d2-9ece-f32cc1a02906}
</Project>
<Name>
Titanium.Web.Proxy
</Name>
</ProjectReference>
</ItemGroup>
<Choose>
<When
Condition=
"'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'"
>
<ItemGroup>
<Reference
Include=
"Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
>
<Private>
False
</Private>
</Reference>
<Reference
Include=
"Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
>
<Private>
False
</Private>
</Reference>
<Reference
Include=
"Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
>
<Private>
False
</Private>
</Reference>
<Reference
Include=
"Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
>
<Private>
False
</Private>
</Reference>
</ItemGroup>
</When>
</Choose>
<Import
Project=
"$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets"
Condition=
"Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')"
/>
<Import
Project=
"$(MSBuildToolsPath)\Microsoft.CSharp.targets"
/>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
\ No newline at end of file
Titanium.Web.Proxy.sln
View file @
3ff60c1d
...
...
@@ -29,6 +29,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{AC9AE37A
.build\default.ps1 = .build\default.ps1
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{BC1E0789-D348-49CF-8B67-5E99D50EDF64}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Titanium.Web.Proxy.UnitTests", "Tests\Titanium.Web.Proxy.UnitTests\Titanium.Web.Proxy.UnitTests.csproj", "{B517E3D0-D03B-436F-AB03-34BA0D5321AF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
...
...
@@ -43,12 +47,17 @@ Global
{F3B7E553-1904-4E80-BDC7-212342B5C952}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F3B7E553-1904-4E80-BDC7-212342B5C952}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F3B7E553-1904-4E80-BDC7-212342B5C952}.Release|Any CPU.Build.0 = Release|Any CPU
{B517E3D0-D03B-436F-AB03-34BA0D5321AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B517E3D0-D03B-436F-AB03-34BA0D5321AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B517E3D0-D03B-436F-AB03-34BA0D5321AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B517E3D0-D03B-436F-AB03-34BA0D5321AF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{F3B7E553-1904-4E80-BDC7-212342B5C952} = {B6DBABDC-C985-4872-9C38-B4E5079CBC4B}
{B517E3D0-D03B-436F-AB03-34BA0D5321AF} = {BC1E0789-D348-49CF-8B67-5E99D50EDF64}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EnterpriseLibraryConfigurationToolBinariesPath = .1.505.2\lib\NET35
...
...
Titanium.Web.Proxy/Http/HttpWebClient.cs
View file @
3ff60c1d
...
...
@@ -17,7 +17,7 @@ namespace Titanium.Web.Proxy.Http
/// <summary>
/// Connection to server
/// </summary>
internal
TcpConnectionCache
ServerConnection
{
get
;
set
;
}
internal
CachedTcpConnection
ServerConnection
{
get
;
set
;
}
public
Request
Request
{
get
;
set
;
}
public
Response
Response
{
get
;
set
;
}
...
...
@@ -37,7 +37,7 @@ namespace Titanium.Web.Proxy.Http
/// Set the tcp connection to server used by this webclient
/// </summary>
/// <param name="Connection"></param>
internal
void
SetConnection
(
TcpConnectionCache
Connection
)
internal
void
SetConnection
(
CachedTcpConnection
Connection
)
{
Connection
.
LastAccess
=
DateTime
.
Now
;
ServerConnection
=
Connection
;
...
...
Titanium.Web.Proxy/Network/
TcpConnectionCache
.cs
→
Titanium.Web.Proxy/Network/
CachedTcpConnection
.cs
View file @
3ff60c1d
...
...
@@ -8,7 +8,7 @@ namespace Titanium.Web.Proxy.Network
/// <summary>
/// An object that holds TcpConnection to a particular server & port
/// </summary>
public
class
TcpConnectionCache
public
class
CachedTcpConnection
{
internal
string
HostName
{
get
;
set
;
}
internal
int
port
{
get
;
set
;
}
...
...
@@ -37,7 +37,7 @@ namespace Titanium.Web.Proxy.Network
/// </summary>
internal
DateTime
LastAccess
{
get
;
set
;
}
internal
TcpConnectionCache
()
internal
CachedTcpConnection
()
{
LastAccess
=
DateTime
.
Now
;
}
...
...
Titanium.Web.Proxy/Network/TcpConnection
Cache
Manager.cs
→
Titanium.Web.Proxy/Network/TcpConnectionManager.cs
View file @
3ff60c1d
...
...
@@ -18,12 +18,12 @@ namespace Titanium.Web.Proxy.Network
/// <summary>
/// A class that manages Tcp Connection to server used by this proxy server
/// </summary>
internal
class
TcpConnection
Cache
Manager
internal
class
TcpConnectionManager
{
/// <summary>
/// Connection cache
/// </summary>
Dictionary
<
string
,
List
<
TcpConnectionCache
>>
connectionCache
=
new
Dictionary
<
string
,
List
<
TcpConnectionCache
>>();
internal
Dictionary
<
string
,
List
<
CachedTcpConnection
>>
connectionCache
=
new
Dictionary
<
string
,
List
<
CachedTcpConnection
>>();
/// <summary>
/// A lock to manage concurrency
...
...
@@ -38,12 +38,14 @@ namespace Titanium.Web.Proxy.Network
/// <param name="isHttps"></param>
/// <param name="version"></param>
/// <returns></returns>
internal
async
Task
<
TcpConnectionCache
>
GetClient
(
string
hostname
,
int
port
,
bool
isHttps
,
Version
version
,
internal
async
Task
<
CachedTcpConnection
>
GetClient
(
string
hostname
,
int
port
,
bool
isHttps
,
Version
version
,
ExternalProxy
upStreamHttpProxy
,
ExternalProxy
upStreamHttpsProxy
,
int
bufferSize
,
SslProtocols
supportedSslProtocols
,
RemoteCertificateValidationCallback
remoteCertificateValidationCallBack
,
LocalCertificateSelectionCallback
localCertificateSelectionCallback
)
int
connectionTimeOutSeconds
,
RemoteCertificateValidationCallback
remoteCertificateValidationCallBack
,
LocalCertificateSelectionCallback
localCertificateSelectionCallback
)
{
List
<
TcpConnectionCache
>
cachedConnections
=
null
;
TcpConnectionCache
cached
=
null
;
List
<
CachedTcpConnection
>
cachedConnections
=
null
;
CachedTcpConnection
cached
=
null
;
//Get a unique string to identify this connection
var
key
=
GetConnectionKey
(
hostname
,
port
,
isHttps
,
version
);
...
...
@@ -87,17 +89,10 @@ namespace Titanium.Web.Proxy.Network
if
(
cached
==
null
)
{
cached
=
await
CreateClient
(
hostname
,
port
,
isHttps
,
version
,
upStreamHttpProxy
,
upStreamHttpsProxy
,
bufferSize
,
supportedSslProtocols
,
cached
=
await
CreateClient
(
hostname
,
port
,
isHttps
,
version
,
connectionTimeOutSeconds
,
upStreamHttpProxy
,
upStreamHttpsProxy
,
bufferSize
,
supportedSslProtocols
,
remoteCertificateValidationCallBack
,
localCertificateSelectionCallback
);
}
if
(
cachedConnections
==
null
||
cachedConnections
.
Count
()
<=
2
)
{
var
task
=
CreateClient
(
hostname
,
port
,
isHttps
,
version
,
upStreamHttpProxy
,
upStreamHttpsProxy
,
bufferSize
,
supportedSslProtocols
,
remoteCertificateValidationCallBack
,
localCertificateSelectionCallback
)
.
ContinueWith
(
async
(
x
)
=>
{
if
(
x
.
Status
==
TaskStatus
.
RanToCompletion
)
await
ReleaseClient
(
x
.
Result
);
});
}
return
cached
;
}
...
...
@@ -122,7 +117,7 @@ namespace Titanium.Web.Proxy.Network
/// <param name="isHttps"></param>
/// <param name="version"></param>
/// <returns></returns>
private
async
Task
<
TcpConnectionCache
>
CreateClient
(
string
hostname
,
int
port
,
bool
isHttps
,
Version
version
,
private
async
Task
<
CachedTcpConnection
>
CreateClient
(
string
hostname
,
int
port
,
bool
isHttps
,
Version
version
,
int
connectionTimeOutSeconds
,
ExternalProxy
upStreamHttpProxy
,
ExternalProxy
upStreamHttpsProxy
,
int
bufferSize
,
SslProtocols
supportedSslProtocols
,
RemoteCertificateValidationCallback
remoteCertificateValidationCallBack
,
LocalCertificateSelectionCallback
localCertificateSelectionCallback
)
{
...
...
@@ -137,7 +132,7 @@ namespace Titanium.Web.Proxy.Network
if
(
upStreamHttpsProxy
!=
null
)
{
client
=
new
TcpClient
(
upStreamHttpsProxy
.
HostName
,
upStreamHttpsProxy
.
Port
);
stream
=
(
Stream
)
client
.
GetStream
();
stream
=
client
.
GetStream
();
using
(
var
writer
=
new
StreamWriter
(
stream
,
Encoding
.
ASCII
,
bufferSize
,
true
))
{
...
...
@@ -164,7 +159,7 @@ namespace Titanium.Web.Proxy.Network
else
{
client
=
new
TcpClient
(
hostname
,
port
);
stream
=
(
Stream
)
client
.
GetStream
();
stream
=
client
.
GetStream
();
}
try
...
...
@@ -174,7 +169,7 @@ namespace Titanium.Web.Proxy.Network
await
sslStream
.
AuthenticateAsClientAsync
(
hostname
,
null
,
supportedSslProtocols
,
false
);
stream
=
(
Stream
)
sslStream
;
stream
=
sslStream
;
}
catch
{
...
...
@@ -191,16 +186,19 @@ namespace Titanium.Web.Proxy.Network
if
(
upStreamHttpProxy
!=
null
)
{
client
=
new
TcpClient
(
upStreamHttpProxy
.
HostName
,
upStreamHttpProxy
.
Port
);
stream
=
(
Stream
)
client
.
GetStream
();
stream
=
client
.
GetStream
();
}
else
{
client
=
new
TcpClient
(
hostname
,
port
);
stream
=
(
Stream
)
client
.
GetStream
();
stream
=
client
.
GetStream
();
}
}
client
.
ReceiveTimeout
=
connectionTimeOutSeconds
*
1000
;
client
.
SendTimeout
=
connectionTimeOutSeconds
*
1000
;
return
new
TcpConnectionCache
()
return
new
CachedTcpConnection
()
{
HostName
=
hostname
,
port
=
port
,
...
...
@@ -217,7 +215,7 @@ namespace Titanium.Web.Proxy.Network
/// </summary>
/// <param name="connection"></param>
/// <returns></returns>
internal
async
Task
ReleaseClient
(
TcpConnectionCache
connection
)
internal
async
Task
ReleaseClient
(
CachedTcpConnection
connection
)
{
connection
.
LastAccess
=
DateTime
.
Now
;
...
...
@@ -226,7 +224,7 @@ namespace Titanium.Web.Proxy.Network
try
{
List
<
TcpConnectionCache
>
cachedConnections
;
List
<
CachedTcpConnection
>
cachedConnections
;
connectionCache
.
TryGetValue
(
key
,
out
cachedConnections
);
if
(
cachedConnections
!=
null
)
...
...
@@ -235,7 +233,7 @@ namespace Titanium.Web.Proxy.Network
}
else
{
connectionCache
.
Add
(
key
,
new
List
<
TcpConnectionCache
>()
{
connection
});
connectionCache
.
Add
(
key
,
new
List
<
CachedTcpConnection
>()
{
connection
});
}
}
...
...
Titanium.Web.Proxy/Properties/AssemblyInfo.cs
View file @
3ff60c1d
using
System.Reflection
;
using
System.Runtime.CompilerServices
;
using
System.Runtime.InteropServices
;
// General Information about an assembly is controlled through the following
...
...
@@ -13,6 +14,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCopyright("Copyright © 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: InternalsVisibleTo("Titanium.Web.Proxy.UnitTests")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
...
...
Titanium.Web.Proxy/ProxyServer.cs
View file @
3ff60c1d
...
...
@@ -26,7 +26,7 @@ namespace Titanium.Web.Proxy
/// <summary>
/// A object that manages tcp connection cache to server
/// </summary>
private
TcpConnection
Cache
Manager
tcpConnectionCacheManager
{
get
;
set
;
}
private
TcpConnectionManager
tcpConnectionCacheManager
{
get
;
set
;
}
/// <summary>
/// Manage system proxy settings
...
...
@@ -67,15 +67,20 @@ namespace Titanium.Web.Proxy
public
bool
Enable100ContinueBehaviour
{
get
;
set
;
}
/// <summary>
/// Minutes TCP connection cache to servers to be kept alive
when in idle state
/// Minutes TCP connection cache to servers to be kept alive
from last time it was used
/// </summary>
public
int
ConnectionCacheTimeOutMinutes
{
get
;
set
;
}
public
int
Server
ConnectionCacheTimeOutMinutes
{
get
;
set
;
}
/// <summary>
/// Minutes certificates should be kept in cache when not used
/// </summary>
public
int
CertificateCacheTimeOutMinutes
{
get
;
set
;
}
/// <summary>
/// Seconds client/server connection are to be kept alive when waiting for read/write to complete
/// </summary>
public
int
ConnectionTimeOutSeconds
{
get
;
set
;
}
/// <summary>
/// Intercept request to server
/// </summary>
...
...
@@ -122,11 +127,12 @@ namespace Titanium.Web.Proxy
public
ProxyServer
()
{
//default values
ConnectionCacheTimeOutMinutes
=
3
;
ConnectionTimeOutSeconds
=
120
;
ServerConnectionCacheTimeOutMinutes
=
3
;
CertificateCacheTimeOutMinutes
=
60
;
ProxyEndPoints
=
new
List
<
ProxyEndPoint
>();
tcpConnectionCacheManager
=
new
TcpConnection
Cache
Manager
();
tcpConnectionCacheManager
=
new
TcpConnectionManager
();
systemProxySettingsManager
=
new
SystemProxyManager
();
firefoxProxySettingsManager
=
new
FireFoxProxySettingsManager
();
...
...
@@ -273,7 +279,7 @@ namespace Titanium.Web.Proxy
Listen
(
endPoint
);
}
tcpConnectionCacheManager
.
ClearIdleConnections
(
ConnectionCacheTimeOutMinutes
);
tcpConnectionCacheManager
.
ClearIdleConnections
(
Server
ConnectionCacheTimeOutMinutes
);
certificateCacheManager
.
ClearIdleCertificates
(
CertificateCacheTimeOutMinutes
);
proxyRunning
=
true
;
...
...
Titanium.Web.Proxy/RequestHandler.cs
View file @
3ff60c1d
...
...
@@ -27,6 +27,10 @@ namespace Titanium.Web.Proxy
private
async
void
HandleClient
(
ExplicitProxyEndPoint
endPoint
,
TcpClient
client
)
{
Stream
clientStream
=
client
.
GetStream
();
clientStream
.
ReadTimeout
=
ConnectionTimeOutSeconds
*
1000
;
clientStream
.
WriteTimeout
=
ConnectionTimeOutSeconds
*
1000
;
var
clientStreamReader
=
new
CustomBinaryReader
(
clientStream
);
var
clientStreamWriter
=
new
StreamWriter
(
clientStream
);
...
...
@@ -87,7 +91,8 @@ namespace Titanium.Web.Proxy
//create the Tcp Connection to server and then release it to connection cache
//Just doing what CONNECT request is asking as to do
var
tunnelClient
=
await
tcpConnectionCacheManager
.
GetClient
(
httpRemoteUri
.
Host
,
httpRemoteUri
.
Port
,
true
,
version
,
UpStreamHttpProxy
,
UpStreamHttpsProxy
,
BUFFER_SIZE
,
SupportedSslProtocols
,
new
RemoteCertificateValidationCallback
(
ValidateServerCertificate
),
UpStreamHttpProxy
,
UpStreamHttpsProxy
,
BUFFER_SIZE
,
SupportedSslProtocols
,
ConnectionTimeOutSeconds
,
new
RemoteCertificateValidationCallback
(
ValidateServerCertificate
),
new
LocalCertificateSelectionCallback
(
SelectClientCertificate
));
await
tcpConnectionCacheManager
.
ReleaseClient
(
tunnelClient
);
...
...
@@ -150,6 +155,10 @@ namespace Titanium.Web.Proxy
private
async
void
HandleClient
(
TransparentProxyEndPoint
endPoint
,
TcpClient
tcpClient
)
{
Stream
clientStream
=
tcpClient
.
GetStream
();
clientStream
.
ReadTimeout
=
ConnectionTimeOutSeconds
*
1000
;
clientStream
.
WriteTimeout
=
ConnectionTimeOutSeconds
*
1000
;
CustomBinaryReader
clientStreamReader
=
null
;
StreamWriter
clientStreamWriter
=
null
;
X509Certificate2
certificate
=
null
;
...
...
@@ -209,7 +218,7 @@ namespace Titanium.Web.Proxy
private
async
Task
HandleHttpSessionRequest
(
TcpClient
client
,
string
httpCmd
,
Stream
clientStream
,
CustomBinaryReader
clientStreamReader
,
StreamWriter
clientStreamWriter
,
string
httpsHostName
)
{
TcpConnectionCache
connection
=
null
;
CachedTcpConnection
connection
=
null
;
//Loop through each subsequest request on this particular client connection
//(assuming HTTP connection is kept alive by client)
...
...
@@ -323,7 +332,7 @@ namespace Titanium.Web.Proxy
//construct the web request that we are going to issue on behalf of the client.
connection
=
await
tcpConnectionCacheManager
.
GetClient
(
args
.
WebSession
.
Request
.
RequestUri
.
Host
,
args
.
WebSession
.
Request
.
RequestUri
.
Port
,
args
.
IsHttps
,
version
,
UpStreamHttpProxy
,
UpStreamHttpsProxy
,
BUFFER_SIZE
,
SupportedSslProtocols
,
new
RemoteCertificateValidationCallback
(
ValidateServerCertificate
),
UpStreamHttpProxy
,
UpStreamHttpsProxy
,
BUFFER_SIZE
,
SupportedSslProtocols
,
ConnectionTimeOutSeconds
,
new
RemoteCertificateValidationCallback
(
ValidateServerCertificate
),
new
LocalCertificateSelectionCallback
(
SelectClientCertificate
));
args
.
WebSession
.
Request
.
RequestLocked
=
true
;
...
...
Titanium.Web.Proxy/Titanium.Web.Proxy.csproj
View file @
3ff60c1d
...
...
@@ -77,8 +77,8 @@
<Compile
Include=
"Http\Request.cs"
/>
<Compile
Include=
"Http\Response.cs"
/>
<Compile
Include=
"Models\ExternalProxy.cs"
/>
<Compile
Include=
"Network\
TcpConnectionCache
.cs"
/>
<Compile
Include=
"Network\TcpConnection
Cache
Manager.cs"
/>
<Compile
Include=
"Network\
CachedTcpConnection
.cs"
/>
<Compile
Include=
"Network\TcpConnectionManager.cs"
/>
<Compile
Include=
"Models\HttpHeader.cs"
/>
<Compile
Include=
"Http\HttpWebClient.cs"
/>
<Compile
Include=
"Properties\AssemblyInfo.cs"
/>
...
...
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