// 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::CompressHeadersWithPriority( QuicPriority priority, const SpdyHeaderBlock& headers) { return CompressHeadersInternal(priority, headers, true); } string QuicSpdyCompressor::CompressHeaders( const SpdyHeaderBlock& headers) { // CompressHeadersInternal ignores priority when write_priority is false. return CompressHeadersInternal(0 /* ignored */, headers, false); } string QuicSpdyCompressor::CompressHeadersInternal( QuicPriority priority, const SpdyHeaderBlock& headers, bool write_priority) { // 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, &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 priority_str[sizeof(priority)]; memcpy(&priority_str, &priority, sizeof(priority)); 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; int priority_len = write_priority ? arraysize(priority_str) : 0; compressed.reserve( priority_len + arraysize(id_str) + arraysize(len_str) + serialized_len); if (write_priority) { compressed.append(priority_str, arraysize(priority_str)); } compressed.append(id_str, arraysize(id_str)); compressed.append(len_str, arraysize(len_str)); compressed.append(serialized); ++header_sequence_id_; return compressed; } } // namespace net