Imported Upstream version 3.12.0

Former-commit-id: cf92446697332992ec36726e78eb8703e1f259d7
This commit is contained in:
Jo Shields
2015-01-13 10:44:36 +00:00
parent 8b9b85e7f5
commit 181b81b4a4
659 changed files with 12743 additions and 16300 deletions

View File

@ -61,6 +61,7 @@ namespace System.Net.WebSockets
const int HeaderMaxLength = 14;
byte[] headerBuffer;
byte[] sendBuffer;
long remaining;
public ClientWebSocket ()
{
@ -226,32 +227,43 @@ namespace System.Net.WebSockets
ValidateArraySegment (buffer);
return Task.Run (() => {
EnsureWebSocketState (WebSocketState.Open, WebSocketState.CloseSent);
// First read the two first bytes to know what we are doing next
connection.Read (req, headerBuffer, 0, 2);
var isLast = (headerBuffer[0] >> 7) > 0;
var isMasked = (headerBuffer[1] >> 7) > 0;
int mask = 0;
var type = WireToMessageType ((byte)(headerBuffer[0] & 0xF));
long length = headerBuffer[1] & 0x7F;
int offset = 0;
if (length == 126) {
offset = 2;
connection.Read (req, headerBuffer, 2, offset);
length = (headerBuffer[2] << 8) | headerBuffer[3];
} else if (length == 127) {
offset = 8;
connection.Read (req, headerBuffer, 2, offset);
length = 0;
for (int i = 2; i <= 9; i++)
length = (length << 8) | headerBuffer[i];
}
if (isMasked) {
connection.Read (req, headerBuffer, 2 + offset, 4);
for (int i = 0; i < 4; i++) {
var pos = i + offset + 2;
mask = (mask << 8) | headerBuffer[pos];
bool isLast;
WebSocketMessageType type;
long length;
if (remaining == 0) {
// First read the two first bytes to know what we are doing next
connection.Read (req, headerBuffer, 0, 2);
isLast = (headerBuffer[0] >> 7) > 0;
var isMasked = (headerBuffer[1] >> 7) > 0;
int mask = 0;
type = WireToMessageType ((byte)(headerBuffer[0] & 0xF));
length = headerBuffer[1] & 0x7F;
int offset = 0;
if (length == 126) {
offset = 2;
connection.Read (req, headerBuffer, 2, offset);
length = (headerBuffer[2] << 8) | headerBuffer[3];
} else if (length == 127) {
offset = 8;
connection.Read (req, headerBuffer, 2, offset);
length = 0;
for (int i = 2; i <= 9; i++)
length = (length << 8) | headerBuffer[i];
}
if (isMasked) {
connection.Read (req, headerBuffer, 2 + offset, 4);
for (int i = 0; i < 4; i++) {
var pos = i + offset + 2;
mask = (mask << 8) | headerBuffer[pos];
}
}
} else {
isLast = (headerBuffer[0] >> 7) > 0;
type = WireToMessageType ((byte)(headerBuffer[0] & 0xF));
length = remaining;
}
if (type == WebSocketMessageType.Close) {
@ -264,8 +276,9 @@ namespace System.Net.WebSockets
} else {
var readLength = (int)(buffer.Count < length ? buffer.Count : length);
connection.Read (req, buffer.Array, buffer.Offset, readLength);
remaining = length - readLength;
return new WebSocketReceiveResult ((int)length, type, isLast);
return new WebSocketReceiveResult ((int)readLength, type, isLast && remaining == 0);
}
});
}