diff options
author | tyoshino@chromium.org <tyoshino@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-11 08:36:33 +0000 |
---|---|---|
committer | tyoshino@chromium.org <tyoshino@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-11 08:36:33 +0000 |
commit | 9576544a7d8cc3e45db9ebdc3e9fb08fb6c4f797 (patch) | |
tree | d397c68d32baa9186dffc6d5605848957f534089 /net/websockets | |
parent | fedaeae4c21925ceefe31870d9ad5c106a332b8d (diff) | |
download | chromium_src-9576544a7d8cc3e45db9ebdc3e9fb08fb6c4f797.zip chromium_src-9576544a7d8cc3e45db9ebdc3e9fb08fb6c4f797.tar.gz chromium_src-9576544a7d8cc3e45db9ebdc3e9fb08fb6c4f797.tar.bz2 |
Factor out serialized size calculating code from WebSocketBasicStream::WriteFrames
To improve readability by shortening the method. This part doesn't access
member variables.
BUG=
Review URL: https://codereview.chromium.org/26804002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@228144 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/websockets')
-rw-r--r-- | net/websockets/websocket_basic_stream.cc | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/net/websockets/websocket_basic_stream.cc b/net/websockets/websocket_basic_stream.cc index fb8fb0a..f5d9a76 100644 --- a/net/websockets/websocket_basic_stream.cc +++ b/net/websockets/websocket_basic_stream.cc @@ -40,6 +40,32 @@ const uint64 kMaxControlFramePayload = 125; // packet sizes / encryption block sizes / IPC alignment issues, etc. const int kReadBufferSize = 32 * 1024; +typedef ScopedVector<WebSocketFrame>::const_iterator WebSocketFrameIterator; + +// Returns the total serialized size of |frames|. This function assumes that +// |frames| will be serialized with mask field. This function forces the +// masked bit of the frames on. +int CalculateSerializedSizeAndTurnOnMaskBit( + ScopedVector<WebSocketFrame>* frames) { + const int kMaximumTotalSize = std::numeric_limits<int>::max(); + + int total_size = 0; + for (WebSocketFrameIterator it = frames->begin(); + it != frames->end(); ++it) { + WebSocketFrame* frame = *it; + // Force the masked bit on. + frame->header.masked = true; + // We enforce flow control so the renderer should never be able to force us + // to cache anywhere near 2GB of frames. + int frame_size = frame->header.payload_length + + GetWebSocketFrameHeaderSize(frame->header); + CHECK_GE(kMaximumTotalSize - total_size, frame_size) + << "Aborting to prevent overflow"; + total_size += frame_size; + } + return total_size; +} + } // namespace WebSocketBasicStream::WebSocketBasicStream( @@ -105,26 +131,14 @@ int WebSocketBasicStream::WriteFrames(ScopedVector<WebSocketFrame>* frames, // perform multiple writes with smaller buffers. // // First calculate the size of the buffer we need to allocate. - typedef ScopedVector<WebSocketFrame>::const_iterator Iterator; - const int kMaximumTotalSize = std::numeric_limits<int>::max(); - int total_size = 0; - for (Iterator it = frames->begin(); it != frames->end(); ++it) { - WebSocketFrame* frame = *it; - // Force the masked bit on. - frame->header.masked = true; - // We enforce flow control so the renderer should never be able to force us - // to cache anywhere near 2GB of frames. - int frame_size = frame->header.payload_length + - GetWebSocketFrameHeaderSize(frame->header); - CHECK_GE(kMaximumTotalSize - total_size, frame_size) - << "Aborting to prevent overflow"; - total_size += frame_size; - } + int total_size = CalculateSerializedSizeAndTurnOnMaskBit(frames); scoped_refptr<IOBufferWithSize> combined_buffer( new IOBufferWithSize(total_size)); + char* dest = combined_buffer->data(); int remaining_size = total_size; - for (Iterator it = frames->begin(); it != frames->end(); ++it) { + for (WebSocketFrameIterator it = frames->begin(); + it != frames->end(); ++it) { WebSocketFrame* frame = *it; WebSocketMaskingKey mask = generate_websocket_masking_key_(); int result = |