| Index: net/server/web_socket.cc
|
| diff --git a/net/server/web_socket.cc b/net/server/web_socket.cc
|
| index 2f5ad5fa9d37d32e80dee12b09a8573eaecf20a5..c2b6098b490173f870b5c4d5b4efbe7f02cb86b4 100644
|
| --- a/net/server/web_socket.cc
|
| +++ b/net/server/web_socket.cc
|
| @@ -169,7 +169,7 @@ const size_t kTwoBytePayloadLengthField = 126;
|
| const size_t kEightBytePayloadLengthField = 127;
|
| const size_t kMaskingKeyWidthInBytes = 4;
|
|
|
| -class WebSocketHybi10 : public WebSocket {
|
| +class WebSocketHybi17 : public WebSocket {
|
| public:
|
| static WebSocket* Create(HttpConnection* connection,
|
| const HttpServerRequestInfo& request,
|
| @@ -184,7 +184,7 @@ class WebSocketHybi10 : public WebSocket {
|
| "Sec-WebSocket-Key is empty or isn't specified.");
|
| return NULL;
|
| }
|
| - return new WebSocketHybi10(connection, request, pos);
|
| + return new WebSocketHybi17(connection, request, pos);
|
| }
|
|
|
| virtual void Accept(const HttpServerRequestInfo& request) {
|
| @@ -237,6 +237,9 @@ class WebSocketHybi10 : public WebSocket {
|
| return FRAME_ERROR;
|
| }
|
|
|
| + if (!masked_) // According to Hybi-17 spec client MUST mask his frame.
|
| + return FRAME_ERROR;
|
| +
|
| uint64 payload_length64 = second_byte & kPayloadLengthMask;
|
| if (payload_length64 > kMaxSingleBytePayloadLength) {
|
| int extended_payload_length_size;
|
| @@ -256,16 +259,15 @@ class WebSocketHybi10 : public WebSocket {
|
| }
|
|
|
| static const uint64 max_payload_length = 0x7FFFFFFFFFFFFFFFull;
|
| - size_t masking_key_length = masked_ ? kMaskingKeyWidthInBytes : 0;
|
| static size_t max_length = std::numeric_limits<size_t>::max();
|
| if (payload_length64 > max_payload_length ||
|
| - payload_length64 + masking_key_length > max_length) {
|
| + payload_length64 + kMaskingKeyWidthInBytes > max_length) {
|
| // WebSocket frame length too large.
|
| return FRAME_ERROR;
|
| }
|
| payload_length_ = static_cast<size_t>(payload_length64);
|
|
|
| - size_t total_length = masking_key_length + payload_length_;
|
| + size_t total_length = kMaskingKeyWidthInBytes + payload_length_;
|
| if (static_cast<size_t>(buffer_end - p) < total_length)
|
| return FRAME_INCOMPLETE;
|
|
|
| @@ -280,7 +282,7 @@ class WebSocketHybi10 : public WebSocket {
|
| message->swap(buffer);
|
| }
|
|
|
| - size_t pos = p + masking_key_length + payload_length_ -
|
| + size_t pos = p + kMaskingKeyWidthInBytes + payload_length_ -
|
| connection_->recv_data().c_str();
|
| connection_->Shift(pos);
|
|
|
| @@ -297,13 +299,13 @@ class WebSocketHybi10 : public WebSocket {
|
|
|
| frame.push_back(kFinalBit | op_code);
|
| if (data_length <= kMaxSingleBytePayloadLength)
|
| - frame.push_back(kMaskBit | data_length);
|
| + frame.push_back(data_length);
|
| else if (data_length <= 0xFFFF) {
|
| - frame.push_back(kMaskBit | kTwoBytePayloadLengthField);
|
| + frame.push_back(kTwoBytePayloadLengthField);
|
| frame.push_back((data_length & 0xFF00) >> 8);
|
| frame.push_back(data_length & 0xFF);
|
| } else {
|
| - frame.push_back(kMaskBit | kEightBytePayloadLengthField);
|
| + frame.push_back(kEightBytePayloadLengthField);
|
| char extended_payload_length[8];
|
| size_t remaining = data_length;
|
| // Fill the length into extended_payload_length in the network byte order.
|
| @@ -317,25 +319,14 @@ class WebSocketHybi10 : public WebSocket {
|
| DCHECK(!remaining);
|
| }
|
|
|
| - // Mask the frame.
|
| - size_t masking_key_start = frame.size();
|
| - // Add placeholder for masking key. Will be overwritten.
|
| - frame.resize(frame.size() + kMaskingKeyWidthInBytes);
|
| - size_t payload_start = frame.size();
|
| const char* data = message.c_str();
|
| frame.insert(frame.end(), data, data + data_length);
|
|
|
| - base::RandBytes(&frame[0] + masking_key_start,
|
| - kMaskingKeyWidthInBytes);
|
| - for (size_t i = 0; i < data_length; ++i) {
|
| - frame[payload_start + i] ^=
|
| - frame[masking_key_start + i % kMaskingKeyWidthInBytes];
|
| - }
|
| connection_->Send(&frame[0], frame.size());
|
| }
|
|
|
| private:
|
| - WebSocketHybi10(HttpConnection* connection,
|
| + WebSocketHybi17(HttpConnection* connection,
|
| const HttpServerRequestInfo& request,
|
| size_t* pos)
|
| : WebSocket(connection),
|
| @@ -362,7 +353,7 @@ class WebSocketHybi10 : public WebSocket {
|
| const char* frame_end_;
|
| bool closed_;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(WebSocketHybi10);
|
| + DISALLOW_COPY_AND_ASSIGN(WebSocketHybi17);
|
| };
|
|
|
| } // anonymous namespace
|
| @@ -370,7 +361,7 @@ class WebSocketHybi10 : public WebSocket {
|
| WebSocket* WebSocket::CreateWebSocket(HttpConnection* connection,
|
| const HttpServerRequestInfo& request,
|
| size_t* pos) {
|
| - WebSocket* socket = WebSocketHybi10::Create(connection, request, pos);
|
| + WebSocket* socket = WebSocketHybi17::Create(connection, request, pos);
|
| if (socket)
|
| return socket;
|
|
|
|
|