| 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 |