Revert "Reuse buffer from first pakcage"

This reverts commit f2b8e91f81.
This commit is contained in:
noisyfox
2016-12-16 12:18:59 +11:00
parent efe6d5ba81
commit 511a658fd3
3 changed files with 21 additions and 31 deletions
@@ -70,8 +70,8 @@ namespace Shadowsocks.Controller.Service
_socks5Port = socks5Port;
_localSocket = new WrappedSocket(socket);
_localSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);
new LineReader(firstPacket, _localSocket, firstPacket, 0, length, OnLineRead, OnException, OnFinish,
Encoding.UTF8, HTTP_CRLF, null);
new LineReader(_localSocket, firstPacket, 0, length, OnLineRead, OnException, OnFinish,
Encoding.UTF8, HTTP_CRLF, 1024, null);
}
private void CheckClose()
@@ -164,8 +164,8 @@ namespace Shadowsocks.Controller.Service
private void SendConnectResponse()
{
var len = Encoding.UTF8.GetBytes(HTTP_CONNECT_200, 0, HTTP_CONNECT_200.Length, _remoteRecvBuffer, 0);
_localSocket.BeginSend(_remoteRecvBuffer, 0, len, SocketFlags.None, Http200SendCallback, null);
var b = Encoding.UTF8.GetBytes(HTTP_CONNECT_200);
_localSocket.BeginSend(b, 0, b.Length, SocketFlags.None, Http200SendCallback, null);
}
private void Http200SendCallback(IAsyncResult ar)
@@ -273,6 +273,7 @@ namespace Shadowsocks.Controller.Service
try
{
int bytesRead = _socks5.EndReceive(ar);
Logging.Debug("Read from remote: " + bytesRead);
if (bytesRead > 0)
{
@@ -301,6 +302,7 @@ namespace Shadowsocks.Controller.Service
try
{
int bytesRead = _localSocket.EndReceive(ar);
Logging.Debug("Read from local: " + bytesRead);
if (bytesRead > 0)
{
+1 -1
View File
@@ -134,7 +134,7 @@ namespace Shadowsocks.ForwardProxy
_remote.EndSend(ar);
// start line read
new LineReader(1024, _remote, OnLineRead, OnException, OnFinish, Encoding.UTF8, HTTP_CRLF, new FakeAsyncResult(ar, state));
new LineReader(_remote, OnLineRead, OnException, OnFinish, Encoding.UTF8, HTTP_CRLF, 1024, new FakeAsyncResult(ar, state));
}
catch (Exception ex)
{
+14 -26
View File
@@ -20,16 +20,12 @@ namespace Shadowsocks.Util.Sockets
private int _bufferDataIndex;
private int _bufferDataLength;
public LineReader(byte[] buffer, WrappedSocket socket, byte[] firstPackge, int index, int length,
public LineReader(WrappedSocket socket, byte[] firstPackge, int index, int length,
Func<string, object, bool> onLineRead, Action<Exception, object> onException,
Action<byte[], int, int, object> onFinish,
Encoding encoding, string delimiter,
Encoding encoding, string delimiter, int maxLineBytes,
object state)
{
if (buffer == null)
{
throw new ArgumentNullException(nameof(buffer));
}
if (socket == null)
{
throw new ArgumentNullException(nameof(socket));
@@ -47,9 +43,9 @@ namespace Shadowsocks.Util.Sockets
throw new ArgumentNullException(nameof(delimiter));
}
if (buffer.Length < length)
if (maxLineBytes < length)
{
throw new ArgumentException("Line buffer length can't less than first package length!", nameof(buffer));
throw new ArgumentException("Line buffer length can't less than first package length!", nameof(maxLineBytes));
}
if (length > 0)
@@ -76,26 +72,19 @@ namespace Shadowsocks.Util.Sockets
throw new ArgumentException("Too short!", nameof(delimiter));
}
if (buffer.Length < _delimiterBytes.Length)
if (maxLineBytes < _delimiterBytes.Length)
{
throw new ArgumentException("Too small!", nameof(buffer));
throw new ArgumentException("Too small!", nameof(maxLineBytes));
}
_delimiterSearch = new ByteSearch.SearchTarget(_delimiterBytes);
_lineBuffer = buffer;
_lineBuffer = new byte[maxLineBytes];
if (length > 0)
{
// process first package
if (buffer == firstPackge)
{
_bufferDataIndex = index;
}
else
{
Array.Copy(firstPackge, index, _lineBuffer, 0, length);
}
Array.Copy(firstPackge, index, _lineBuffer, 0, length);
_bufferDataLength = length;
try
@@ -111,16 +100,15 @@ namespace Shadowsocks.Util.Sockets
else
{
// start reading
socket.BeginReceive(_lineBuffer, 0, _lineBuffer.Length, 0, ReceiveCallback, 0);
socket.BeginReceive(_lineBuffer, 0, maxLineBytes, 0, ReceiveCallback, 0);
}
}
public LineReader(int maxLineBytes, WrappedSocket socket, Func<string, object, bool> onLineRead,
Action<Exception, object> onException, Action<byte[], int, int, object> onFinish, Encoding encoding,
string delimiter, object state)
: this(
new byte[maxLineBytes], socket, null, 0, 0, onLineRead, onException, onFinish, encoding, delimiter,
state)
public LineReader(WrappedSocket socket, Func<string, object, bool> onLineRead,
Action<Exception, object> onException,
Action<byte[], int, int, object> onFinish, Encoding encoding, string delimiter, int maxLineBytes,
object state)
: this(socket, null, 0, 0, onLineRead, onException, onFinish, encoding, delimiter, maxLineBytes, state)
{
}