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 <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <string> | 9 #include <string> |
10 | 10 |
11 #include "base/lazy_instance.h" | 11 #include "base/lazy_instance.h" |
12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "base/third_party/valgrind/memcheck.h" | 13 #include "base/third_party/valgrind/memcheck.h" |
14 #include "net/spdy/spdy_alt_svc_wire_format.h" | |
15 #include "net/spdy/spdy_frame_builder.h" | 14 #include "net/spdy/spdy_frame_builder.h" |
16 #include "net/spdy/spdy_frame_reader.h" | 15 #include "net/spdy/spdy_frame_reader.h" |
17 #include "net/spdy/spdy_bitmasks.h" | 16 #include "net/spdy/spdy_bitmasks.h" |
18 #include "third_party/zlib/zlib.h" | 17 #include "third_party/zlib/zlib.h" |
19 | 18 |
20 using base::StringPiece; | 19 using base::StringPiece; |
21 using std::string; | 20 using std::string; |
22 using std::vector; | 21 using std::vector; |
23 | 22 |
24 namespace net { | 23 namespace net { |
(...skipping 2025 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2050 altsvc_scratch_.buffer_length); | 2049 altsvc_scratch_.buffer_length); |
2051 StringPiece origin; | 2050 StringPiece origin; |
2052 bool successful_read = reader.ReadStringPiece16(&origin); | 2051 bool successful_read = reader.ReadStringPiece16(&origin); |
2053 if (!successful_read) { | 2052 if (!successful_read) { |
2054 set_error(SPDY_INVALID_CONTROL_FRAME); | 2053 set_error(SPDY_INVALID_CONTROL_FRAME); |
2055 return 0; | 2054 return 0; |
2056 } | 2055 } |
2057 StringPiece value(altsvc_scratch_.buffer.get() + reader.GetBytesConsumed(), | 2056 StringPiece value(altsvc_scratch_.buffer.get() + reader.GetBytesConsumed(), |
2058 altsvc_scratch_.buffer_length - reader.GetBytesConsumed()); | 2057 altsvc_scratch_.buffer_length - reader.GetBytesConsumed()); |
2059 | 2058 |
2060 string protocol_id; | 2059 SpdyAltSvcWireFormat::AlternativeService altsvc; |
2061 string host; | 2060 bool success = SpdyAltSvcWireFormat::ParseHeaderFieldValue(value, &altsvc); |
2062 uint16 port; | 2061 if (!success || altsvc.protocol_id.length() == 0) { |
2063 uint32 max_age; | |
2064 double p; | |
2065 bool success = SpdyAltSvcWireFormat::ParseHeaderFieldValue( | |
2066 value, &protocol_id, &host, &port, &max_age, &p); | |
2067 if (!success || protocol_id.length() == 0) { | |
2068 set_error(SPDY_INVALID_CONTROL_FRAME); | 2062 set_error(SPDY_INVALID_CONTROL_FRAME); |
2069 return 0; | 2063 return 0; |
2070 } | 2064 } |
2071 | 2065 |
2072 // TODO(bnc): Pass on |p|. | 2066 visitor_->OnAltSvc(current_frame_stream_id_, origin, altsvc); |
2073 visitor_->OnAltSvc(current_frame_stream_id_, max_age, port, protocol_id, host, | |
2074 origin); | |
2075 CHANGE_STATE(SPDY_AUTO_RESET); | 2067 CHANGE_STATE(SPDY_AUTO_RESET); |
2076 return len; | 2068 return len; |
2077 } | 2069 } |
2078 | 2070 |
2079 size_t SpdyFramer::ProcessDataFramePaddingLength(const char* data, size_t len) { | 2071 size_t SpdyFramer::ProcessDataFramePaddingLength(const char* data, size_t len) { |
2080 DCHECK_EQ(SPDY_READ_DATA_FRAME_PADDING_LENGTH, state_); | 2072 DCHECK_EQ(SPDY_READ_DATA_FRAME_PADDING_LENGTH, state_); |
2081 DCHECK_EQ(0u, remaining_padding_payload_length_); | 2073 DCHECK_EQ(0u, remaining_padding_payload_length_); |
2082 DCHECK_EQ(DATA, current_frame_type_); | 2074 DCHECK_EQ(DATA, current_frame_type_); |
2083 | 2075 |
2084 size_t original_len = len; | 2076 size_t original_len = len; |
(...skipping 685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2770 | 2762 |
2771 builder.WriteBytes(&hpack_encoding[0], hpack_encoding.size()); | 2763 builder.WriteBytes(&hpack_encoding[0], hpack_encoding.size()); |
2772 return builder.take(); | 2764 return builder.take(); |
2773 } | 2765 } |
2774 | 2766 |
2775 SpdyFrame* SpdyFramer::SerializeAltSvc(const SpdyAltSvcIR& altsvc) { | 2767 SpdyFrame* SpdyFramer::SerializeAltSvc(const SpdyAltSvcIR& altsvc) { |
2776 DCHECK_LT(SPDY3, protocol_version()); | 2768 DCHECK_LT(SPDY3, protocol_version()); |
2777 | 2769 |
2778 size_t size = GetAltSvcMinimumSize(); | 2770 size_t size = GetAltSvcMinimumSize(); |
2779 size += altsvc.origin().length(); | 2771 size += altsvc.origin().length(); |
2780 // TODO(bnc): Add probability to SpdyAltSvcIR and pass it on. | 2772 string value = |
2781 string value = SpdyAltSvcWireFormat::SerializeHeaderFieldValue( | 2773 SpdyAltSvcWireFormat::SerializeHeaderFieldValue(altsvc.altsvc()); |
2782 altsvc.protocol_id(), altsvc.host(), altsvc.port(), altsvc.max_age(), | |
2783 1.0); | |
2784 size += value.length(); | 2774 size += value.length(); |
2785 | 2775 |
2786 SpdyFrameBuilder builder(size, protocol_version()); | 2776 SpdyFrameBuilder builder(size, protocol_version()); |
2787 builder.BeginNewFrame(*this, ALTSVC, kNoFlags, altsvc.stream_id()); | 2777 builder.BeginNewFrame(*this, ALTSVC, kNoFlags, altsvc.stream_id()); |
2788 | 2778 |
2789 builder.WriteUInt16(altsvc.origin().length()); | 2779 builder.WriteUInt16(altsvc.origin().length()); |
2790 builder.WriteBytes(altsvc.origin().data(), altsvc.origin().length()); | 2780 builder.WriteBytes(altsvc.origin().data(), altsvc.origin().length()); |
2791 builder.WriteBytes(value.data(), value.length()); | 2781 builder.WriteBytes(value.data(), value.length()); |
2792 DCHECK_LT(GetAltSvcMinimumSize(), builder.length()); | 2782 DCHECK_LT(GetAltSvcMinimumSize(), builder.length()); |
2793 return builder.take(); | 2783 return builder.take(); |
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3215 #else | 3205 #else |
3216 WriteHeaderBlockToZ(&frame.name_value_block(), compressor); | 3206 WriteHeaderBlockToZ(&frame.name_value_block(), compressor); |
3217 #endif // defined(USE_SYSTEM_ZLIB) | 3207 #endif // defined(USE_SYSTEM_ZLIB) |
3218 | 3208 |
3219 int compressed_size = compressed_max_size - compressor->avail_out; | 3209 int compressed_size = compressed_max_size - compressor->avail_out; |
3220 builder->Seek(compressed_size); | 3210 builder->Seek(compressed_size); |
3221 builder->RewriteLength(*this); | 3211 builder->RewriteLength(*this); |
3222 } | 3212 } |
3223 | 3213 |
3224 } // namespace net | 3214 } // namespace net |
OLD | NEW |