summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryutak@chromium.org <yutak@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-21 06:41:31 +0000
committeryutak@chromium.org <yutak@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-21 06:41:31 +0000
commit1dafc7583808f609ba9891d57e6af32e5b011fc7 (patch)
tree0c4883d662e8d7004ca66f31c174fc2ada2abd6f
parent4645ea83c33e7d2c0c262115db15adb5de1261ff (diff)
downloadchromium_src-1dafc7583808f609ba9891d57e6af32e5b011fc7.zip
chromium_src-1dafc7583808f609ba9891d57e6af32e5b011fc7.tar.gz
chromium_src-1dafc7583808f609ba9891d57e6af32e5b011fc7.tar.bz2
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
-rw-r--r--net/websockets/websocket_frame.cc33
-rw-r--r--net/websockets/websocket_frame.h14
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<uint16>(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,