private GetRemainingFrameSize ( byte buffer, int dataSize ) : int | ||
buffer | byte | |
dataSize | int | |
return | int |
internal int GetRemainingFrameSize(byte[] buffer, int dataSize)
{
if (NetEventSource.IsEnabled) NetEventSource.Enter(this, buffer, dataSize);
int payloadSize = -1;
switch (_Framing)
{
case Framing.Unified:
case Framing.BeforeSSL3:
if (dataSize < 2)
{
throw new System.IO.IOException(SR.net_ssl_io_frame);
}
// Note: Cannot detect version mismatch for <= SSL2
if ((buffer[0] & 0x80) != 0)
{
// Two bytes
payloadSize = (((buffer[0] & 0x7f) << 8) | buffer[1]) + 2;
payloadSize -= dataSize;
}
else
{
// Three bytes
payloadSize = (((buffer[0] & 0x3f) << 8) | buffer[1]) + 3;
payloadSize -= dataSize;
}
break;
case Framing.SinceSSL3:
if (dataSize < 5)
{
throw new System.IO.IOException(SR.net_ssl_io_frame);
}
payloadSize = ((buffer[3] << 8) | buffer[4]) + 5;
payloadSize -= dataSize;
break;
default:
break;
}
if (NetEventSource.IsEnabled) NetEventSource.Exit(this, payloadSize);
return payloadSize;
}
private int StartFrameBody(int readBytes, byte[] buffer, int offset, int count, AsyncProtocolRequest asyncRequest) { if (readBytes == 0) { // EOF asyncRequest?.CompleteUser(0); return(0); } Debug.Assert(readBytes == SecureChannel.ReadHeaderSize); int payloadBytes = _sslState.GetRemainingFrameSize(_internalBuffer, _internalOffset, readBytes); if (payloadBytes < 0) { throw new IOException(SR.net_frame_read_size); } readBytes = EnsureBufferedBytes(SecureChannel.ReadHeaderSize + payloadBytes, asyncRequest, s_readFrameCallback); if (readBytes == -1) { Debug.Assert(asyncRequest != null); return(0); } Debug.Assert(readBytes == 0 || readBytes == SecureChannel.ReadHeaderSize + payloadBytes); return(ProcessFrameBody(readBytes, buffer, offset, count, asyncRequest)); }