Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/websockets/websocket_frame.h" | 5 #include "net/websockets/websocket_frame.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | |
|
wtc
2015/10/13 23:31:35
IMPORTANT: did you intend to remove <stdint.h> her
tfarina
2015/10/13 23:35:53
Yes, it is in the header file already.
| |
| 9 | |
| 10 #include <algorithm> | 8 #include <algorithm> |
| 11 | 9 |
| 12 #include "base/basictypes.h" | |
| 13 #include "base/big_endian.h" | 10 #include "base/big_endian.h" |
| 14 #include "base/logging.h" | 11 #include "base/logging.h" |
| 15 #include "base/rand_util.h" | 12 #include "base/rand_util.h" |
| 16 #include "net/base/io_buffer.h" | 13 #include "net/base/io_buffer.h" |
| 17 #include "net/base/net_errors.h" | 14 #include "net/base/net_errors.h" |
| 18 | 15 |
| 19 namespace net { | 16 namespace net { |
| 20 | 17 |
| 21 namespace { | 18 namespace { |
| 22 | 19 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 80 | 77 |
| 81 WebSocketFrame::~WebSocketFrame() {} | 78 WebSocketFrame::~WebSocketFrame() {} |
| 82 | 79 |
| 83 WebSocketFrameChunk::WebSocketFrameChunk() : final_chunk(false) {} | 80 WebSocketFrameChunk::WebSocketFrameChunk() : final_chunk(false) {} |
| 84 | 81 |
| 85 WebSocketFrameChunk::~WebSocketFrameChunk() {} | 82 WebSocketFrameChunk::~WebSocketFrameChunk() {} |
| 86 | 83 |
| 87 int GetWebSocketFrameHeaderSize(const WebSocketFrameHeader& header) { | 84 int GetWebSocketFrameHeaderSize(const WebSocketFrameHeader& header) { |
| 88 int extended_length_size = 0; | 85 int extended_length_size = 0; |
| 89 if (header.payload_length > kMaxPayloadLengthWithoutExtendedLengthField && | 86 if (header.payload_length > kMaxPayloadLengthWithoutExtendedLengthField && |
| 90 header.payload_length <= kuint16max) { | 87 header.payload_length <= UINT16_MAX) { |
| 91 extended_length_size = 2; | 88 extended_length_size = 2; |
| 92 } else if (header.payload_length > kuint16max) { | 89 } else if (header.payload_length > UINT16_MAX) { |
| 93 extended_length_size = 8; | 90 extended_length_size = 8; |
| 94 } | 91 } |
| 95 | 92 |
| 96 return (WebSocketFrameHeader::kBaseHeaderSize + extended_length_size + | 93 return (WebSocketFrameHeader::kBaseHeaderSize + extended_length_size + |
| 97 (header.masked ? WebSocketFrameHeader::kMaskingKeyLength : 0)); | 94 (header.masked ? WebSocketFrameHeader::kMaskingKeyLength : 0)); |
| 98 } | 95 } |
| 99 | 96 |
| 100 int WriteWebSocketFrameHeader(const WebSocketFrameHeader& header, | 97 int WriteWebSocketFrameHeader(const WebSocketFrameHeader& header, |
| 101 const WebSocketMaskingKey* masking_key, | 98 const WebSocketMaskingKey* masking_key, |
| 102 char* buffer, | 99 char* buffer, |
| 103 int buffer_size) { | 100 int buffer_size) { |
| 104 DCHECK((header.opcode & kOpCodeMask) == header.opcode) | 101 DCHECK((header.opcode & kOpCodeMask) == header.opcode) |
| 105 << "header.opcode must fit to kOpCodeMask."; | 102 << "header.opcode must fit to kOpCodeMask."; |
| 106 DCHECK(header.payload_length <= static_cast<uint64_t>(kint64max)) | 103 DCHECK(header.payload_length <= static_cast<uint64_t>(INT64_MAX)) |
| 107 << "WebSocket specification doesn't allow a frame longer than " | 104 << "WebSocket specification doesn't allow a frame longer than " |
| 108 << "kint64max (0x7FFFFFFFFFFFFFFF) bytes."; | 105 << "INT64_MAX (0x7FFFFFFFFFFFFFFF) bytes."; |
| 109 DCHECK_GE(buffer_size, 0); | 106 DCHECK_GE(buffer_size, 0); |
| 110 | 107 |
| 111 // WebSocket frame format is as follows: | 108 // WebSocket frame format is as follows: |
| 112 // - Common header (2 bytes) | 109 // - Common header (2 bytes) |
| 113 // - Optional extended payload length | 110 // - Optional extended payload length |
| 114 // (2 or 8 bytes, present if actual payload length is more than 125 bytes) | 111 // (2 or 8 bytes, present if actual payload length is more than 125 bytes) |
| 115 // - Optional masking key (4 bytes, present if MASK bit is on) | 112 // - Optional masking key (4 bytes, present if MASK bit is on) |
| 116 // - Actual payload (XOR masked with masking key if MASK bit is on) | 113 // - Actual payload (XOR masked with masking key if MASK bit is on) |
| 117 // | 114 // |
| 118 // This function constructs frame header (the first three in the list | 115 // This function constructs frame header (the first three in the list |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 130 first_byte |= header.reserved2 ? kReserved2Bit : 0u; | 127 first_byte |= header.reserved2 ? kReserved2Bit : 0u; |
| 131 first_byte |= header.reserved3 ? kReserved3Bit : 0u; | 128 first_byte |= header.reserved3 ? kReserved3Bit : 0u; |
| 132 first_byte |= header.opcode & kOpCodeMask; | 129 first_byte |= header.opcode & kOpCodeMask; |
| 133 buffer[buffer_index++] = first_byte; | 130 buffer[buffer_index++] = first_byte; |
| 134 | 131 |
| 135 int extended_length_size = 0; | 132 int extended_length_size = 0; |
| 136 uint8_t second_byte = 0u; | 133 uint8_t second_byte = 0u; |
| 137 second_byte |= header.masked ? kMaskBit : 0u; | 134 second_byte |= header.masked ? kMaskBit : 0u; |
| 138 if (header.payload_length <= kMaxPayloadLengthWithoutExtendedLengthField) { | 135 if (header.payload_length <= kMaxPayloadLengthWithoutExtendedLengthField) { |
| 139 second_byte |= header.payload_length; | 136 second_byte |= header.payload_length; |
| 140 } else if (header.payload_length <= kuint16max) { | 137 } else if (header.payload_length <= UINT16_MAX) { |
| 141 second_byte |= kPayloadLengthWithTwoByteExtendedLengthField; | 138 second_byte |= kPayloadLengthWithTwoByteExtendedLengthField; |
| 142 extended_length_size = 2; | 139 extended_length_size = 2; |
| 143 } else { | 140 } else { |
| 144 second_byte |= kPayloadLengthWithEightByteExtendedLengthField; | 141 second_byte |= kPayloadLengthWithEightByteExtendedLengthField; |
| 145 extended_length_size = 8; | 142 extended_length_size = 8; |
| 146 } | 143 } |
| 147 buffer[buffer_index++] = second_byte; | 144 buffer[buffer_index++] = second_byte; |
| 148 | 145 |
| 149 // Writes "extended payload length" field. | 146 // Writes "extended payload length" field. |
| 150 if (extended_length_size == 2) { | 147 if (extended_length_size == 2) { |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 246 } | 243 } |
| 247 | 244 |
| 248 MaskWebSocketFramePayloadByBytes( | 245 MaskWebSocketFramePayloadByBytes( |
| 249 masking_key, | 246 masking_key, |
| 250 (frame_offset + (aligned_end - data)) % kMaskingKeyLength, | 247 (frame_offset + (aligned_end - data)) % kMaskingKeyLength, |
| 251 aligned_end, | 248 aligned_end, |
| 252 end); | 249 end); |
| 253 } | 250 } |
| 254 | 251 |
| 255 } // namespace net | 252 } // namespace net |
| OLD | NEW |