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 |