public void Send(ISocketBuffer buffer)
{
// last send operation did not send all bytes enqueued in the buffer
// so let's just continue until doing next message
if (_bytesToSend > 0)
{
buffer.SetBuffer(_buffer, _offset, _bytesToSend);
return;
}
// continuing with the message body
if (_isHeaderSent)
{
var bytes = Math.Min(_totalAmountToSend, _buffer.Length);
_message.Body.Read(_buffer, 0, bytes);
_bytesToSend = bytes;
buffer.SetBuffer(_buffer, 0, bytes);
return;
}
_headerWriter.WriteLine(_message.StatusLine);
foreach (var header in _message.Headers)
{
_headerWriter.Write("{0}: {1}\r\n", header.Key, header.Value);
}
_headerWriter.Write("\r\n");
_headerWriter.Flush();
_isHeaderSent = true;
buffer.UserToken = _message;
if (_message.Body == null || _message.ContentLength == 0)
{
_bytesToSend = (int) _stream.Length;
_totalAmountToSend = _bytesToSend;
buffer.SetBuffer(_buffer, 0, (int) _stream.Length);
return;
}
else
{
}
var bytesLeft = _buffer.Length - _stream.Length;
var bytesToSend = Math.Min(_message.ContentLength, (int) bytesLeft);
var offset = (int) _stream.Position;
_message.Body.Read(_buffer, offset, bytesToSend);
_bytesToSend = (int) _stream.Length + bytesToSend;
_totalAmountToSend = (int) _stream.Length + _message.ContentLength;
buffer.SetBuffer(_buffer, 0, _bytesToSend);
}