From 1dafc7583808f609ba9891d57e6af32e5b011fc7 Mon Sep 17 00:00:00 2001 From: "yutak@chromium.org" Date: Tue, 21 Aug 2012 06:41:31 +0000 Subject: Add a function that calculates the size of WebSocket frame header. This function will be used to determine the size of buffer needed for writing WebSocket frame header. BUG=116624 R=mmenke@chromium.org Review URL: https://chromiumcodereview.appspot.com/10825444 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@152518 0039d316-1c4b-4281-b951-d872f2087c98 --- net/websockets/websocket_frame.cc | 33 ++++++++++++++++++++------------- net/websockets/websocket_frame.h | 14 ++++++++++---- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/net/websockets/websocket_frame.cc b/net/websockets/websocket_frame.cc index da65cba..2194f60 100644 --- a/net/websockets/websocket_frame.cc +++ b/net/websockets/websocket_frame.cc @@ -42,6 +42,20 @@ WebSocketFrameChunk::WebSocketFrameChunk() : final_chunk(false) { WebSocketFrameChunk::~WebSocketFrameChunk() { } +int GetWebSocketFrameHeaderSize(const WebSocketFrameHeader& header) { + int extended_length_size = 0; + if (header.payload_length > kMaxPayloadLengthWithoutExtendedLengthField && + header.payload_length <= kuint16max) { + extended_length_size = 2; + } else if (header.payload_length > kuint16max) { + extended_length_size = 8; + } + + return (WebSocketFrameHeader::kBaseHeaderSize + + extended_length_size + + (header.masked ? WebSocketFrameHeader::kMaskingKeyLength : 0)); +} + int WriteWebSocketFrameHeader(const WebSocketFrameHeader& header, const WebSocketMaskingKey* masking_key, char* buffer, @@ -63,17 +77,7 @@ int WriteWebSocketFrameHeader(const WebSocketFrameHeader& header, // This function constructs frame header (the first three in the list // above). - size_t extended_length_size = 0; - if (header.payload_length > kMaxPayloadLengthWithoutExtendedLengthField && - header.payload_length <= kuint16max) { - extended_length_size = 2; - } else if (header.payload_length > kuint16max) { - extended_length_size = 8; - } - int header_size = - WebSocketFrameHeader::kBaseHeaderSize + - extended_length_size + - (header.masked ? WebSocketFrameHeader::kMaskingKeyLength : 0); + int header_size = GetWebSocketFrameHeaderSize(header); if (header_size > buffer_size) return ERR_INVALID_ARGUMENT; @@ -87,6 +91,7 @@ int WriteWebSocketFrameHeader(const WebSocketFrameHeader& header, first_byte |= header.opcode & kOpCodeMask; buffer[buffer_index++] = first_byte; + int extended_length_size = 0; uint8 second_byte = 0u; second_byte |= header.masked ? kMaskBit : 0u; if (header.payload_length <= @@ -94,17 +99,19 @@ int WriteWebSocketFrameHeader(const WebSocketFrameHeader& header, second_byte |= header.payload_length; } else if (header.payload_length <= kuint16max) { second_byte |= kPayloadLengthWithTwoByteExtendedLengthField; + extended_length_size = 2; } else { second_byte |= kPayloadLengthWithEightByteExtendedLengthField; + extended_length_size = 8; } buffer[buffer_index++] = second_byte; // Writes "extended payload length" field. - if (extended_length_size == 2u) { + if (extended_length_size == 2) { uint16 payload_length_16 = static_cast(header.payload_length); WriteBigEndian(buffer + buffer_index, payload_length_16); buffer_index += sizeof(uint16); - } else if (extended_length_size == 8u) { + } else if (extended_length_size == 8) { WriteBigEndian(buffer + buffer_index, header.payload_length); buffer_index += sizeof(uint64); } diff --git a/net/websockets/websocket_frame.h b/net/websockets/websocket_frame.h index 9f7c7fd..94f4ede 100644 --- a/net/websockets/websocket_frame.h +++ b/net/websockets/websocket_frame.h @@ -86,6 +86,12 @@ struct WebSocketMaskingKey { char key[WebSocketFrameHeader::kMaskingKeyLength]; }; +// Returns the size of WebSocket frame header. The size of WebSocket frame +// header varies from 2 bytes to 14 bytes depending on the payload length +// and maskedness. +NET_EXPORT_PRIVATE int GetWebSocketFrameHeaderSize( + const WebSocketFrameHeader& header); + // Writes wire format of a WebSocket frame header into |output|, and returns // the number of bytes written. // @@ -98,10 +104,10 @@ struct WebSocketMaskingKey { // (possibly generated by GenerateWebSocketMaskingKey() function below). // Otherwise, |masking_key| must be NULL. // -// |buffer| should have enough size to contain the frame header. Size of a -// frame header varies from 2 bytes to 14 bytes depending on the payload length -// and maskedness. If the size of |buffer| is insufficient, this function -// returns ERR_INVALID_ARGUMENT and does not write any data to |buffer|. +// |buffer| should have enough size to contain the frame header. +// GetWebSocketFrameHeaderSize() can be used to know the size of header +// beforehand. If the size of |buffer| is insufficient, this function returns +// ERR_INVALID_ARGUMENT and does not write any data to |buffer|. NET_EXPORT_PRIVATE int WriteWebSocketFrameHeader( const WebSocketFrameHeader& header, const WebSocketMaskingKey* masking_key, -- cgit v1.1