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
4c68f687
Commit
4c68f687
authored
Oct 01, 2016
by
Hakan Arıcı
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Various code refactorings.
parent
c1d0e60e
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
159 additions
and
272 deletions
+159
-272
StreamExtensions.cs
Titanium.Web.Proxy/Extensions/StreamExtensions.cs
+45
-48
CustomBinaryReader.cs
Titanium.Web.Proxy/Helpers/CustomBinaryReader.cs
+24
-31
SystemProxy.cs
Titanium.Web.Proxy/Helpers/SystemProxy.cs
+59
-112
Tcp.cs
Titanium.Web.Proxy/Helpers/Tcp.cs
+2
-16
HttpWebClient.cs
Titanium.Web.Proxy/Http/HttpWebClient.cs
+13
-35
Request.cs
Titanium.Web.Proxy/Http/Request.cs
+5
-5
Response.cs
Titanium.Web.Proxy/Http/Response.cs
+2
-3
OkResponse.cs
Titanium.Web.Proxy/Http/Responses/OkResponse.cs
+1
-1
RedirectResponse.cs
Titanium.Web.Proxy/Http/Responses/RedirectResponse.cs
+2
-4
CertificateManager.cs
Titanium.Web.Proxy/Network/CertificateManager.cs
+0
-2
TcpConnectionFactory.cs
Titanium.Web.Proxy/Network/TcpConnectionFactory.cs
+3
-3
ProxyServer.cs
Titanium.Web.Proxy/ProxyServer.cs
+3
-12
No files found.
Titanium.Web.Proxy/Extensions/StreamExtensions.cs
View file @
4c68f687
...
...
@@ -29,27 +29,20 @@ namespace Titanium.Web.Proxy.Extensions
await
input
.
CopyToAsync
(
output
);
}
/// <summary>
/// copies the specified bytes to the stream from the input stream
/// </summary>
/// <param name="streamReader"></param>
/// <param name="stream"></param>
/// <param name="totalBytesToRead"></param>
/// <returns></returns>
internal
static
async
Task
CopyBytesToStream
(
this
CustomBinaryReader
streamReader
,
int
bufferSize
,
Stream
stream
,
long
totalBytesToRead
)
/// <summary>
/// copies the specified bytes to the stream from the input stream
/// </summary>
/// <param name="streamReader"></param>
/// <param name="bufferSize"></param>
/// <param name="stream"></param>
/// <param name="totalBytesToRead"></param>
/// <returns></returns>
internal
static
async
Task
CopyBytesToStream
(
this
CustomBinaryReader
streamReader
,
int
bufferSize
,
Stream
stream
,
long
totalBytesToRead
)
{
var
totalbytesRead
=
0
;
long
bytesToRead
;
if
(
totalBytesToRead
<
bufferSize
)
{
bytesToRead
=
totalBytesToRead
;
}
else
{
bytesToRead
=
bufferSize
;
}
long
bytesToRead
=
totalBytesToRead
<
bufferSize
?
totalBytesToRead
:
bufferSize
;
while
(
totalbytesRead
<
totalBytesToRead
)
{
...
...
@@ -72,13 +65,14 @@ namespace Titanium.Web.Proxy.Extensions
}
}
/// <summary>
/// Copies the stream chunked
/// </summary>
/// <param name="clientStreamReader"></param>
/// <param name="stream"></param>
/// <returns></returns>
internal
static
async
Task
CopyBytesToStreamChunked
(
this
CustomBinaryReader
clientStreamReader
,
int
bufferSize
,
Stream
stream
)
/// <summary>
/// Copies the stream chunked
/// </summary>
/// <param name="clientStreamReader"></param>
/// <param name="bufferSize"></param>
/// <param name="stream"></param>
/// <returns></returns>
internal
static
async
Task
CopyBytesToStreamChunked
(
this
CustomBinaryReader
clientStreamReader
,
int
bufferSize
,
Stream
stream
)
{
while
(
true
)
{
...
...
@@ -117,30 +111,32 @@ namespace Titanium.Web.Proxy.Extensions
await
WriteResponseBodyChunked
(
data
,
clientStream
);
}
}
/// <summary>
/// Copies the specified content length number of bytes to the output stream from the given inputs stream
/// optionally chunked
/// </summary>
/// <param name="inStreamReader"></param>
/// <param name="outStream"></param>
/// <param name="isChunked"></param>
/// <param name="ContentLength"></param>
/// <returns></returns>
internal
static
async
Task
WriteResponseBody
(
this
CustomBinaryReader
inStreamReader
,
int
bufferSize
,
Stream
outStream
,
bool
isChunked
,
long
ContentLength
)
/// <summary>
/// Copies the specified content length number of bytes to the output stream from the given inputs stream
/// optionally chunked
/// </summary>
/// <param name="inStreamReader"></param>
/// <param name="bufferSize"></param>
/// <param name="outStream"></param>
/// <param name="isChunked"></param>
/// <param name="contentLength"></param>
/// <returns></returns>
internal
static
async
Task
WriteResponseBody
(
this
CustomBinaryReader
inStreamReader
,
int
bufferSize
,
Stream
outStream
,
bool
isChunked
,
long
contentLength
)
{
if
(!
isChunked
)
{
//http 1.0
if
(
C
ontentLength
==
-
1
)
if
(
c
ontentLength
==
-
1
)
{
C
ontentLength
=
long
.
MaxValue
;
c
ontentLength
=
long
.
MaxValue
;
}
int
bytesToRead
=
bufferSize
;
if
(
C
ontentLength
<
bufferSize
)
if
(
c
ontentLength
<
bufferSize
)
{
bytesToRead
=
(
int
)
C
ontentLength
;
bytesToRead
=
(
int
)
c
ontentLength
;
}
var
buffer
=
new
byte
[
bufferSize
];
...
...
@@ -153,11 +149,11 @@ namespace Titanium.Web.Proxy.Extensions
await
outStream
.
WriteAsync
(
buffer
,
0
,
bytesRead
);
totalBytesRead
+=
bytesRead
;
if
(
totalBytesRead
==
C
ontentLength
)
if
(
totalBytesRead
==
c
ontentLength
)
break
;
bytesRead
=
0
;
var
remainingBytes
=
(
C
ontentLength
-
totalBytesRead
);
var
remainingBytes
=
(
c
ontentLength
-
totalBytesRead
);
bytesToRead
=
remainingBytes
>
(
long
)
bufferSize
?
bufferSize
:
(
int
)
remainingBytes
;
}
}
...
...
@@ -167,13 +163,14 @@ namespace Titanium.Web.Proxy.Extensions
}
}
/// <summary>
/// Copies the streams chunked
/// </summary>
/// <param name="inStreamReader"></param>
/// <param name="outStream"></param>
/// <returns></returns>
internal
static
async
Task
WriteResponseBodyChunked
(
this
CustomBinaryReader
inStreamReader
,
int
bufferSize
,
Stream
outStream
)
/// <summary>
/// Copies the streams chunked
/// </summary>
/// <param name="inStreamReader"></param>
/// <param name="bufferSize"></param>
/// <param name="outStream"></param>
/// <returns></returns>
internal
static
async
Task
WriteResponseBodyChunked
(
this
CustomBinaryReader
inStreamReader
,
int
bufferSize
,
Stream
outStream
)
{
while
(
true
)
{
...
...
Titanium.Web.Proxy/Helpers/CustomBinaryReader.cs
View file @
4c68f687
...
...
@@ -37,37 +37,30 @@ namespace Titanium.Web.Proxy.Helpers
{
using
(
var
readBuffer
=
new
MemoryStream
())
{
try
{
var
lastChar
=
default
(
char
);
var
buffer
=
new
byte
[
1
];
while
((
await
this
.
stream
.
ReadAsync
(
buffer
,
0
,
1
))
>
0
)
{
//if new line
if
(
lastChar
==
'\r'
&&
buffer
[
0
]
==
'\n'
)
{
var
result
=
readBuffer
.
ToArray
();
return
encoding
.
GetString
(
result
.
SubArray
(
0
,
result
.
Length
-
1
));
}
//end of stream
if
(
buffer
[
0
]
==
'\0'
)
{
return
encoding
.
GetString
(
readBuffer
.
ToArray
());
}
await
readBuffer
.
WriteAsync
(
buffer
,
0
,
1
);
//store last char for new line comparison
lastChar
=
(
char
)
buffer
[
0
];
}
return
encoding
.
GetString
(
readBuffer
.
ToArray
());
}
catch
(
IOException
)
{
throw
;
}
var
lastChar
=
default
(
char
);
var
buffer
=
new
byte
[
1
];
while
((
await
this
.
stream
.
ReadAsync
(
buffer
,
0
,
1
))
>
0
)
{
//if new line
if
(
lastChar
==
'\r'
&&
buffer
[
0
]
==
'\n'
)
{
var
result
=
readBuffer
.
ToArray
();
return
encoding
.
GetString
(
result
.
SubArray
(
0
,
result
.
Length
-
1
));
}
//end of stream
if
(
buffer
[
0
]
==
'\0'
)
{
return
encoding
.
GetString
(
readBuffer
.
ToArray
());
}
await
readBuffer
.
WriteAsync
(
buffer
,
0
,
1
);
//store last char for new line comparison
lastChar
=
(
char
)
buffer
[
0
];
}
return
encoding
.
GetString
(
readBuffer
.
ToArray
());
}
}
...
...
Titanium.Web.Proxy/Helpers/SystemProxy.cs
View file @
4c68f687
This diff is collapsed.
Click to expand it.
Titanium.Web.Proxy/Helpers/Tcp.cs
View file @
4c68f687
...
...
@@ -4,7 +4,6 @@ using System.IO;
using
System.Linq
;
using
System.Net.NetworkInformation
;
using
System.Net.Security
;
using
System.Net.Sockets
;
using
System.Runtime.InteropServices
;
using
System.Security.Authentication
;
using
System.Text
;
...
...
@@ -169,31 +168,18 @@ namespace Titanium.Web.Proxy.Helpers
try
{
TcpClient
tunnelClient
=
tcpConnection
.
TcpClient
;
Stream
tunnelStream
=
tcpConnection
.
Stream
;
Task
sendRelay
;
//Now async relay all server=>client & client=>server data
if
(
sb
!=
null
)
{
sendRelay
=
clientStream
.
CopyToAsync
(
sb
.
ToString
(),
tunnelStream
);
}
else
{
sendRelay
=
clientStream
.
CopyToAsync
(
string
.
Empty
,
tunnelStream
);
}
sendRelay
=
clientStream
.
CopyToAsync
(
sb
?.
ToString
()
??
string
.
Empty
,
tunnelStream
);
var
receiveRelay
=
tunnelStream
.
CopyToAsync
(
string
.
Empty
,
clientStream
);
var
receiveRelay
=
tunnelStream
.
CopyToAsync
(
string
.
Empty
,
clientStream
);
await
Task
.
WhenAll
(
sendRelay
,
receiveRelay
);
}
catch
{
throw
;
}
finally
{
tcpConnection
.
Dispose
();
...
...
Titanium.Web.Proxy/Http/HttpWebClient.cs
View file @
4c68f687
...
...
@@ -50,22 +50,16 @@ namespace Titanium.Web.Proxy.Http
/// <summary>
/// Is Https?
/// </summary>
public
bool
IsHttps
{
get
{
return
this
.
Request
.
RequestUri
.
Scheme
==
Uri
.
UriSchemeHttps
;
}
}
public
bool
IsHttps
=>
this
.
Request
.
RequestUri
.
Scheme
==
Uri
.
UriSchemeHttps
;
/// <summary>
/// <summary>
/// Set the tcp connection to server used by this webclient
/// </summary>
/// <param name="
Connection"
></param>
internal
void
SetConnection
(
TcpConnection
C
onnection
)
/// <param name="
connection">Instance of <see cref="TcpConnection"/
></param>
internal
void
SetConnection
(
TcpConnection
c
onnection
)
{
C
onnection
.
LastAccess
=
DateTime
.
Now
;
ServerConnection
=
C
onnection
;
c
onnection
.
LastAccess
=
DateTime
.
Now
;
ServerConnection
=
c
onnection
;
}
internal
HttpWebClient
()
...
...
@@ -87,28 +81,18 @@ namespace Titanium.Web.Proxy.Http
//prepare the request & headers
if
((
ServerConnection
.
UpStreamHttpProxy
!=
null
&&
ServerConnection
.
IsHttps
==
false
)
||
(
ServerConnection
.
UpStreamHttpsProxy
!=
null
&&
ServerConnection
.
IsHttps
==
true
))
{
requestLines
.
AppendLine
(
string
.
Join
(
" "
,
new
string
[
3
]
{
this
.
Request
.
Method
,
this
.
Request
.
RequestUri
.
AbsoluteUri
,
string
.
Format
(
"HTTP/{0}.{1}"
,
this
.
Request
.
HttpVersion
.
Major
,
this
.
Request
.
HttpVersion
.
Minor
)
}));
requestLines
.
AppendLine
(
string
.
Join
(
" "
,
this
.
Request
.
Method
,
this
.
Request
.
RequestUri
.
AbsoluteUri
,
$"HTTP/
{
this
.
Request
.
HttpVersion
.
Major
}
.
{
this
.
Request
.
HttpVersion
.
Minor
}
"
));
}
else
{
requestLines
.
AppendLine
(
string
.
Join
(
" "
,
new
string
[
3
]
{
this
.
Request
.
Method
,
this
.
Request
.
RequestUri
.
PathAndQuery
,
string
.
Format
(
"HTTP/{0}.{1}"
,
this
.
Request
.
HttpVersion
.
Major
,
this
.
Request
.
HttpVersion
.
Minor
)
}));
requestLines
.
AppendLine
(
string
.
Join
(
" "
,
this
.
Request
.
Method
,
this
.
Request
.
RequestUri
.
PathAndQuery
,
$"HTTP/
{
this
.
Request
.
HttpVersion
.
Major
}
.
{
this
.
Request
.
HttpVersion
.
Minor
}
"
));
}
//Send Authentication to Upstream proxy if needed
if
(
ServerConnection
.
UpStreamHttpProxy
!=
null
&&
ServerConnection
.
IsHttps
==
false
&&
ServerConnection
.
UpStreamHttpProxy
.
UserName
!=
null
&&
ServerConnection
.
UpStreamHttpProxy
.
UserName
!=
""
&&
ServerConnection
.
UpStreamHttpProxy
.
Password
!=
null
)
if
(
ServerConnection
.
UpStreamHttpProxy
!=
null
&&
ServerConnection
.
IsHttps
==
false
&&
!
string
.
IsNullOrEmpty
(
ServerConnection
.
UpStreamHttpProxy
.
UserName
)
&&
ServerConnection
.
UpStreamHttpProxy
.
Password
!=
null
)
{
requestLines
.
AppendLine
(
"Proxy-Connection: keep-alive"
);
requestLines
.
AppendLine
(
"Proxy-Authorization"
+
": Basic "
+
Convert
.
ToBase64String
(
System
.
Text
.
Encoding
.
UTF8
.
GetBytes
(
ServerConnection
.
UpStreamHttpProxy
.
UserName
+
":"
+
ServerConnection
.
UpStreamHttpProxy
.
Password
)));
requestLines
.
AppendLine
(
"Proxy-Authorization"
+
": Basic "
+
Convert
.
ToBase64String
(
Encoding
.
UTF8
.
GetBytes
(
ServerConnection
.
UpStreamHttpProxy
.
UserName
+
":"
+
ServerConnection
.
UpStreamHttpProxy
.
Password
)));
}
//write request headers
foreach
(
var
headerItem
in
this
.
Request
.
RequestHeaders
)
...
...
@@ -138,8 +122,6 @@ namespace Titanium.Web.Proxy.Http
string
request
=
requestLines
.
ToString
();
byte
[]
requestBytes
=
Encoding
.
ASCII
.
GetBytes
(
request
);
var
test
=
Encoding
.
UTF8
.
GetString
(
requestBytes
);
await
stream
.
WriteAsync
(
requestBytes
,
0
,
requestBytes
.
Length
);
await
stream
.
FlushAsync
();
...
...
@@ -240,12 +222,9 @@ namespace Titanium.Web.Proxy.Http
{
var
existing
=
Response
.
ResponseHeaders
[
newHeader
.
Name
];
var
nonUniqueHeaders
=
new
List
<
HttpHeader
>()
;
var
nonUniqueHeaders
=
new
List
<
HttpHeader
>
{
existing
,
newHeader
}
;
nonUniqueHeaders
.
Add
(
existing
);
nonUniqueHeaders
.
Add
(
newHeader
);
Response
.
NonUniqueResponseHeaders
.
Add
(
newHeader
.
Name
,
nonUniqueHeaders
);
Response
.
NonUniqueResponseHeaders
.
Add
(
newHeader
.
Name
,
nonUniqueHeaders
);
Response
.
ResponseHeaders
.
Remove
(
newHeader
.
Name
);
}
//add to unique header collection
...
...
@@ -256,5 +235,4 @@ namespace Titanium.Web.Proxy.Http
}
}
}
}
}
\ No newline at end of file
Titanium.Web.Proxy/Http/Request.cs
View file @
4c68f687
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
using
Titanium.Web.Proxy.Models
;
using
Titanium.Web.Proxy.Extensions
;
...
...
@@ -234,13 +233,14 @@ namespace Titanium.Web.Proxy.Http
/// <summary>
/// Request Url
/// </summary>
public
string
Url
{
get
{
return
RequestUri
.
OriginalString
;
}
}
public
string
Url
=>
RequestUri
.
OriginalString
;
/// <summary>
/// <summary>
/// Encoding for this request
/// </summary>
internal
Encoding
Encoding
{
get
{
return
this
.
GetEncoding
();
}
}
/// <summary>
internal
Encoding
Encoding
=>
this
.
GetEncoding
();
/// <summary>
/// Terminates the underlying Tcp Connection to client after current request
/// </summary>
internal
bool
CancelRequest
{
get
;
set
;
}
...
...
Titanium.Web.Proxy/Http/Response.cs
View file @
4c68f687
using
System.Collections.Generic
;
using
System.IO
;
using
System.Linq
;
using
System.Text
;
using
Titanium.Web.Proxy.Models
;
using
Titanium.Web.Proxy.Extensions
;
...
...
@@ -16,9 +15,9 @@ namespace Titanium.Web.Proxy.Http
public
string
ResponseStatusCode
{
get
;
set
;
}
public
string
ResponseStatusDescription
{
get
;
set
;
}
internal
Encoding
Encoding
{
get
{
return
this
.
GetResponseCharacterEncoding
();
}
}
internal
Encoding
Encoding
=>
this
.
GetResponseCharacterEncoding
();
/// <summary>
/// <summary>
/// Content encoding for this response
/// </summary>
internal
string
ContentEncoding
...
...
Titanium.Web.Proxy/Http/Responses/OkResponse.cs
View file @
4c68f687
...
...
@@ -3,7 +3,7 @@
/// <summary>
/// 200 Ok response
/// </summary>
public
class
OkResponse
:
Response
public
sealed
class
OkResponse
:
Response
{
public
OkResponse
()
{
...
...
Titanium.Web.Proxy/Http/Responses/RedirectResponse.cs
View file @
4c68f687
using
Titanium.Web.Proxy.Network
;
namespace
Titanium.Web.Proxy.Http.Responses
namespace
Titanium.Web.Proxy.Http.Responses
{
/// <summary>
/// Redirect response
/// </summary>
public
class
RedirectResponse
:
Response
public
sealed
class
RedirectResponse
:
Response
{
public
RedirectResponse
()
{
...
...
Titanium.Web.Proxy/Network/CertificateManager.cs
View file @
4c68f687
...
...
@@ -2,11 +2,9 @@
using
System.Collections.Generic
;
using
System.Security.Cryptography.X509Certificates
;
using
System.Threading.Tasks
;
using
System.Threading
;
using
System.Linq
;
using
System.Collections.Concurrent
;
using
System.IO
;
using
System.Diagnostics
;
namespace
Titanium.Web.Proxy.Network
{
...
...
Titanium.Web.Proxy/Network/TcpConnectionFactory.cs
View file @
4c68f687
...
...
@@ -56,11 +56,11 @@ namespace Titanium.Web.Proxy.Network
using
(
var
writer
=
new
StreamWriter
(
stream
,
Encoding
.
ASCII
,
bufferSize
,
true
))
{
await
writer
.
WriteLineAsync
(
string
.
Format
(
"CONNECT {0}:{1} HTTP/{2}"
,
remoteHostName
,
remotePort
,
httpVersion
)
);
await
writer
.
WriteLineAsync
(
string
.
Format
(
"Host: {0}:{1}"
,
remoteHostName
,
remotePort
)
);
await
writer
.
WriteLineAsync
(
$"CONNECT
{
remoteHostName
}
:
{
remotePort
}
HTTP/
{
httpVersion
}
"
);
await
writer
.
WriteLineAsync
(
$"Host:
{
remoteHostName
}
:
{
remotePort
}
"
);
await
writer
.
WriteLineAsync
(
"Connection: Keep-Alive"
);
if
(
externalHttpsProxy
.
UserName
!=
null
&&
externalHttpsProxy
.
UserName
!=
""
&&
externalHttpsProxy
.
Password
!=
null
)
if
(
!
string
.
IsNullOrEmpty
(
externalHttpsProxy
.
UserName
)
&&
externalHttpsProxy
.
Password
!=
null
)
{
await
writer
.
WriteLineAsync
(
"Proxy-Connection: keep-alive"
);
await
writer
.
WriteLineAsync
(
"Proxy-Authorization"
+
": Basic "
+
Convert
.
ToBase64String
(
System
.
Text
.
Encoding
.
UTF8
.
GetBytes
(
externalHttpsProxy
.
UserName
+
":"
+
externalHttpsProxy
.
Password
)));
...
...
Titanium.Web.Proxy/ProxyServer.cs
View file @
4c68f687
...
...
@@ -17,22 +17,13 @@ namespace Titanium.Web.Proxy
/// </summary>
public
partial
class
ProxyServer
:
IDisposable
{
private
static
Action
<
Exception
>
_exceptionFunc
=
null
;
private
static
readonly
Lazy
<
Action
<
Exception
>>
_defaultExceptionFunc
=
new
Lazy
<
Action
<
Exception
>>(()
=>
(
e
=>
{
}));
private
static
Action
<
Exception
>
_exceptionFunc
;
public
static
Action
<
Exception
>
ExceptionFunc
{
get
{
if
(
_exceptionFunc
!=
null
)
{
return
_exceptionFunc
;
}
else
{
return
(
e
)=>
{
};
}
return
_exceptionFunc
??
_defaultExceptionFunc
.
Value
;
}
set
{
...
...
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