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
2c738ae1
Commit
2c738ae1
authored
Dec 29, 2017
by
Honfika
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Make request/response methods more similar
parent
6393b39a
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
196 additions
and
173 deletions
+196
-173
SessionEventArgs.cs
Titanium.Web.Proxy/EventArguments/SessionEventArgs.cs
+38
-28
StreamExtensions.cs
Titanium.Web.Proxy/Extensions/StreamExtensions.cs
+10
-10
HttpResponseWriter.cs
Titanium.Web.Proxy/Helpers/HttpResponseWriter.cs
+0
-91
HttpWriter.cs
Titanium.Web.Proxy/Helpers/HttpWriter.cs
+110
-1
HttpWebClient.cs
Titanium.Web.Proxy/Http/HttpWebClient.cs
+1
-3
TcpConnection.cs
Titanium.Web.Proxy/Network/Tcp/TcpConnection.cs
+4
-0
TcpConnectionFactory.cs
Titanium.Web.Proxy/Network/Tcp/TcpConnectionFactory.cs
+1
-0
RequestHandler.cs
Titanium.Web.Proxy/RequestHandler.cs
+31
-39
ResponseHandler.cs
Titanium.Web.Proxy/ResponseHandler.cs
+1
-1
No files found.
Titanium.Web.Proxy/EventArguments/SessionEventArgs.cs
View file @
2c738ae1
...
@@ -139,38 +139,42 @@ namespace Titanium.Web.Proxy.EventArguments
...
@@ -139,38 +139,42 @@ namespace Titanium.Web.Proxy.EventArguments
{
{
WebSession
.
Request
.
EnsureBodyAvailable
(
false
);
WebSession
.
Request
.
EnsureBodyAvailable
(
false
);
//Caching check
var
request
=
WebSession
.
Request
;
if
(!
WebSession
.
Request
.
IsBodyRead
)
//If not already read (not cached yet)
if
(!
request
.
IsBodyRead
)
{
{
//If chunked then its easy just read the whole body with the content length mentioned in the request header
//If chunked then its easy just read the whole body with the content length mentioned in the request header
using
(
var
requestB
odyStream
=
new
MemoryStream
())
using
(
var
b
odyStream
=
new
MemoryStream
())
{
{
var
streamReader
=
ProxyClient
.
ClientStreamReader
;
//For chunked request we need to read data as they arrive, until we reach a chunk end symbol
//For chunked request we need to read data as they arrive, until we reach a chunk end symbol
if
(
WebSession
.
R
equest
.
IsChunked
)
if
(
r
equest
.
IsChunked
)
{
{
await
ProxyClient
.
ClientStreamReader
.
CopyBytesToStreamChunked
(
requestB
odyStream
);
await
streamReader
.
CopyBytesToStreamChunked
(
b
odyStream
);
}
}
else
else
{
{
//If not chunked then its easy just read the whole body with the content length mentioned in the request header
//If not chunked then its easy just read the whole body with the content length mentioned in the request header
if
(
WebSession
.
R
equest
.
ContentLength
>
0
)
if
(
r
equest
.
ContentLength
>
0
)
{
{
//If not chunked then its easy just read the amount of bytes mentioned in content length header of response
//If not chunked then its easy just read the amount of bytes mentioned in content length header of response
await
ProxyClient
.
ClientStreamReader
.
CopyBytesToStream
(
requestBodyStream
,
WebSession
.
R
equest
.
ContentLength
);
await
streamReader
.
CopyBytesToStream
(
bodyStream
,
r
equest
.
ContentLength
);
}
}
else
if
(
WebSession
.
Request
.
HttpVersion
.
Major
==
1
&&
WebSession
.
R
equest
.
HttpVersion
.
Minor
==
0
)
else
if
(
request
.
HttpVersion
.
Major
==
1
&&
r
equest
.
HttpVersion
.
Minor
==
0
)
{
{
await
WebSession
.
ServerConnection
.
StreamReader
.
CopyBytesToStream
(
requestB
odyStream
,
long
.
MaxValue
);
await
streamReader
.
CopyBytesToStream
(
b
odyStream
,
long
.
MaxValue
);
}
}
}
}
WebSession
.
Request
.
Body
=
await
GetDecompressedResponseBody
(
WebSession
.
Request
.
ContentEncoding
,
requestB
odyStream
.
ToArray
());
request
.
Body
=
await
GetDecompressedResponseBody
(
request
.
ContentEncoding
,
b
odyStream
.
ToArray
());
}
}
//Now set the flag to true
//Now set the flag to true
//So that next time we can deliver body from cache
//So that next time we can deliver body from cache
WebSession
.
R
equest
.
IsBodyRead
=
true
;
r
equest
.
IsBodyRead
=
true
;
var
body
=
WebSession
.
R
equest
.
Body
;
var
body
=
r
equest
.
Body
;
OnDataSent
(
body
,
0
,
body
.
Length
);
OnDataSent
(
body
,
0
,
body
.
Length
);
}
}
}
}
...
@@ -210,43 +214,49 @@ namespace Titanium.Web.Proxy.EventArguments
...
@@ -210,43 +214,49 @@ namespace Titanium.Web.Proxy.EventArguments
throw
new
Exception
(
"You cannot read the response body before request is made to server."
);
throw
new
Exception
(
"You cannot read the response body before request is made to server."
);
}
}
var
response
=
WebSession
.
Response
;
//If not already read (not cached yet)
//If not already read (not cached yet)
if
(!
WebSession
.
R
esponse
.
IsBodyRead
)
if
(!
r
esponse
.
IsBodyRead
)
{
{
if
(
WebSession
.
R
esponse
.
HasBody
)
if
(
r
esponse
.
HasBody
)
{
{
using
(
var
responseB
odyStream
=
new
MemoryStream
())
using
(
var
b
odyStream
=
new
MemoryStream
())
{
{
//If chuncked the read chunk by chunk until we hit chunk end symbol
var
streamReader
=
WebSession
.
ServerConnection
.
StreamReader
;
if
(
WebSession
.
Response
.
IsChunked
)
//For chunked request we need to read data as they arrive, until we reach a chunk end symbol
if
(
response
.
IsChunked
)
{
{
await
WebSession
.
ServerConnection
.
StreamReader
.
CopyBytesToStreamChunked
(
responseB
odyStream
);
await
streamReader
.
CopyBytesToStreamChunked
(
b
odyStream
);
}
}
else
else
{
{
if
(
WebSession
.
Response
.
ContentLength
>
0
)
//If not chunked then its easy just read the whole body with the content length mentioned in the request header
if
(
response
.
ContentLength
>
0
)
{
{
//If not chunked then its easy just read the amount of bytes mentioned in content length header of response
//If not chunked then its easy just read the amount of bytes mentioned in content length header of response
await
WebSession
.
ServerConnection
.
StreamReader
.
CopyBytesToStream
(
responseBodyStream
,
WebSession
.
R
esponse
.
ContentLength
);
await
streamReader
.
CopyBytesToStream
(
bodyStream
,
r
esponse
.
ContentLength
);
}
}
else
if
(
WebSession
.
Response
.
HttpVersion
.
Major
==
1
&&
WebSession
.
Response
.
HttpVersion
.
Minor
==
0
||
else
if
(
response
.
HttpVersion
.
Major
==
1
&&
response
.
HttpVersion
.
Minor
==
0
||
WebSession
.
R
esponse
.
ContentLength
==
-
1
)
r
esponse
.
ContentLength
==
-
1
)
{
{
await
WebSession
.
ServerConnection
.
StreamReader
.
CopyBytesToStream
(
responseB
odyStream
,
long
.
MaxValue
);
await
streamReader
.
CopyBytesToStream
(
b
odyStream
,
long
.
MaxValue
);
}
}
}
}
WebSession
.
Response
.
Body
=
await
GetDecompressedResponseBody
(
WebSession
.
Response
.
ContentEncoding
,
responseB
odyStream
.
ToArray
());
response
.
Body
=
await
GetDecompressedResponseBody
(
response
.
ContentEncoding
,
b
odyStream
.
ToArray
());
}
}
}
}
else
else
{
{
WebSession
.
R
esponse
.
Body
=
new
byte
[
0
];
r
esponse
.
Body
=
new
byte
[
0
];
}
}
//set this to true for caching
//Now set the flag to true
WebSession
.
Response
.
IsBodyRead
=
true
;
//So that next time we can deliver body from cache
var
body
=
WebSession
.
Response
.
Body
;
response
.
IsBodyRead
=
true
;
var
body
=
response
.
Body
;
OnDataReceived
(
body
,
0
,
body
.
Length
);
OnDataReceived
(
body
,
0
,
body
.
Length
);
}
}
}
}
...
...
Titanium.Web.Proxy/Extensions/StreamExtensions.cs
View file @
2c738ae1
...
@@ -72,26 +72,26 @@ namespace Titanium.Web.Proxy.Extensions
...
@@ -72,26 +72,26 @@ namespace Titanium.Web.Proxy.Extensions
/// <summary>
/// <summary>
/// Copies the stream chunked
/// Copies the stream chunked
/// </summary>
/// </summary>
/// <param name="
clientStreamR
eader"></param>
/// <param name="
r
eader"></param>
/// <param name="stream"></param>
/// <param name="stream"></param>
/// <returns></returns>
/// <returns></returns>
internal
static
async
Task
CopyBytesToStreamChunked
(
this
CustomBinaryReader
clientStreamR
eader
,
Stream
stream
)
internal
static
async
Task
CopyBytesToStreamChunked
(
this
CustomBinaryReader
r
eader
,
Stream
stream
)
{
{
while
(
true
)
while
(
true
)
{
{
string
chu
chkHead
=
await
clientStreamR
eader
.
ReadLineAsync
();
string
chu
nkHead
=
await
r
eader
.
ReadLineAsync
();
int
chunkSize
=
int
.
Parse
(
chu
ch
kHead
,
NumberStyles
.
HexNumber
);
int
chunkSize
=
int
.
Parse
(
chu
n
kHead
,
NumberStyles
.
HexNumber
);
if
(
chunkSize
!=
0
)
if
(
chunkSize
!=
0
)
{
{
await
CopyBytesToStream
(
clientStreamReader
,
stream
,
chunkSize
);
await
CopyBytesToStream
(
reader
,
stream
,
chunkSize
);
}
//chunk trail
//chunk trail
await
clientStreamR
eader
.
ReadLineAsync
();
await
r
eader
.
ReadLineAsync
();
}
else
if
(
chunkSize
==
0
)
{
{
await
clientStreamReader
.
ReadLineAsync
();
break
;
break
;
}
}
}
}
...
...
Titanium.Web.Proxy/Helpers/HttpResponseWriter.cs
View file @
2c738ae1
...
@@ -40,96 +40,5 @@ namespace Titanium.Web.Proxy.Helpers
...
@@ -40,96 +40,5 @@ namespace Titanium.Web.Proxy.Helpers
{
{
return
WriteLineAsync
(
$"HTTP/
{
version
.
Major
}
.
{
version
.
Minor
}
{
code
}
{
description
}
"
);
return
WriteLineAsync
(
$"HTTP/
{
version
.
Major
}
.
{
version
.
Minor
}
{
code
}
{
description
}
"
);
}
}
/// <summary>
/// Writes the byte array body to the stream; optionally chunked
/// </summary>
/// <param name="data"></param>
/// <param name="isChunked"></param>
/// <returns></returns>
internal
async
Task
WriteResponseBodyAsync
(
byte
[]
data
,
bool
isChunked
)
{
if
(!
isChunked
)
{
await
BaseStream
.
WriteAsync
(
data
,
0
,
data
.
Length
);
}
else
{
await
WriteResponseBodyChunkedAsync
(
data
);
}
}
/// <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="isChunked"></param>
/// <param name="contentLength"></param>
/// <returns></returns>
internal
async
Task
CopyBodyAsync
(
CustomBinaryReader
inStreamReader
,
bool
isChunked
,
long
contentLength
)
{
if
(!
isChunked
)
{
//http 1.0
if
(
contentLength
==
-
1
)
{
contentLength
=
long
.
MaxValue
;
}
await
inStreamReader
.
CopyBytesToStream
(
BaseStream
,
contentLength
);
}
else
{
await
CopyBodyChunkedAsync
(
inStreamReader
);
}
}
/// <summary>
/// Copies the given input bytes to output stream chunked
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private
async
Task
WriteResponseBodyChunkedAsync
(
byte
[]
data
)
{
var
chunkHead
=
Encoding
.
ASCII
.
GetBytes
(
data
.
Length
.
ToString
(
"x2"
));
await
WriteAsync
(
chunkHead
);
await
WriteLineAsync
();
await
WriteAsync
(
data
);
await
WriteLineAsync
();
await
WriteLineAsync
(
"0"
);
await
WriteLineAsync
();
}
/// <summary>
/// Copies the streams chunked
/// </summary>
/// <param name="inStreamReader"></param>
/// <returns></returns>
private
async
Task
CopyBodyChunkedAsync
(
CustomBinaryReader
inStreamReader
)
{
while
(
true
)
{
string
chunkHead
=
await
inStreamReader
.
ReadLineAsync
();
int
chunkSize
=
int
.
Parse
(
chunkHead
,
NumberStyles
.
HexNumber
);
await
WriteLineAsync
(
chunkHead
);
if
(
chunkSize
!=
0
)
{
await
inStreamReader
.
CopyBytesToStream
(
BaseStream
,
chunkSize
);
}
await
WriteLineAsync
();
await
inStreamReader
.
ReadLineAsync
();
if
(
chunkSize
==
0
)
{
break
;
}
}
}
}
}
}
}
Titanium.Web.Proxy/Helpers/HttpWriter.cs
View file @
2c738ae1
using
System.IO
;
using
System.Globalization
;
using
System.IO
;
using
System.Text
;
using
System.Text
;
using
System.Threading.Tasks
;
using
System.Threading.Tasks
;
using
StreamExtended.Network
;
using
Titanium.Web.Proxy.Extensions
;
using
Titanium.Web.Proxy.Http
;
using
Titanium.Web.Proxy.Http
;
using
Titanium.Web.Proxy.Shared
;
using
Titanium.Web.Proxy.Shared
;
...
@@ -64,5 +67,111 @@ namespace Titanium.Web.Proxy.Helpers
...
@@ -64,5 +67,111 @@ namespace Titanium.Web.Proxy.Helpers
await
FlushAsync
();
await
FlushAsync
();
}
}
}
}
public
async
Task
WriteAsync
(
byte
[]
data
,
int
offset
,
int
count
,
bool
flush
=
false
)
{
await
FlushAsync
();
await
BaseStream
.
WriteAsync
(
data
,
offset
,
count
);
if
(
flush
)
{
// flush the stream and the encoder, too
await
FlushAsync
();
}
}
/// <summary>
/// Writes the byte array body to the stream; optionally chunked
/// </summary>
/// <param name="data"></param>
/// <param name="isChunked"></param>
/// <returns></returns>
internal
async
Task
WriteBodyAsync
(
byte
[]
data
,
bool
isChunked
)
{
if
(!
isChunked
)
{
await
BaseStream
.
WriteAsync
(
data
,
0
,
data
.
Length
);
}
else
{
await
WriteBodyChunkedAsync
(
data
);
}
}
/// <summary>
/// Copies the specified content length number of bytes to the output stream from the given inputs stream
/// optionally chunked
/// </summary>
/// <param name="streamReader"></param>
/// <param name="isChunked"></param>
/// <param name="contentLength"></param>
/// <returns></returns>
internal
async
Task
CopyBodyAsync
(
CustomBinaryReader
streamReader
,
bool
isChunked
,
long
contentLength
)
{
if
(!
isChunked
)
{
//http 1.0
if
(
contentLength
==
-
1
)
{
contentLength
=
long
.
MaxValue
;
}
await
streamReader
.
CopyBytesToStream
(
BaseStream
,
contentLength
);
}
else
{
//Need to revist, find any potential bugs
//send the body bytes to server in chunks
await
CopyBodyChunkedAsync
(
streamReader
);
}
}
/// <summary>
/// Copies the given input bytes to output stream chunked
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private
async
Task
WriteBodyChunkedAsync
(
byte
[]
data
)
{
var
chunkHead
=
Encoding
.
ASCII
.
GetBytes
(
data
.
Length
.
ToString
(
"x2"
));
await
WriteAsync
(
chunkHead
);
await
WriteLineAsync
();
await
WriteAsync
(
data
);
await
WriteLineAsync
();
await
WriteLineAsync
(
"0"
);
await
WriteLineAsync
();
}
/// <summary>
/// Copies the streams chunked
/// </summary>
/// <param name="reader"></param>
/// <returns></returns>
private
async
Task
CopyBodyChunkedAsync
(
CustomBinaryReader
reader
)
{
while
(
true
)
{
string
chunkHead
=
await
reader
.
ReadLineAsync
();
int
chunkSize
=
int
.
Parse
(
chunkHead
,
NumberStyles
.
HexNumber
);
await
WriteLineAsync
(
chunkHead
);
if
(
chunkSize
!=
0
)
{
await
reader
.
CopyBytesToStream
(
BaseStream
,
chunkSize
);
}
await
WriteLineAsync
();
//chunk trail
await
reader
.
ReadLineAsync
();
if
(
chunkSize
==
0
)
{
break
;
}
}
}
}
}
}
}
Titanium.Web.Proxy/Http/HttpWebClient.cs
View file @
2c738ae1
...
@@ -125,9 +125,7 @@ namespace Titanium.Web.Proxy.Http
...
@@ -125,9 +125,7 @@ namespace Titanium.Web.Proxy.Http
requestBytes
=
ms
.
ToArray
();
requestBytes
=
ms
.
ToArray
();
}
}
var
stream
=
ServerConnection
.
Stream
;
await
ServerConnection
.
StreamWriter
.
WriteAsync
(
requestBytes
,
true
);
await
stream
.
WriteAsync
(
requestBytes
,
0
,
requestBytes
.
Length
);
await
stream
.
FlushAsync
();
if
(
enable100ContinueBehaviour
)
if
(
enable100ContinueBehaviour
)
{
{
...
...
Titanium.Web.Proxy/Network/Tcp/TcpConnection.cs
View file @
2c738ae1
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
using
System
;
using
System
;
using
System.Net
;
using
System.Net
;
using
System.Net.Sockets
;
using
System.Net.Sockets
;
using
Titanium.Web.Proxy.Helpers
;
using
Titanium.Web.Proxy.Models
;
using
Titanium.Web.Proxy.Models
;
namespace
Titanium.Web.Proxy.Network.Tcp
namespace
Titanium.Web.Proxy.Network.Tcp
...
@@ -38,6 +39,8 @@ namespace Titanium.Web.Proxy.Network.Tcp
...
@@ -38,6 +39,8 @@ namespace Titanium.Web.Proxy.Network.Tcp
/// </summary>
/// </summary>
internal
CustomBinaryReader
StreamReader
{
get
;
set
;
}
internal
CustomBinaryReader
StreamReader
{
get
;
set
;
}
internal
HttpRequestWriter
StreamWriter
{
get
;
set
;
}
/// <summary>
/// <summary>
/// Server stream
/// Server stream
/// </summary>
/// </summary>
...
@@ -61,6 +64,7 @@ namespace Titanium.Web.Proxy.Network.Tcp
...
@@ -61,6 +64,7 @@ namespace Titanium.Web.Proxy.Network.Tcp
Stream
?.
Dispose
();
Stream
?.
Dispose
();
StreamReader
?.
Dispose
();
StreamReader
?.
Dispose
();
StreamWriter
?.
Dispose
();
try
try
{
{
...
...
Titanium.Web.Proxy/Network/Tcp/TcpConnectionFactory.cs
View file @
2c738ae1
...
@@ -130,6 +130,7 @@ namespace Titanium.Web.Proxy.Network.Tcp
...
@@ -130,6 +130,7 @@ namespace Titanium.Web.Proxy.Network.Tcp
UseUpstreamProxy
=
useUpstreamProxy
,
UseUpstreamProxy
=
useUpstreamProxy
,
TcpClient
=
client
,
TcpClient
=
client
,
StreamReader
=
new
CustomBinaryReader
(
stream
,
server
.
BufferSize
),
StreamReader
=
new
CustomBinaryReader
(
stream
,
server
.
BufferSize
),
StreamWriter
=
new
HttpRequestWriter
(
stream
,
server
.
BufferSize
),
Stream
=
stream
,
Stream
=
stream
,
Version
=
httpVersion
Version
=
httpVersion
};
};
...
...
Titanium.Web.Proxy/RequestHandler.cs
View file @
2c738ae1
...
@@ -171,8 +171,7 @@ namespace Titanium.Web.Proxy
...
@@ -171,8 +171,7 @@ namespace Titanium.Web.Proxy
//send the buffered data
//send the buffered data
var
data
=
new
byte
[
clientStream
.
Available
];
var
data
=
new
byte
[
clientStream
.
Available
];
await
clientStream
.
ReadAsync
(
data
,
0
,
data
.
Length
);
await
clientStream
.
ReadAsync
(
data
,
0
,
data
.
Length
);
await
connection
.
Stream
.
WriteAsync
(
data
,
0
,
data
.
Length
);
await
connection
.
StreamWriter
.
WriteAsync
(
data
,
true
);
await
connection
.
Stream
.
FlushAsync
();
}
}
var
serverHelloInfo
=
await
SslTools
.
PeekServerHello
(
connection
.
Stream
);
var
serverHelloInfo
=
await
SslTools
.
PeekServerHello
(
connection
.
Stream
);
...
@@ -388,7 +387,7 @@ namespace Titanium.Web.Proxy
...
@@ -388,7 +387,7 @@ namespace Titanium.Web.Proxy
requestBytes
=
ms
.
ToArray
();
requestBytes
=
ms
.
ToArray
();
}
}
await
connection
.
Stream
.
WriteAsync
(
requestBytes
,
0
,
requestBytes
.
Length
);
await
connection
.
Stream
Writer
.
WriteAsync
(
requestBytes
);
string
httpStatus
=
await
connection
.
StreamReader
.
ReadLineAsync
();
string
httpStatus
=
await
connection
.
StreamReader
.
ReadLineAsync
();
Response
.
ParseResponseLine
(
httpStatus
,
out
var
responseVersion
,
out
int
responseStatusCode
,
out
string
responseStatusDescription
);
Response
.
ParseResponseLine
(
httpStatus
,
out
var
responseVersion
,
out
int
responseStatusCode
,
out
string
responseStatusDescription
);
...
@@ -478,15 +477,17 @@ namespace Titanium.Web.Proxy
...
@@ -478,15 +477,17 @@ namespace Titanium.Web.Proxy
//If 100 continue was the response inform that to the client
//If 100 continue was the response inform that to the client
if
(
Enable100ContinueBehaviour
)
if
(
Enable100ContinueBehaviour
)
{
{
var
clientStreamWriter
=
args
.
ProxyClient
.
ClientStreamWriter
;
if
(
request
.
Is100Continue
)
if
(
request
.
Is100Continue
)
{
{
await
args
.
ProxyClient
.
C
lientStreamWriter
.
WriteResponseStatusAsync
(
args
.
WebSession
.
Response
.
HttpVersion
,
(
int
)
HttpStatusCode
.
Continue
,
"Continue"
);
await
c
lientStreamWriter
.
WriteResponseStatusAsync
(
args
.
WebSession
.
Response
.
HttpVersion
,
(
int
)
HttpStatusCode
.
Continue
,
"Continue"
);
await
args
.
ProxyClient
.
C
lientStreamWriter
.
WriteLineAsync
();
await
c
lientStreamWriter
.
WriteLineAsync
();
}
}
else
if
(
request
.
ExpectationFailed
)
else
if
(
request
.
ExpectationFailed
)
{
{
await
args
.
ProxyClient
.
C
lientStreamWriter
.
WriteResponseStatusAsync
(
args
.
WebSession
.
Response
.
HttpVersion
,
(
int
)
HttpStatusCode
.
ExpectationFailed
,
"Expectation Failed"
);
await
c
lientStreamWriter
.
WriteResponseStatusAsync
(
args
.
WebSession
.
Response
.
HttpVersion
,
(
int
)
HttpStatusCode
.
ExpectationFailed
,
"Expectation Failed"
);
await
args
.
ProxyClient
.
C
lientStreamWriter
.
WriteLineAsync
();
await
c
lientStreamWriter
.
WriteLineAsync
();
}
}
}
}
...
@@ -513,8 +514,7 @@ namespace Titanium.Web.Proxy
...
@@ -513,8 +514,7 @@ namespace Titanium.Web.Proxy
//chunked send is not supported as of now
//chunked send is not supported as of now
request
.
ContentLength
=
body
.
Length
;
request
.
ContentLength
=
body
.
Length
;
var
newStream
=
args
.
WebSession
.
ServerConnection
.
Stream
;
await
args
.
WebSession
.
ServerConnection
.
StreamWriter
.
WriteAsync
(
body
);
await
newStream
.
WriteAsync
(
body
,
0
,
body
.
Length
);
}
}
else
else
{
{
...
@@ -626,20 +626,18 @@ namespace Titanium.Web.Proxy
...
@@ -626,20 +626,18 @@ namespace Titanium.Web.Proxy
private
async
Task
SendClientRequestBody
(
SessionEventArgs
args
)
private
async
Task
SendClientRequestBody
(
SessionEventArgs
args
)
{
{
// End the operation
// End the operation
var
postStream
=
args
.
WebSession
.
ServerConnection
.
Stream
;
var
request
=
args
.
WebSession
.
Request
;
//send the request body bytes to server
//send the request body bytes to server
if
(
args
.
WebSession
.
Request
.
ContentLength
>
0
)
if
(
request
.
ContentLength
>
0
&&
args
.
HasMulipartEventSubscribers
&&
request
.
IsMultipartFormData
)
{
var
request
=
args
.
WebSession
.
Request
;
if
(
args
.
HasMulipartEventSubscribers
&&
request
.
IsMultipartFormData
)
{
{
string
boundary
=
HttpHelper
.
GetBoundaryFromContentType
(
request
.
ContentType
);
string
boundary
=
HttpHelper
.
GetBoundaryFromContentType
(
request
.
ContentType
);
long
bytesToSend
=
args
.
WebSession
.
R
equest
.
ContentLength
;
long
bytesToSend
=
r
equest
.
ContentLength
;
while
(
bytesToSend
>
0
)
while
(
bytesToSend
>
0
)
{
{
long
read
=
await
SendUntilBoundaryAsync
(
args
.
ProxyClient
.
ClientStream
,
postStream
,
bytesToSend
,
boundary
);
var
outputStream
=
args
.
WebSession
.
ServerConnection
.
StreamWriter
;
long
read
=
await
SendUntilBoundaryAsync
(
args
.
ProxyClient
.
ClientStream
,
outputStream
,
bytesToSend
,
boundary
);
if
(
read
==
0
)
if
(
read
==
0
)
{
{
break
;
break
;
...
@@ -657,14 +655,8 @@ namespace Titanium.Web.Proxy
...
@@ -657,14 +655,8 @@ namespace Titanium.Web.Proxy
}
}
else
else
{
{
await
args
.
ProxyClient
.
ClientStreamReader
.
CopyBytesToStream
(
postStream
,
args
.
WebSession
.
Request
.
ContentLength
);
await
args
.
WebSession
.
ServerConnection
.
StreamWriter
.
CopyBodyAsync
(
args
.
ProxyClient
.
ClientStreamReader
,
}
request
.
IsChunked
,
request
.
ContentLength
);
}
//Need to revist, find any potential bugs
//send the request body bytes to server in chunks
else
if
(
args
.
WebSession
.
Request
.
IsChunked
)
{
await
args
.
ProxyClient
.
ClientStreamReader
.
CopyBytesToStreamChunked
(
postStream
);
}
}
}
}
...
@@ -672,7 +664,7 @@ namespace Titanium.Web.Proxy
...
@@ -672,7 +664,7 @@ namespace Titanium.Web.Proxy
/// Read a line from the byte stream
/// Read a line from the byte stream
/// </summary>
/// </summary>
/// <returns></returns>
/// <returns></returns>
p
ublic
async
Task
<
long
>
SendUntilBoundaryAsync
(
CustomBufferedStream
inputStream
,
CustomBufferedStream
outputStream
,
long
totalBytesToRead
,
string
boundary
)
p
rivate
async
Task
<
long
>
SendUntilBoundaryAsync
(
CustomBufferedStream
inputStream
,
HttpRequestWriter
outputStream
,
long
totalBytesToRead
,
string
boundary
)
{
{
int
bufferDataLength
=
0
;
int
bufferDataLength
=
0
;
...
...
Titanium.Web.Proxy/ResponseHandler.cs
View file @
2c738ae1
...
@@ -96,7 +96,7 @@ namespace Titanium.Web.Proxy
...
@@ -96,7 +96,7 @@ namespace Titanium.Web.Proxy
}
}
await
clientStreamWriter
.
WriteHeadersAsync
(
response
.
Headers
);
await
clientStreamWriter
.
WriteHeadersAsync
(
response
.
Headers
);
await
clientStreamWriter
.
Write
Response
BodyAsync
(
response
.
Body
,
isChunked
);
await
clientStreamWriter
.
WriteBodyAsync
(
response
.
Body
,
isChunked
);
}
}
else
else
{
{
...
...
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