Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(700)

Side by Side Diff: net/spdy/spdy_framer.cc

Issue 2794063002: Add a SpdyFramer extension API implementation. (Closed)
Patch Set: Re: #12. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« net/spdy/spdy_frame_builder.h ('K') | « net/spdy/spdy_framer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 1796 matching lines...) Expand 10 before | Expand all | Expand 10 after
1807 SpdyFrameBuilder builder(frame_size); 1807 SpdyFrameBuilder builder(frame_size);
1808 if (!skip_rewritelength_) { 1808 if (!skip_rewritelength_) {
1809 builder.BeginNewFrame(*this, SpdyFrameType::DATA, flags, 1809 builder.BeginNewFrame(*this, SpdyFrameType::DATA, flags,
1810 data_ir.stream_id()); 1810 data_ir.stream_id());
1811 if (data_ir.padded()) { 1811 if (data_ir.padded()) {
1812 builder.WriteUInt8(data_ir.padding_payload_len() & 0xff); 1812 builder.WriteUInt8(data_ir.padding_payload_len() & 0xff);
1813 } 1813 }
1814 builder.OverwriteLength(*this, num_padding_fields + data_ir.data_len() + 1814 builder.OverwriteLength(*this, num_padding_fields + data_ir.data_len() +
1815 data_ir.padding_payload_len()); 1815 data_ir.padding_payload_len());
1816 } else { 1816 } else {
1817 builder.BeginNewFrame(*this, SpdyFrameType::DATA, flags, 1817 builder.BeginNewFrame(*this, SerializeFrameType(SpdyFrameType::DATA), flags,
1818 data_ir.stream_id(), 1818 data_ir.stream_id(),
1819 num_padding_fields + data_ir.data_len() + 1819 num_padding_fields + data_ir.data_len() +
1820 data_ir.padding_payload_len()); 1820 data_ir.padding_payload_len());
1821 if (data_ir.padded()) { 1821 if (data_ir.padded()) {
1822 builder.WriteUInt8(data_ir.padding_payload_len() & 0xff); 1822 builder.WriteUInt8(data_ir.padding_payload_len() & 0xff);
1823 } 1823 }
1824 } 1824 }
1825 DCHECK_EQ(frame_size, builder.length()); 1825 DCHECK_EQ(frame_size, builder.length());
1826 return builder.take(); 1826 return builder.take();
1827 } 1827 }
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
1980 size_t length_field = 0; 1980 size_t length_field = 0;
1981 SerializeHeadersBuilderHelper(headers, &flags, &size, &hpack_encoding, 1981 SerializeHeadersBuilderHelper(headers, &flags, &size, &hpack_encoding,
1982 &weight, &length_field); 1982 &weight, &length_field);
1983 1983
1984 SpdyFrameBuilder builder(size); 1984 SpdyFrameBuilder builder(size);
1985 1985
1986 if (!skip_rewritelength_) { 1986 if (!skip_rewritelength_) {
1987 builder.BeginNewFrame(*this, SpdyFrameType::HEADERS, flags, 1987 builder.BeginNewFrame(*this, SpdyFrameType::HEADERS, flags,
1988 headers.stream_id()); 1988 headers.stream_id());
1989 } else { 1989 } else {
1990 builder.BeginNewFrame(*this, SpdyFrameType::HEADERS, flags, 1990 builder.BeginNewFrame(*this, SerializeFrameType(SpdyFrameType::HEADERS),
1991 headers.stream_id(), length_field); 1991 flags, headers.stream_id(), length_field);
1992 } 1992 }
1993 DCHECK_EQ(GetHeadersMinimumSize(), builder.length()); 1993 DCHECK_EQ(GetHeadersMinimumSize(), builder.length());
1994 1994
1995 int padding_payload_len = 0; 1995 int padding_payload_len = 0;
1996 if (headers.padded()) { 1996 if (headers.padded()) {
1997 builder.WriteUInt8(headers.padding_payload_len()); 1997 builder.WriteUInt8(headers.padding_payload_len());
1998 padding_payload_len = headers.padding_payload_len(); 1998 padding_payload_len = headers.padding_payload_len();
1999 } 1999 }
2000 if (headers.has_priority()) { 2000 if (headers.has_priority()) {
2001 builder.WriteUInt32(PackStreamDependencyValues(headers.exclusive(), 2001 builder.WriteUInt32(PackStreamDependencyValues(headers.exclusive(),
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
2071 string hpack_encoding; 2071 string hpack_encoding;
2072 SerializePushPromiseBuilderHelper(push_promise, &flags, &hpack_encoding, 2072 SerializePushPromiseBuilderHelper(push_promise, &flags, &hpack_encoding,
2073 &size); 2073 &size);
2074 2074
2075 SpdyFrameBuilder builder(size); 2075 SpdyFrameBuilder builder(size);
2076 if (!skip_rewritelength_) { 2076 if (!skip_rewritelength_) {
2077 builder.BeginNewFrame(*this, SpdyFrameType::PUSH_PROMISE, flags, 2077 builder.BeginNewFrame(*this, SpdyFrameType::PUSH_PROMISE, flags,
2078 push_promise.stream_id()); 2078 push_promise.stream_id());
2079 } else { 2079 } else {
2080 size_t length = std::min(size, kMaxControlFrameSize) - GetFrameHeaderSize(); 2080 size_t length = std::min(size, kMaxControlFrameSize) - GetFrameHeaderSize();
2081 builder.BeginNewFrame(*this, SpdyFrameType::PUSH_PROMISE, flags, 2081 builder.BeginNewFrame(*this,
2082 push_promise.stream_id(), length); 2082 SerializeFrameType(SpdyFrameType::PUSH_PROMISE),
2083 flags, push_promise.stream_id(), length);
2083 } 2084 }
2084 int padding_payload_len = 0; 2085 int padding_payload_len = 0;
2085 if (push_promise.padded()) { 2086 if (push_promise.padded()) {
2086 builder.WriteUInt8(push_promise.padding_payload_len()); 2087 builder.WriteUInt8(push_promise.padding_payload_len());
2087 builder.WriteUInt32(push_promise.promised_stream_id()); 2088 builder.WriteUInt32(push_promise.promised_stream_id());
2088 DCHECK_EQ(GetPushPromiseMinimumSize() + kPadLengthFieldSize, 2089 DCHECK_EQ(GetPushPromiseMinimumSize() + kPadLengthFieldSize,
2089 builder.length()); 2090 builder.length());
2090 2091
2091 padding_payload_len = push_promise.padding_payload_len(); 2092 padding_payload_len = push_promise.padding_payload_len();
2092 } else { 2093 } else {
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
2387 if (!skip_rewritelength_) { 2388 if (!skip_rewritelength_) {
2388 ok = builder.BeginNewFrame(*this, SpdyFrameType::DATA, flags, 2389 ok = builder.BeginNewFrame(*this, SpdyFrameType::DATA, flags,
2389 data_ir.stream_id()); 2390 data_ir.stream_id());
2390 if (data_ir.padded()) { 2391 if (data_ir.padded()) {
2391 ok = ok && builder.WriteUInt8(data_ir.padding_payload_len() & 0xff); 2392 ok = ok && builder.WriteUInt8(data_ir.padding_payload_len() & 0xff);
2392 } 2393 }
2393 ok = ok && builder.OverwriteLength(*this, 2394 ok = ok && builder.OverwriteLength(*this,
2394 num_padding_fields + data_ir.data_len() + 2395 num_padding_fields + data_ir.data_len() +
2395 data_ir.padding_payload_len()); 2396 data_ir.padding_payload_len());
2396 } else { 2397 } else {
2397 ok = ok && builder.BeginNewFrame(*this, SpdyFrameType::DATA, flags, 2398 ok = ok &&
2398 data_ir.stream_id(), 2399 builder.BeginNewFrame(*this, SerializeFrameType(SpdyFrameType::DATA),
2399 num_padding_fields + data_ir.data_len() + 2400 flags, data_ir.stream_id(),
2400 data_ir.padding_payload_len()); 2401 num_padding_fields + data_ir.data_len() +
2402 data_ir.padding_payload_len());
2401 if (data_ir.padded()) { 2403 if (data_ir.padded()) {
2402 ok = ok && builder.WriteUInt8(data_ir.padding_payload_len() & 0xff); 2404 ok = ok && builder.WriteUInt8(data_ir.padding_payload_len() & 0xff);
2403 } 2405 }
2404 } 2406 }
2405 DCHECK_EQ(frame_size, builder.length()); 2407 DCHECK_EQ(frame_size, builder.length());
2406 return ok; 2408 return ok;
2407 } 2409 }
2408 2410
2409 bool SpdyFramer::SerializeRstStream(const SpdyRstStreamIR& rst_stream, 2411 bool SpdyFramer::SerializeRstStream(const SpdyRstStreamIR& rst_stream,
2410 ZeroCopyOutputBuffer* output) const { 2412 ZeroCopyOutputBuffer* output) const {
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
2494 size_t length_field = 0; 2496 size_t length_field = 0;
2495 SerializeHeadersBuilderHelper(headers, &flags, &size, &hpack_encoding, 2497 SerializeHeadersBuilderHelper(headers, &flags, &size, &hpack_encoding,
2496 &weight, &length_field); 2498 &weight, &length_field);
2497 2499
2498 bool ok = true; 2500 bool ok = true;
2499 SpdyFrameBuilder builder(size, output); 2501 SpdyFrameBuilder builder(size, output);
2500 if (!skip_rewritelength_) { 2502 if (!skip_rewritelength_) {
2501 ok = builder.BeginNewFrame(*this, SpdyFrameType::HEADERS, flags, 2503 ok = builder.BeginNewFrame(*this, SpdyFrameType::HEADERS, flags,
2502 headers.stream_id()); 2504 headers.stream_id());
2503 } else { 2505 } else {
2504 ok = ok && builder.BeginNewFrame(*this, SpdyFrameType::HEADERS, flags, 2506 ok = ok && builder.BeginNewFrame(*this,
2505 headers.stream_id(), length_field); 2507 SerializeFrameType(SpdyFrameType::HEADERS),
2508 flags, headers.stream_id(), length_field);
2506 } 2509 }
2507 DCHECK_EQ(GetHeadersMinimumSize(), builder.length()); 2510 DCHECK_EQ(GetHeadersMinimumSize(), builder.length());
2508 2511
2509 int padding_payload_len = 0; 2512 int padding_payload_len = 0;
2510 if (headers.padded()) { 2513 if (headers.padded()) {
2511 ok = ok && builder.WriteUInt8(headers.padding_payload_len()); 2514 ok = ok && builder.WriteUInt8(headers.padding_payload_len());
2512 padding_payload_len = headers.padding_payload_len(); 2515 padding_payload_len = headers.padding_payload_len();
2513 } 2516 }
2514 if (headers.has_priority()) { 2517 if (headers.has_priority()) {
2515 ok = ok && 2518 ok = ok &&
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2560 SerializePushPromiseBuilderHelper(push_promise, &flags, &hpack_encoding, 2563 SerializePushPromiseBuilderHelper(push_promise, &flags, &hpack_encoding,
2561 &size); 2564 &size);
2562 2565
2563 bool ok = true; 2566 bool ok = true;
2564 SpdyFrameBuilder builder(size, output); 2567 SpdyFrameBuilder builder(size, output);
2565 if (!skip_rewritelength_) { 2568 if (!skip_rewritelength_) {
2566 ok = builder.BeginNewFrame(*this, SpdyFrameType::PUSH_PROMISE, flags, 2569 ok = builder.BeginNewFrame(*this, SpdyFrameType::PUSH_PROMISE, flags,
2567 push_promise.stream_id()); 2570 push_promise.stream_id());
2568 } else { 2571 } else {
2569 size_t length = std::min(size, kMaxControlFrameSize) - GetFrameHeaderSize(); 2572 size_t length = std::min(size, kMaxControlFrameSize) - GetFrameHeaderSize();
2570 ok = builder.BeginNewFrame(*this, SpdyFrameType::PUSH_PROMISE, flags, 2573 ok = builder.BeginNewFrame(*this,
2571 push_promise.stream_id(), length); 2574 SerializeFrameType(SpdyFrameType::PUSH_PROMISE),
2575 flags, push_promise.stream_id(), length);
2572 } 2576 }
2573 2577
2574 int padding_payload_len = 0; 2578 int padding_payload_len = 0;
2575 if (push_promise.padded()) { 2579 if (push_promise.padded()) {
2576 ok = ok && builder.WriteUInt8(push_promise.padding_payload_len()) && 2580 ok = ok && builder.WriteUInt8(push_promise.padding_payload_len()) &&
2577 builder.WriteUInt32(push_promise.promised_stream_id()); 2581 builder.WriteUInt32(push_promise.promised_stream_id());
2578 DCHECK_EQ(GetPushPromiseMinimumSize() + kPadLengthFieldSize, 2582 DCHECK_EQ(GetPushPromiseMinimumSize() + kPadLengthFieldSize,
2579 builder.length()); 2583 builder.length());
2580 2584
2581 padding_payload_len = push_promise.padding_payload_len(); 2585 padding_payload_len = push_promise.padding_payload_len();
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
2793 size_t bytes_to_write = std::min( 2797 size_t bytes_to_write = std::min(
2794 bytes_remaining, kMaxControlFrameSize - GetContinuationMinimumSize()); 2798 bytes_remaining, kMaxControlFrameSize - GetContinuationMinimumSize());
2795 // Write CONTINUATION frame prefix. 2799 // Write CONTINUATION frame prefix.
2796 if (bytes_remaining == bytes_to_write) { 2800 if (bytes_remaining == bytes_to_write) {
2797 flags |= end_flag; 2801 flags |= end_flag;
2798 } 2802 }
2799 if (!skip_rewritelength_) { 2803 if (!skip_rewritelength_) {
2800 ret &= builder->BeginNewFrame(*this, SpdyFrameType::CONTINUATION, flags, 2804 ret &= builder->BeginNewFrame(*this, SpdyFrameType::CONTINUATION, flags,
2801 stream_id); 2805 stream_id);
2802 } else { 2806 } else {
2803 ret &= builder->BeginNewFrame(*this, SpdyFrameType::CONTINUATION, flags, 2807 ret &= builder->BeginNewFrame(
2804 stream_id, bytes_to_write); 2808 *this, SerializeFrameType(SpdyFrameType::CONTINUATION), flags,
2809 stream_id, bytes_to_write);
2805 } 2810 }
2806 // Write payload fragment. 2811 // Write payload fragment.
2807 ret &= builder->WriteBytes( 2812 ret &= builder->WriteBytes(
2808 &hpack_encoding[hpack_encoding.size() - bytes_remaining], 2813 &hpack_encoding[hpack_encoding.size() - bytes_remaining],
2809 bytes_to_write); 2814 bytes_to_write);
2810 bytes_remaining -= bytes_to_write; 2815 bytes_remaining -= bytes_to_write;
2811 } 2816 }
2812 return ret; 2817 return ret;
2813 } 2818 }
2814 2819
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2879 builder->WriteUInt32(header_block.size()); 2884 builder->WriteUInt32(header_block.size());
2880 2885
2881 // Serialize each header. 2886 // Serialize each header.
2882 for (const auto& header : header_block) { 2887 for (const auto& header : header_block) {
2883 builder->WriteStringPiece32(base::ToLowerASCII(header.first)); 2888 builder->WriteStringPiece32(base::ToLowerASCII(header.first));
2884 builder->WriteStringPiece32(header.second); 2889 builder->WriteStringPiece32(header.second);
2885 } 2890 }
2886 } 2891 }
2887 2892
2888 } // namespace net 2893 } // namespace net
OLDNEW
« net/spdy/spdy_frame_builder.h ('K') | « net/spdy/spdy_framer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698