summaryrefslogtreecommitdiffstats
path: root/net/websockets
diff options
context:
space:
mode:
authortyoshino@chromium.org <tyoshino@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-11 08:36:33 +0000
committertyoshino@chromium.org <tyoshino@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-11 08:36:33 +0000
commit9576544a7d8cc3e45db9ebdc3e9fb08fb6c4f797 (patch)
treed397c68d32baa9186dffc6d5605848957f534089 /net/websockets
parentfedaeae4c21925ceefe31870d9ad5c106a332b8d (diff)
downloadchromium_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.cc46
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 =