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 1796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |