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
eb66c695
Commit
eb66c695
authored
Jun 04, 2017
by
Honfika
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Buffered stream improvements
parent
087d374a
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
61 additions
and
16 deletions
+61
-16
CustomBinaryReader.cs
Titanium.Web.Proxy/Helpers/CustomBinaryReader.cs
+0
-2
CustomBufferedStream.cs
Titanium.Web.Proxy/Helpers/CustomBufferedStream.cs
+61
-14
No files found.
Titanium.Web.Proxy/Helpers/CustomBinaryReader.cs
View file @
eb66c695
...
...
@@ -13,7 +13,6 @@ namespace Titanium.Web.Proxy.Helpers
internal
class
CustomBinaryReader
:
IDisposable
{
private
readonly
CustomBufferedStream
stream
;
private
readonly
int
bufferSize
;
private
readonly
Encoding
encoding
;
private
volatile
bool
disposed
;
...
...
@@ -24,7 +23,6 @@ namespace Titanium.Web.Proxy.Helpers
{
this
.
stream
=
stream
;
Buffer
=
BufferPool
.
GetBuffer
(
bufferSize
);
this
.
bufferSize
=
bufferSize
;
//default to UTF-8
encoding
=
Encoding
.
UTF8
;
...
...
Titanium.Web.Proxy/Helpers/CustomBufferedStream.cs
View file @
eb66c695
...
...
@@ -14,10 +14,14 @@ namespace Titanium.Web.Proxy.Helpers
/// <seealso cref="System.IO.Stream" />
internal
class
CustomBufferedStream
:
Stream
{
private
static
readonly
AsyncCallback
readCallback
=
ReadCallback
;
private
readonly
Stream
baseStream
;
private
byte
[]
streamBuffer
;
private
readonly
byte
[]
oneByteBuffer
=
new
byte
[
1
];
private
int
bufferLength
;
private
int
bufferPos
;
...
...
@@ -100,6 +104,7 @@ namespace Titanium.Web.Proxy.Helpers
/// <param name="count">The number of bytes to be written to the current stream.</param>
public
override
void
Write
(
byte
[]
buffer
,
int
offset
,
int
count
)
{
OnDataSent
(
buffer
,
offset
,
count
);
baseStream
.
Write
(
buffer
,
offset
,
count
);
}
...
...
@@ -123,10 +128,19 @@ namespace Titanium.Web.Proxy.Helpers
Buffer
.
BlockCopy
(
streamBuffer
,
bufferPos
,
buffer
,
offset
,
available
);
bufferPos
+=
available
;
bufferLength
-=
available
;
return
new
ReadAsyncResult
(
available
);
return
new
ReadAsyncResult
(
buffer
,
offset
,
available
,
state
,
callback
);
}
return
baseStream
.
BeginRead
(
buffer
,
offset
,
count
,
callback
,
state
);
var
result
=
new
ReadAsyncResult
(
buffer
,
offset
,
0
,
state
,
callback
);
result
.
BaseResult
=
baseStream
.
BeginRead
(
buffer
,
offset
,
count
,
readCallback
,
result
);
return
result
;
}
private
static
void
ReadCallback
(
IAsyncResult
ar
)
{
var
readResult
=
(
ReadAsyncResult
)
ar
.
AsyncState
;
readResult
.
BaseResult
=
ar
;
readResult
.
Callback
(
readResult
);
}
/// <summary>
...
...
@@ -143,6 +157,7 @@ namespace Titanium.Web.Proxy.Helpers
[
DebuggerStepThrough
]
public
override
IAsyncResult
BeginWrite
(
byte
[]
buffer
,
int
offset
,
int
count
,
AsyncCallback
callback
,
object
state
)
{
OnDataSent
(
buffer
,
offset
,
count
);
return
baseStream
.
BeginWrite
(
buffer
,
offset
,
count
,
callback
,
state
);
}
...
...
@@ -163,7 +178,7 @@ namespace Titanium.Web.Proxy.Helpers
bufferLength
=
0
;
}
await
base
Stream
.
CopyToAsync
(
destination
,
bufferSize
,
cancellationToken
);
await
base
.
CopyToAsync
(
destination
,
bufferSize
,
cancellationToken
);
}
/// <summary>
...
...
@@ -188,12 +203,11 @@ namespace Titanium.Web.Proxy.Helpers
[
DebuggerStepThrough
]
public
override
int
EndRead
(
IAsyncResult
asyncResult
)
{
if
(
asyncResult
is
ReadAsyncResult
)
{
return
((
ReadAsyncResult
)
asyncResult
).
ReadBytes
;
}
var
readResult
=
(
ReadAsyncResult
)
asyncResult
;
int
result
=
readResult
.
BaseResult
==
null
?
readResult
.
ReadBytes
:
baseStream
.
EndRead
(
readResult
.
BaseResult
);
return
baseStream
.
EndRead
(
asyncResult
);
OnDataReceived
(
readResult
.
Buffer
,
readResult
.
Offset
,
result
);
return
result
;
}
/// <summary>
...
...
@@ -313,6 +327,7 @@ namespace Titanium.Web.Proxy.Helpers
[
DebuggerStepThrough
]
public
override
Task
WriteAsync
(
byte
[]
buffer
,
int
offset
,
int
count
,
CancellationToken
cancellationToken
)
{
OnDataSent
(
buffer
,
offset
,
count
);
return
baseStream
.
WriteAsync
(
buffer
,
offset
,
count
,
cancellationToken
);
}
...
...
@@ -322,7 +337,17 @@ namespace Titanium.Web.Proxy.Helpers
/// <param name="value">The byte to write to the stream.</param>
public
override
void
WriteByte
(
byte
value
)
{
baseStream
.
WriteByte
(
value
);
oneByteBuffer
[
0
]
=
value
;
OnDataSent
(
oneByteBuffer
,
0
,
1
);
baseStream
.
Write
(
oneByteBuffer
,
0
,
1
);
}
private
void
OnDataSent
(
byte
[]
buffer
,
int
offset
,
int
count
)
{
}
private
void
OnDataReceived
(
byte
[]
buffer
,
int
offset
,
int
count
)
{
}
/// <summary>
...
...
@@ -397,6 +422,11 @@ namespace Titanium.Web.Proxy.Helpers
{
bufferLength
=
baseStream
.
Read
(
streamBuffer
,
0
,
streamBuffer
.
Length
);
bufferPos
=
0
;
if
(
bufferLength
>
0
)
{
OnDataReceived
(
streamBuffer
,
0
,
bufferLength
);
}
return
bufferLength
>
0
;
}
...
...
@@ -418,24 +448,41 @@ namespace Titanium.Web.Proxy.Helpers
{
bufferLength
=
await
baseStream
.
ReadAsync
(
streamBuffer
,
0
,
streamBuffer
.
Length
,
cancellationToken
);
bufferPos
=
0
;
if
(
bufferLength
>
0
)
{
OnDataReceived
(
streamBuffer
,
0
,
bufferLength
);
}
return
bufferLength
>
0
;
}
private
class
ReadAsyncResult
:
IAsyncResult
{
public
byte
[]
Buffer
{
get
;
}
public
int
Offset
{
get
;
}
public
IAsyncResult
BaseResult
{
get
;
set
;
}
public
int
ReadBytes
{
get
;
}
public
bool
IsCompleted
=>
true
;
public
object
AsyncState
{
get
;
}
public
AsyncCallback
Callback
{
get
;
}
public
WaitHandle
AsyncWaitHandle
=>
null
;
public
bool
IsCompleted
=>
CompletedSynchronously
||
BaseResult
.
IsCompleted
;
public
object
AsyncState
=>
null
;
public
WaitHandle
AsyncWaitHandle
=>
BaseResult
?.
AsyncWaitHandle
;
public
bool
CompletedSynchronously
=>
true
;
public
bool
CompletedSynchronously
=>
BaseResult
==
null
||
BaseResult
.
CompletedSynchronously
;
public
ReadAsyncResult
(
int
readBytes
)
public
ReadAsyncResult
(
byte
[]
buffer
,
int
offset
,
int
readBytes
,
object
state
,
AsyncCallback
callback
)
{
Buffer
=
buffer
;
Offset
=
offset
;
ReadBytes
=
readBytes
;
AsyncState
=
state
;
Callback
=
callback
;
}
}
}
...
...
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