summaryrefslogtreecommitdiff
path: root/chromium/net/quic/quic_spdy_compressor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/quic/quic_spdy_compressor.cc')
-rw-r--r--chromium/net/quic/quic_spdy_compressor.cc50
1 files changed, 50 insertions, 0 deletions
diff --git a/chromium/net/quic/quic_spdy_compressor.cc b/chromium/net/quic/quic_spdy_compressor.cc
new file mode 100644
index 00000000000..7efd45ce76f
--- /dev/null
+++ b/chromium/net/quic/quic_spdy_compressor.cc
@@ -0,0 +1,50 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/quic/quic_spdy_compressor.h"
+
+#include "base/basictypes.h"
+#include "base/memory/scoped_ptr.h"
+
+using std::string;
+
+namespace net {
+
+QuicSpdyCompressor::QuicSpdyCompressor()
+ : spdy_framer_(SPDY3),
+ header_sequence_id_(1) {
+ spdy_framer_.set_enable_compression(true);
+}
+
+QuicSpdyCompressor::~QuicSpdyCompressor() {
+}
+
+string QuicSpdyCompressor::CompressHeaders(
+ const SpdyHeaderBlock& headers) {
+ // TODO(rch): Modify the SpdyFramer to expose a
+ // CreateCompressedHeaderBlock method, or some such.
+ SpdyStreamId stream_id = 3; // unused.
+ scoped_ptr<SpdyFrame> frame(spdy_framer_.CreateHeaders(
+ stream_id, CONTROL_FLAG_NONE, true, &headers));
+
+ // The size of the spdy HEADER frame's fixed prefix which
+ // needs to be stripped off from the resulting frame.
+ const size_t header_frame_prefix_len = 12;
+ string serialized = string(frame->data() + header_frame_prefix_len,
+ frame->size() - header_frame_prefix_len);
+ uint32 serialized_len = serialized.length();
+ char id_str[sizeof(header_sequence_id_)];
+ memcpy(&id_str, &header_sequence_id_, sizeof(header_sequence_id_));
+ char len_str[sizeof(serialized_len)];
+ memcpy(&len_str, &serialized_len, sizeof(serialized_len));
+ string compressed;
+ compressed.reserve(arraysize(id_str) + arraysize(len_str) + serialized_len);
+ compressed.append(id_str, arraysize(id_str));
+ compressed.append(len_str, arraysize(len_str));
+ compressed.append(serialized);
+ ++header_sequence_id_;
+ return compressed;
+}
+
+} // namespace net