| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/spdy/spdy_framer.h" | 5 #include "net/spdy/spdy_framer.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <cctype> | 10 #include <cctype> |
| (...skipping 1765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1776 } | 1776 } |
| 1777 | 1777 |
| 1778 SpdyFramer::SpdyHeaderFrameIterator::SpdyHeaderFrameIterator( | 1778 SpdyFramer::SpdyHeaderFrameIterator::SpdyHeaderFrameIterator( |
| 1779 SpdyFramer* framer, | 1779 SpdyFramer* framer, |
| 1780 std::unique_ptr<SpdyHeadersIR> headers_ir) | 1780 std::unique_ptr<SpdyHeadersIR> headers_ir) |
| 1781 : headers_ir_(std::move(headers_ir)), | 1781 : headers_ir_(std::move(headers_ir)), |
| 1782 framer_(framer), | 1782 framer_(framer), |
| 1783 debug_total_size_(0), | 1783 debug_total_size_(0), |
| 1784 is_first_frame_(true), | 1784 is_first_frame_(true), |
| 1785 has_next_frame_(true) { | 1785 has_next_frame_(true) { |
| 1786 encoder_ = framer_->GetHpackEncoder()->EncodeHeaderSet( | 1786 encoder_ = |
| 1787 headers_ir_->header_block(), framer_->compression_enabled()); | 1787 framer_->GetHpackEncoder()->EncodeHeaderSet(headers_ir_->header_block()); |
| 1788 } | 1788 } |
| 1789 | 1789 |
| 1790 SpdyFramer::SpdyHeaderFrameIterator::~SpdyHeaderFrameIterator() {} | 1790 SpdyFramer::SpdyHeaderFrameIterator::~SpdyHeaderFrameIterator() {} |
| 1791 | 1791 |
| 1792 SpdySerializedFrame SpdyFramer::SpdyHeaderFrameIterator::NextFrame() { | 1792 SpdySerializedFrame SpdyFramer::SpdyHeaderFrameIterator::NextFrame() { |
| 1793 if (!has_next_frame_) { | 1793 if (!has_next_frame_) { |
| 1794 SPDY_BUG << "SpdyFramer::SpdyHeaderFrameIterator::NextFrame called without " | 1794 SPDY_BUG << "SpdyFramer::SpdyHeaderFrameIterator::NextFrame called without " |
| 1795 << "a next frame."; | 1795 << "a next frame."; |
| 1796 return SpdySerializedFrame(); | 1796 return SpdySerializedFrame(); |
| 1797 } | 1797 } |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1999 size += headers.padding_payload_len(); | 1999 size += headers.padding_payload_len(); |
| 2000 } | 2000 } |
| 2001 | 2001 |
| 2002 int weight = 0; | 2002 int weight = 0; |
| 2003 if (headers.has_priority()) { | 2003 if (headers.has_priority()) { |
| 2004 weight = ClampHttp2Weight(headers.weight()); | 2004 weight = ClampHttp2Weight(headers.weight()); |
| 2005 size += 5; | 2005 size += 5; |
| 2006 } | 2006 } |
| 2007 | 2007 |
| 2008 string hpack_encoding; | 2008 string hpack_encoding; |
| 2009 if (compression_enabled()) { | 2009 GetHpackEncoder()->EncodeHeaderSet(headers.header_block(), &hpack_encoding); |
| 2010 GetHpackEncoder()->EncodeHeaderSet(headers.header_block(), &hpack_encoding); | |
| 2011 } else { | |
| 2012 GetHpackEncoder()->EncodeHeaderSetWithoutCompression(headers.header_block(), | |
| 2013 &hpack_encoding); | |
| 2014 } | |
| 2015 size += hpack_encoding.size(); | 2010 size += hpack_encoding.size(); |
| 2016 if (size > kMaxControlFrameSize) { | 2011 if (size > kMaxControlFrameSize) { |
| 2017 size += GetNumberRequiredContinuationFrames(size) * | 2012 size += GetNumberRequiredContinuationFrames(size) * |
| 2018 GetContinuationMinimumSize(); | 2013 GetContinuationMinimumSize(); |
| 2019 flags &= ~HEADERS_FLAG_END_HEADERS; | 2014 flags &= ~HEADERS_FLAG_END_HEADERS; |
| 2020 } | 2015 } |
| 2021 | 2016 |
| 2022 SpdyFrameBuilder builder(size); | 2017 SpdyFrameBuilder builder(size); |
| 2023 builder.BeginNewFrame(*this, HEADERS, flags, headers.stream_id()); | 2018 builder.BeginNewFrame(*this, HEADERS, flags, headers.stream_id()); |
| 2024 DCHECK_EQ(GetHeadersMinimumSize(), builder.length()); | 2019 DCHECK_EQ(GetHeadersMinimumSize(), builder.length()); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2076 // The size of this frame, including variable-length name-value block. | 2071 // The size of this frame, including variable-length name-value block. |
| 2077 size_t size = GetPushPromiseMinimumSize(); | 2072 size_t size = GetPushPromiseMinimumSize(); |
| 2078 | 2073 |
| 2079 if (push_promise.padded()) { | 2074 if (push_promise.padded()) { |
| 2080 flags |= PUSH_PROMISE_FLAG_PADDED; | 2075 flags |= PUSH_PROMISE_FLAG_PADDED; |
| 2081 size += kPadLengthFieldSize; | 2076 size += kPadLengthFieldSize; |
| 2082 size += push_promise.padding_payload_len(); | 2077 size += push_promise.padding_payload_len(); |
| 2083 } | 2078 } |
| 2084 | 2079 |
| 2085 string hpack_encoding; | 2080 string hpack_encoding; |
| 2086 if (compression_enabled()) { | 2081 GetHpackEncoder()->EncodeHeaderSet(push_promise.header_block(), |
| 2087 GetHpackEncoder()->EncodeHeaderSet(push_promise.header_block(), | 2082 &hpack_encoding); |
| 2088 &hpack_encoding); | |
| 2089 } else { | |
| 2090 GetHpackEncoder()->EncodeHeaderSetWithoutCompression( | |
| 2091 push_promise.header_block(), &hpack_encoding); | |
| 2092 } | |
| 2093 size += hpack_encoding.size(); | 2083 size += hpack_encoding.size(); |
| 2094 if (size > kMaxControlFrameSize) { | 2084 if (size > kMaxControlFrameSize) { |
| 2095 size += GetNumberRequiredContinuationFrames(size) * | 2085 size += GetNumberRequiredContinuationFrames(size) * |
| 2096 GetContinuationMinimumSize(); | 2086 GetContinuationMinimumSize(); |
| 2097 flags &= ~PUSH_PROMISE_FLAG_END_PUSH_PROMISE; | 2087 flags &= ~PUSH_PROMISE_FLAG_END_PUSH_PROMISE; |
| 2098 } | 2088 } |
| 2099 | 2089 |
| 2100 SpdyFrameBuilder builder(size); | 2090 SpdyFrameBuilder builder(size); |
| 2101 builder.BeginNewFrame(*this, | 2091 builder.BeginNewFrame(*this, |
| 2102 PUSH_PROMISE, | 2092 PUSH_PROMISE, |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2360 builder->WriteBytes( | 2350 builder->WriteBytes( |
| 2361 &hpack_encoding[hpack_encoding.size() - bytes_remaining], | 2351 &hpack_encoding[hpack_encoding.size() - bytes_remaining], |
| 2362 bytes_to_write); | 2352 bytes_to_write); |
| 2363 bytes_remaining -= bytes_to_write; | 2353 bytes_remaining -= bytes_to_write; |
| 2364 } | 2354 } |
| 2365 } | 2355 } |
| 2366 | 2356 |
| 2367 HpackEncoder* SpdyFramer::GetHpackEncoder() { | 2357 HpackEncoder* SpdyFramer::GetHpackEncoder() { |
| 2368 if (hpack_encoder_.get() == nullptr) { | 2358 if (hpack_encoder_.get() == nullptr) { |
| 2369 hpack_encoder_.reset(new HpackEncoder(ObtainHpackHuffmanTable())); | 2359 hpack_encoder_.reset(new HpackEncoder(ObtainHpackHuffmanTable())); |
| 2360 if (!compression_enabled()) { |
| 2361 hpack_encoder_->DisableCompression(); |
| 2362 } |
| 2370 } | 2363 } |
| 2371 return hpack_encoder_.get(); | 2364 return hpack_encoder_.get(); |
| 2372 } | 2365 } |
| 2373 | 2366 |
| 2374 HpackDecoderInterface* SpdyFramer::GetHpackDecoder() { | 2367 HpackDecoderInterface* SpdyFramer::GetHpackDecoder() { |
| 2375 if (hpack_decoder_.get() == nullptr) { | 2368 if (hpack_decoder_.get() == nullptr) { |
| 2376 if (FLAGS_chromium_http2_flag_spdy_use_hpack_decoder2) { | 2369 if (FLAGS_chromium_http2_flag_spdy_use_hpack_decoder2) { |
| 2377 hpack_decoder_.reset(new HpackDecoder2()); | 2370 hpack_decoder_.reset(new HpackDecoder2()); |
| 2378 } else { | 2371 } else { |
| 2379 hpack_decoder_.reset(new HpackDecoder()); | 2372 hpack_decoder_.reset(new HpackDecoder()); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2440 builder->WriteUInt32(header_block.size()); | 2433 builder->WriteUInt32(header_block.size()); |
| 2441 | 2434 |
| 2442 // Serialize each header. | 2435 // Serialize each header. |
| 2443 for (const auto& header : header_block) { | 2436 for (const auto& header : header_block) { |
| 2444 builder->WriteStringPiece32(base::ToLowerASCII(header.first)); | 2437 builder->WriteStringPiece32(base::ToLowerASCII(header.first)); |
| 2445 builder->WriteStringPiece32(header.second); | 2438 builder->WriteStringPiece32(header.second); |
| 2446 } | 2439 } |
| 2447 } | 2440 } |
| 2448 | 2441 |
| 2449 } // namespace net | 2442 } // namespace net |
| OLD | NEW |