| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/server/web_socket_encoder.h" | 5 #include "net/server/web_socket_encoder.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 case kOpCodeContinuation: // We don't support binary frames yet. | 84 case kOpCodeContinuation: // We don't support binary frames yet. |
| 85 case kOpCodePing: // We don't support binary frames yet. | 85 case kOpCodePing: // We don't support binary frames yet. |
| 86 case kOpCodePong: // We don't support binary frames yet. | 86 case kOpCodePong: // We don't support binary frames yet. |
| 87 default: | 87 default: |
| 88 return WebSocket::FRAME_ERROR; | 88 return WebSocket::FRAME_ERROR; |
| 89 } | 89 } |
| 90 | 90 |
| 91 if (client_frame && !masked) // In Hybi-17 spec client MUST mask its frame. | 91 if (client_frame && !masked) // In Hybi-17 spec client MUST mask its frame. |
| 92 return WebSocket::FRAME_ERROR; | 92 return WebSocket::FRAME_ERROR; |
| 93 | 93 |
| 94 uint64 payload_length64 = second_byte & kPayloadLengthMask; | 94 uint64_t payload_length64 = second_byte & kPayloadLengthMask; |
| 95 if (payload_length64 > kMaxSingleBytePayloadLength) { | 95 if (payload_length64 > kMaxSingleBytePayloadLength) { |
| 96 int extended_payload_length_size; | 96 int extended_payload_length_size; |
| 97 if (payload_length64 == kTwoBytePayloadLengthField) | 97 if (payload_length64 == kTwoBytePayloadLengthField) |
| 98 extended_payload_length_size = 2; | 98 extended_payload_length_size = 2; |
| 99 else { | 99 else { |
| 100 DCHECK(payload_length64 == kEightBytePayloadLengthField); | 100 DCHECK(payload_length64 == kEightBytePayloadLengthField); |
| 101 extended_payload_length_size = 8; | 101 extended_payload_length_size = 8; |
| 102 } | 102 } |
| 103 if (buffer_end - p < extended_payload_length_size) | 103 if (buffer_end - p < extended_payload_length_size) |
| 104 return WebSocket::FRAME_INCOMPLETE; | 104 return WebSocket::FRAME_INCOMPLETE; |
| 105 payload_length64 = 0; | 105 payload_length64 = 0; |
| 106 for (int i = 0; i < extended_payload_length_size; ++i) { | 106 for (int i = 0; i < extended_payload_length_size; ++i) { |
| 107 payload_length64 <<= 8; | 107 payload_length64 <<= 8; |
| 108 payload_length64 |= static_cast<unsigned char>(*p++); | 108 payload_length64 |= static_cast<unsigned char>(*p++); |
| 109 } | 109 } |
| 110 } | 110 } |
| 111 | 111 |
| 112 size_t actual_masking_key_length = masked ? kMaskingKeyWidthInBytes : 0; | 112 size_t actual_masking_key_length = masked ? kMaskingKeyWidthInBytes : 0; |
| 113 static const uint64 max_payload_length = 0x7FFFFFFFFFFFFFFFull; | 113 static const uint64_t max_payload_length = 0x7FFFFFFFFFFFFFFFull; |
| 114 static size_t max_length = std::numeric_limits<size_t>::max(); | 114 static size_t max_length = std::numeric_limits<size_t>::max(); |
| 115 if (payload_length64 > max_payload_length || | 115 if (payload_length64 > max_payload_length || |
| 116 payload_length64 + actual_masking_key_length > max_length) { | 116 payload_length64 + actual_masking_key_length > max_length) { |
| 117 // WebSocket frame length too large. | 117 // WebSocket frame length too large. |
| 118 return WebSocket::FRAME_ERROR; | 118 return WebSocket::FRAME_ERROR; |
| 119 } | 119 } |
| 120 size_t payload_length = static_cast<size_t>(payload_length64); | 120 size_t payload_length = static_cast<size_t>(payload_length64); |
| 121 | 121 |
| 122 size_t total_length = actual_masking_key_length + payload_length; | 122 size_t total_length = actual_masking_key_length + payload_length; |
| 123 if (static_cast<size_t>(buffer_end - p) < total_length) | 123 if (static_cast<size_t>(buffer_end - p) < total_length) |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 return false; | 341 return false; |
| 342 scoped_refptr<IOBufferWithSize> buffer = | 342 scoped_refptr<IOBufferWithSize> buffer = |
| 343 deflater_->GetOutput(deflater_->CurrentOutputSize()); | 343 deflater_->GetOutput(deflater_->CurrentOutputSize()); |
| 344 if (!buffer.get()) | 344 if (!buffer.get()) |
| 345 return false; | 345 return false; |
| 346 *output = std::string(buffer->data(), buffer->size()); | 346 *output = std::string(buffer->data(), buffer->size()); |
| 347 return true; | 347 return true; |
| 348 } | 348 } |
| 349 | 349 |
| 350 } // namespace net | 350 } // namespace net |
| OLD | NEW |