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 "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/metrics/stats_counters.h" | 9 #include "base/metrics/stats_counters.h" |
10 #include "base/third_party/valgrind/memcheck.h" | 10 #include "base/third_party/valgrind/memcheck.h" |
(...skipping 671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
682 } | 682 } |
683 | 683 |
684 // Using a scoped_ptr here since we may need to create a new SpdyFrameReader | 684 // Using a scoped_ptr here since we may need to create a new SpdyFrameReader |
685 // when processing DATA frames below. | 685 // when processing DATA frames below. |
686 scoped_ptr<SpdyFrameReader> reader( | 686 scoped_ptr<SpdyFrameReader> reader( |
687 new SpdyFrameReader(current_frame_buffer_.get(), | 687 new SpdyFrameReader(current_frame_buffer_.get(), |
688 current_frame_buffer_length_)); | 688 current_frame_buffer_length_)); |
689 | 689 |
690 bool is_control_frame = false; | 690 bool is_control_frame = false; |
691 | 691 |
692 uint16 control_frame_type_field = | 692 int control_frame_type_field = |
693 SpdyConstants::DataFrameType(protocol_version()); | 693 SpdyConstants::DataFrameType(protocol_version()); |
694 // ProcessControlFrameHeader() will set current_frame_type_ to the | 694 // ProcessControlFrameHeader() will set current_frame_type_ to the |
695 // correct value if this is a valid control frame. | 695 // correct value if this is a valid control frame. |
696 current_frame_type_ = DATA; | 696 current_frame_type_ = DATA; |
697 if (protocol_version() <= SPDY3) { | 697 if (protocol_version() <= SPDY3) { |
698 uint16 version = 0; | 698 uint16 version = 0; |
699 bool successful_read = reader->ReadUInt16(&version); | 699 bool successful_read = reader->ReadUInt16(&version); |
700 DCHECK(successful_read); | 700 DCHECK(successful_read); |
701 is_control_frame = (version & kControlFlagMask) != 0; | 701 is_control_frame = (version & kControlFlagMask) != 0; |
702 version &= ~kControlFlagMask; // Only valid for control frames. | 702 version &= ~kControlFlagMask; // Only valid for control frames. |
703 if (is_control_frame) { | 703 if (is_control_frame) { |
704 // We check version before we check validity: version can never be | 704 // We check version before we check validity: version can never be |
705 // 'invalid', it can only be unsupported. | 705 // 'invalid', it can only be unsupported. |
706 if (version < SpdyConstants::SerializeMajorVersion(SPDY_MIN_VERSION) || | 706 if (version < SpdyConstants::SerializeMajorVersion(SPDY_MIN_VERSION) || |
707 version > SpdyConstants::SerializeMajorVersion(SPDY_MAX_VERSION) || | 707 version > SpdyConstants::SerializeMajorVersion(SPDY_MAX_VERSION) || |
708 SpdyConstants::ParseMajorVersion(version) != protocol_version()) { | 708 SpdyConstants::ParseMajorVersion(version) != protocol_version()) { |
709 // Version does not match the version the framer was initialized with. | 709 // Version does not match the version the framer was initialized with. |
710 DVLOG(1) << "Unsupported SPDY version " | 710 DVLOG(1) << "Unsupported SPDY version " |
711 << version | 711 << version |
712 << " (expected " << protocol_version() << ")"; | 712 << " (expected " << protocol_version() << ")"; |
713 set_error(SPDY_UNSUPPORTED_VERSION); | 713 set_error(SPDY_UNSUPPORTED_VERSION); |
714 return 0; | 714 return 0; |
715 } | 715 } |
716 // We check control_frame_type_field's validity in | 716 // We check control_frame_type_field's validity in |
717 // ProcessControlFrameHeader(). | 717 // ProcessControlFrameHeader(). |
718 successful_read = reader->ReadUInt16(&control_frame_type_field); | 718 uint16 control_frame_type_field_uint16; |
| 719 successful_read = reader->ReadUInt16(&control_frame_type_field_uint16); |
| 720 control_frame_type_field = control_frame_type_field_uint16; |
719 } else { | 721 } else { |
720 reader->Rewind(); | 722 reader->Rewind(); |
721 successful_read = reader->ReadUInt31(¤t_frame_stream_id_); | 723 successful_read = reader->ReadUInt31(¤t_frame_stream_id_); |
722 } | 724 } |
723 DCHECK(successful_read); | 725 DCHECK(successful_read); |
724 | 726 |
725 successful_read = reader->ReadUInt8(¤t_frame_flags_); | 727 successful_read = reader->ReadUInt8(¤t_frame_flags_); |
726 DCHECK(successful_read); | 728 DCHECK(successful_read); |
727 | 729 |
728 uint32 length_field = 0; | 730 uint32 length_field = 0; |
729 successful_read = reader->ReadUInt24(&length_field); | 731 successful_read = reader->ReadUInt24(&length_field); |
730 DCHECK(successful_read); | 732 DCHECK(successful_read); |
731 remaining_data_length_ = length_field; | 733 remaining_data_length_ = length_field; |
732 current_frame_length_ = remaining_data_length_ + reader->GetBytesConsumed(); | 734 current_frame_length_ = remaining_data_length_ + reader->GetBytesConsumed(); |
733 } else { | 735 } else { |
734 uint32 length_field = 0; | 736 uint32 length_field = 0; |
735 bool successful_read = reader->ReadUInt24(&length_field); | 737 bool successful_read = reader->ReadUInt24(&length_field); |
736 DCHECK(successful_read); | 738 DCHECK(successful_read); |
737 | 739 |
738 uint8 control_frame_type_field_uint8 = | 740 uint8 control_frame_type_field_uint8; |
739 SpdyConstants::DataFrameType(protocol_version()); | |
740 successful_read = reader->ReadUInt8(&control_frame_type_field_uint8); | 741 successful_read = reader->ReadUInt8(&control_frame_type_field_uint8); |
741 DCHECK(successful_read); | 742 DCHECK(successful_read); |
742 // We check control_frame_type_field's validity in | 743 // We check control_frame_type_field's validity in |
743 // ProcessControlFrameHeader(). | 744 // ProcessControlFrameHeader(). |
744 control_frame_type_field = control_frame_type_field_uint8; | 745 control_frame_type_field = control_frame_type_field_uint8; |
745 is_control_frame = (protocol_version() > SPDY3) ? | 746 is_control_frame = control_frame_type_field != |
746 control_frame_type_field != | 747 SpdyConstants::SerializeFrameType(protocol_version(), DATA); |
747 SpdyConstants::SerializeFrameType(protocol_version(), DATA) : | |
748 control_frame_type_field != 0; | |
749 | 748 |
750 if (is_control_frame) { | 749 if (is_control_frame) { |
751 current_frame_length_ = length_field + GetControlFrameHeaderSize(); | 750 current_frame_length_ = length_field + GetControlFrameHeaderSize(); |
752 } else { | 751 } else { |
753 current_frame_length_ = length_field + GetDataFrameMinimumSize(); | 752 current_frame_length_ = length_field + GetDataFrameMinimumSize(); |
754 } | 753 } |
755 | 754 |
756 successful_read = reader->ReadUInt8(¤t_frame_flags_); | 755 successful_read = reader->ReadUInt8(¤t_frame_flags_); |
757 DCHECK(successful_read); | 756 DCHECK(successful_read); |
758 | 757 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
831 CHANGE_STATE(SPDY_AUTO_RESET); | 830 CHANGE_STATE(SPDY_AUTO_RESET); |
832 } | 831 } |
833 } | 832 } |
834 } else { | 833 } else { |
835 ProcessControlFrameHeader(control_frame_type_field); | 834 ProcessControlFrameHeader(control_frame_type_field); |
836 } | 835 } |
837 | 836 |
838 return original_len - len; | 837 return original_len - len; |
839 } | 838 } |
840 | 839 |
841 void SpdyFramer::ProcessControlFrameHeader(uint16 control_frame_type_field) { | 840 void SpdyFramer::ProcessControlFrameHeader(int control_frame_type_field) { |
842 DCHECK_EQ(SPDY_NO_ERROR, error_code_); | 841 DCHECK_EQ(SPDY_NO_ERROR, error_code_); |
843 DCHECK_LE(GetControlFrameHeaderSize(), current_frame_buffer_length_); | 842 DCHECK_LE(GetControlFrameHeaderSize(), current_frame_buffer_length_); |
844 | 843 |
845 // TODO(mlavan): Either remove credential frames from the code entirely, | 844 // TODO(mlavan): Either remove credential frames from the code entirely, |
846 // or add them to parsing + serialization methods for SPDY3. | 845 // or add them to parsing + serialization methods for SPDY3. |
847 // Early detection of deprecated frames that we ignore. | 846 // Early detection of deprecated frames that we ignore. |
848 if (protocol_version() <= SPDY3) { | 847 if (protocol_version() <= SPDY3) { |
849 if (control_frame_type_field == CREDENTIAL) { | 848 if (control_frame_type_field == CREDENTIAL) { |
850 current_frame_type_ = CREDENTIAL; | 849 current_frame_type_ = CREDENTIAL; |
851 DCHECK_EQ(SPDY3, protocol_version()); | 850 DCHECK_EQ(SPDY3, protocol_version()); |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1184 total_length += length_of_name_size + it->first.size() + | 1183 total_length += length_of_name_size + it->first.size() + |
1185 length_of_value_size + it->second.size(); | 1184 length_of_value_size + it->second.size(); |
1186 } | 1185 } |
1187 return total_length; | 1186 return total_length; |
1188 } | 1187 } |
1189 | 1188 |
1190 void SpdyFramer::WriteHeaderBlock(SpdyFrameBuilder* frame, | 1189 void SpdyFramer::WriteHeaderBlock(SpdyFrameBuilder* frame, |
1191 const SpdyMajorVersion spdy_version, | 1190 const SpdyMajorVersion spdy_version, |
1192 const SpdyHeaderBlock* headers) { | 1191 const SpdyHeaderBlock* headers) { |
1193 if (spdy_version < SPDY3) { | 1192 if (spdy_version < SPDY3) { |
1194 frame->WriteUInt16(headers->size()); | 1193 frame->WriteUInt16(static_cast<uint16>(headers->size())); |
1195 } else { | 1194 } else { |
1196 frame->WriteUInt32(headers->size()); | 1195 frame->WriteUInt32(headers->size()); |
1197 } | 1196 } |
1198 SpdyHeaderBlock::const_iterator it; | 1197 SpdyHeaderBlock::const_iterator it; |
1199 for (it = headers->begin(); it != headers->end(); ++it) { | 1198 for (it = headers->begin(); it != headers->end(); ++it) { |
1200 if (spdy_version < SPDY3) { | 1199 if (spdy_version < SPDY3) { |
1201 frame->WriteString(it->first); | 1200 frame->WriteString(it->first); |
1202 frame->WriteString(it->second); | 1201 frame->WriteString(it->second); |
1203 } else { | 1202 } else { |
1204 frame->WriteStringPiece32(it->first); | 1203 frame->WriteStringPiece32(it->first); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1263 } | 1262 } |
1264 | 1263 |
1265 // WriteLengthZ writes |n| as a |length|-byte, big-endian number to |out|. | 1264 // WriteLengthZ writes |n| as a |length|-byte, big-endian number to |out|. |
1266 static void WriteLengthZ(size_t n, | 1265 static void WriteLengthZ(size_t n, |
1267 unsigned length, | 1266 unsigned length, |
1268 ZDataClass clas, | 1267 ZDataClass clas, |
1269 z_stream* out) { | 1268 z_stream* out) { |
1270 char buf[4]; | 1269 char buf[4]; |
1271 DCHECK_LE(length, sizeof(buf)); | 1270 DCHECK_LE(length, sizeof(buf)); |
1272 for (unsigned i = 1; i <= length; i++) { | 1271 for (unsigned i = 1; i <= length; i++) { |
1273 buf[length - i] = n; | 1272 buf[length - i] = static_cast<char>(n); |
1274 n >>= 8; | 1273 n >>= 8; |
1275 } | 1274 } |
1276 WriteZ(base::StringPiece(buf, length), clas, out); | 1275 WriteZ(base::StringPiece(buf, length), clas, out); |
1277 } | 1276 } |
1278 | 1277 |
1279 // WriteHeaderBlockToZ serialises |headers| to the deflate context |z| in a | 1278 // WriteHeaderBlockToZ serialises |headers| to the deflate context |z| in a |
1280 // manner that resists the length of the compressed data from compromising | 1279 // manner that resists the length of the compressed data from compromising |
1281 // cookie data. | 1280 // cookie data. |
1282 void SpdyFramer::WriteHeaderBlockToZ(const SpdyHeaderBlock* headers, | 1281 void SpdyFramer::WriteHeaderBlockToZ(const SpdyHeaderBlock* headers, |
1283 z_stream* z) const { | 1282 z_stream* z) const { |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1482 if (protocol_version() > SPDY3 && | 1481 if (protocol_version() > SPDY3 && |
1483 current_frame_flags_ & HEADERS_FLAG_PADDED) { | 1482 current_frame_flags_ & HEADERS_FLAG_PADDED) { |
1484 uint8 pad_payload_len = 0; | 1483 uint8 pad_payload_len = 0; |
1485 DCHECK_EQ(remaining_padding_payload_length_, 0u); | 1484 DCHECK_EQ(remaining_padding_payload_length_, 0u); |
1486 successful_read = reader.ReadUInt8(&pad_payload_len); | 1485 successful_read = reader.ReadUInt8(&pad_payload_len); |
1487 DCHECK(successful_read); | 1486 DCHECK(successful_read); |
1488 remaining_padding_payload_length_ = pad_payload_len; | 1487 remaining_padding_payload_length_ = pad_payload_len; |
1489 } | 1488 } |
1490 const bool has_priority = | 1489 const bool has_priority = |
1491 (current_frame_flags_ & HEADERS_FLAG_PRIORITY) != 0; | 1490 (current_frame_flags_ & HEADERS_FLAG_PRIORITY) != 0; |
1492 uint32 priority = 0; | 1491 SpdyPriority priority = 0; |
1493 if (protocol_version() > SPDY3 && has_priority) { | 1492 if (protocol_version() > SPDY3 && has_priority) { |
1494 // TODO(jgraettinger): Process dependency rather than ignoring it. | 1493 // TODO(jgraettinger): Process dependency rather than ignoring it. |
1495 reader.Seek(kPriorityDependencyPayloadSize); | 1494 reader.Seek(kPriorityDependencyPayloadSize); |
1496 uint8 weight = 0; | 1495 uint8 weight = 0; |
1497 successful_read = reader.ReadUInt8(&weight); | 1496 successful_read = reader.ReadUInt8(&weight); |
1498 if (successful_read) { | 1497 if (successful_read) { |
1499 priority = MapWeightToPriority(weight); | 1498 priority = MapWeightToPriority(weight); |
1500 } | 1499 } |
1501 } | 1500 } |
1502 DCHECK(reader.IsDoneReading()); | 1501 DCHECK(reader.IsDoneReading()); |
(...skipping 961 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2464 return builder.take(); | 2463 return builder.take(); |
2465 } | 2464 } |
2466 | 2465 |
2467 SpdySerializedFrame* SpdyFramer::SerializeRstStream( | 2466 SpdySerializedFrame* SpdyFramer::SerializeRstStream( |
2468 const SpdyRstStreamIR& rst_stream) const { | 2467 const SpdyRstStreamIR& rst_stream) const { |
2469 // TODO(jgraettinger): For now, Chromium will support parsing RST_STREAM | 2468 // TODO(jgraettinger): For now, Chromium will support parsing RST_STREAM |
2470 // payloads, but will not emit them. SPDY4 is used for draft HTTP/2, | 2469 // payloads, but will not emit them. SPDY4 is used for draft HTTP/2, |
2471 // which doesn't currently include RST_STREAM payloads. GFE flags have been | 2470 // which doesn't currently include RST_STREAM payloads. GFE flags have been |
2472 // commented but left in place to simplify future patching. | 2471 // commented but left in place to simplify future patching. |
2473 // Compute the output buffer size, taking opaque data into account. | 2472 // Compute the output buffer size, taking opaque data into account. |
2474 uint16 expected_length = GetRstStreamMinimumSize(); | 2473 size_t expected_length = GetRstStreamMinimumSize(); |
2475 if (protocol_version() > SPDY3) { | 2474 if (protocol_version() > SPDY3) { |
2476 expected_length += rst_stream.description().size(); | 2475 expected_length += rst_stream.description().size(); |
2477 } | 2476 } |
2478 SpdyFrameBuilder builder(expected_length, protocol_version()); | 2477 SpdyFrameBuilder builder(expected_length, protocol_version()); |
2479 | 2478 |
2480 // Serialize the RST_STREAM frame. | 2479 // Serialize the RST_STREAM frame. |
2481 if (protocol_version() <= SPDY3) { | 2480 if (protocol_version() <= SPDY3) { |
2482 builder.WriteControlFrameHeader(*this, RST_STREAM, 0); | 2481 builder.WriteControlFrameHeader(*this, RST_STREAM, 0); |
2483 builder.WriteUInt32(rst_stream.stream_id()); | 2482 builder.WriteUInt32(rst_stream.stream_id()); |
2484 } else { | 2483 } else { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2529 return builder.take(); | 2528 return builder.take(); |
2530 } | 2529 } |
2531 | 2530 |
2532 if (protocol_version() <= SPDY3) { | 2531 if (protocol_version() <= SPDY3) { |
2533 builder.WriteUInt32(values->size()); | 2532 builder.WriteUInt32(values->size()); |
2534 } | 2533 } |
2535 DCHECK_EQ(GetSettingsMinimumSize(), builder.length()); | 2534 DCHECK_EQ(GetSettingsMinimumSize(), builder.length()); |
2536 for (SpdySettingsIR::ValueMap::const_iterator it = values->begin(); | 2535 for (SpdySettingsIR::ValueMap::const_iterator it = values->begin(); |
2537 it != values->end(); | 2536 it != values->end(); |
2538 ++it) { | 2537 ++it) { |
| 2538 int setting_id = |
| 2539 SpdyConstants::SerializeSettingId(protocol_version(), it->first); |
| 2540 DCHECK_GE(setting_id, 0); |
2539 if (protocol_version() <= SPDY3) { | 2541 if (protocol_version() <= SPDY3) { |
2540 uint8 setting_flags = 0; | 2542 uint8 setting_flags = 0; |
2541 if (it->second.persist_value) { | 2543 if (it->second.persist_value) { |
2542 setting_flags |= SETTINGS_FLAG_PLEASE_PERSIST; | 2544 setting_flags |= SETTINGS_FLAG_PLEASE_PERSIST; |
2543 } | 2545 } |
2544 if (it->second.persisted) { | 2546 if (it->second.persisted) { |
2545 setting_flags |= SETTINGS_FLAG_PERSISTED; | 2547 setting_flags |= SETTINGS_FLAG_PERSISTED; |
2546 } | 2548 } |
2547 SettingsFlagsAndId flags_and_id( | 2549 SettingsFlagsAndId flags_and_id(setting_flags, setting_id); |
2548 setting_flags, | |
2549 SpdyConstants::SerializeSettingId(protocol_version(), it->first)); | |
2550 uint32 id_and_flags_wire = flags_and_id.GetWireFormat(protocol_version()); | 2550 uint32 id_and_flags_wire = flags_and_id.GetWireFormat(protocol_version()); |
2551 builder.WriteBytes(&id_and_flags_wire, 4); | 2551 builder.WriteBytes(&id_and_flags_wire, 4); |
2552 } else { | 2552 } else { |
2553 builder.WriteUInt16(SpdyConstants::SerializeSettingId(protocol_version(), | 2553 builder.WriteUInt16(static_cast<uint16>(setting_id)); |
2554 it->first)); | |
2555 } | 2554 } |
2556 builder.WriteUInt32(it->second.value); | 2555 builder.WriteUInt32(it->second.value); |
2557 } | 2556 } |
2558 DCHECK_EQ(size, builder.length()); | 2557 DCHECK_EQ(size, builder.length()); |
2559 return builder.take(); | 2558 return builder.take(); |
2560 } | 2559 } |
2561 | 2560 |
2562 SpdySerializedFrame* SpdyFramer::SerializePing(const SpdyPingIR& ping) const { | 2561 SpdySerializedFrame* SpdyFramer::SerializePing(const SpdyPingIR& ping) const { |
2563 SpdyFrameBuilder builder(GetPingSize(), protocol_version()); | 2562 SpdyFrameBuilder builder(GetPingSize(), protocol_version()); |
2564 if (protocol_version() <= SPDY3) { | 2563 if (protocol_version() <= SPDY3) { |
2565 builder.WriteControlFrameHeader(*this, PING, kNoFlags); | 2564 builder.WriteControlFrameHeader(*this, PING, kNoFlags); |
2566 builder.WriteUInt32(static_cast<uint32>(ping.id())); | 2565 builder.WriteUInt32(static_cast<uint32>(ping.id())); |
2567 } else { | 2566 } else { |
2568 uint8 flags = 0; | 2567 uint8 flags = 0; |
2569 if (ping.is_ack()) { | 2568 if (ping.is_ack()) { |
2570 flags |= PING_FLAG_ACK; | 2569 flags |= PING_FLAG_ACK; |
2571 } | 2570 } |
2572 builder.BeginNewFrame(*this, PING, flags, 0); | 2571 builder.BeginNewFrame(*this, PING, flags, 0); |
2573 builder.WriteUInt64(ping.id()); | 2572 builder.WriteUInt64(ping.id()); |
2574 } | 2573 } |
2575 DCHECK_EQ(GetPingSize(), builder.length()); | 2574 DCHECK_EQ(GetPingSize(), builder.length()); |
2576 return builder.take(); | 2575 return builder.take(); |
2577 } | 2576 } |
2578 | 2577 |
2579 SpdySerializedFrame* SpdyFramer::SerializeGoAway( | 2578 SpdySerializedFrame* SpdyFramer::SerializeGoAway( |
2580 const SpdyGoAwayIR& goaway) const { | 2579 const SpdyGoAwayIR& goaway) const { |
2581 | 2580 |
2582 // Compute the output buffer size, take opaque data into account. | 2581 // Compute the output buffer size, take opaque data into account. |
2583 uint16 expected_length = GetGoAwayMinimumSize(); | 2582 size_t expected_length = GetGoAwayMinimumSize(); |
2584 if (protocol_version() > SPDY3) { | 2583 if (protocol_version() > SPDY3) { |
2585 expected_length += goaway.description().size(); | 2584 expected_length += goaway.description().size(); |
2586 } | 2585 } |
2587 SpdyFrameBuilder builder(expected_length, protocol_version()); | 2586 SpdyFrameBuilder builder(expected_length, protocol_version()); |
2588 | 2587 |
2589 // Serialize the GOAWAY frame. | 2588 // Serialize the GOAWAY frame. |
2590 if (protocol_version() <= SPDY3) { | 2589 if (protocol_version() <= SPDY3) { |
2591 builder.WriteControlFrameHeader(*this, GOAWAY, kNoFlags); | 2590 builder.WriteControlFrameHeader(*this, GOAWAY, kNoFlags); |
2592 } else { | 2591 } else { |
2593 builder.BeginNewFrame(*this, GOAWAY, 0, 0); | 2592 builder.BeginNewFrame(*this, GOAWAY, 0, 0); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2632 | 2631 |
2633 // The size of this frame, including padding (if there is any) | 2632 // The size of this frame, including padding (if there is any) |
2634 // and variable-length name-value block. | 2633 // and variable-length name-value block. |
2635 size_t size = GetHeadersMinimumSize(); | 2634 size_t size = GetHeadersMinimumSize(); |
2636 | 2635 |
2637 if (protocol_version() > SPDY3 && headers.padded()) { | 2636 if (protocol_version() > SPDY3 && headers.padded()) { |
2638 size += kPadLengthFieldSize; | 2637 size += kPadLengthFieldSize; |
2639 size += headers.padding_payload_len(); | 2638 size += headers.padding_payload_len(); |
2640 } | 2639 } |
2641 | 2640 |
2642 uint32 priority = headers.priority(); | 2641 SpdyPriority priority = static_cast<SpdyPriority>(headers.priority()); |
2643 if (headers.has_priority()) { | 2642 if (headers.has_priority()) { |
2644 if (priority > GetLowestPriority()) { | 2643 if (headers.priority() > GetLowestPriority()) { |
2645 DLOG(DFATAL) << "Priority out-of-bounds."; | 2644 DLOG(DFATAL) << "Priority out-of-bounds."; |
2646 priority = GetLowestPriority(); | 2645 priority = GetLowestPriority(); |
2647 } | 2646 } |
2648 size += 5; | 2647 size += 5; |
2649 } | 2648 } |
2650 | 2649 |
2651 string hpack_encoding; | 2650 string hpack_encoding; |
2652 if (protocol_version() > SPDY3) { | 2651 if (protocol_version() > SPDY3) { |
2653 if (enable_compression_) { | 2652 if (enable_compression_) { |
2654 GetHpackEncoder()->EncodeHeaderSet( | 2653 GetHpackEncoder()->EncodeHeaderSet( |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2847 SpdyFrame* SpdyFramer::SerializeAltSvc(const SpdyAltSvcIR& altsvc) { | 2846 SpdyFrame* SpdyFramer::SerializeAltSvc(const SpdyAltSvcIR& altsvc) { |
2848 DCHECK_LT(SPDY3, protocol_version()); | 2847 DCHECK_LT(SPDY3, protocol_version()); |
2849 size_t size = GetAltSvcMinimumSize(); | 2848 size_t size = GetAltSvcMinimumSize(); |
2850 size += altsvc.protocol_id().length(); | 2849 size += altsvc.protocol_id().length(); |
2851 size += altsvc.host().length(); | 2850 size += altsvc.host().length(); |
2852 size += altsvc.origin().length(); | 2851 size += altsvc.origin().length(); |
2853 | 2852 |
2854 SpdyFrameBuilder builder(size, protocol_version()); | 2853 SpdyFrameBuilder builder(size, protocol_version()); |
2855 builder.BeginNewFrame(*this, ALTSVC, kNoFlags, altsvc.stream_id()); | 2854 builder.BeginNewFrame(*this, ALTSVC, kNoFlags, altsvc.stream_id()); |
2856 | 2855 |
| 2856 // TODO(bnc): http://crbug.com/438263 |
| 2857 // Update the binary format here to the new text-based payload format. |
2857 builder.WriteUInt32(altsvc.max_age()); | 2858 builder.WriteUInt32(altsvc.max_age()); |
2858 builder.WriteUInt16(altsvc.port()); | 2859 builder.WriteUInt16(altsvc.port()); |
2859 builder.WriteUInt8(0); // Reserved. | 2860 builder.WriteUInt8(0); // Reserved. |
2860 builder.WriteUInt8(altsvc.protocol_id().length()); | 2861 builder.WriteUInt8(static_cast<uint8>(altsvc.protocol_id().length())); |
2861 builder.WriteBytes(altsvc.protocol_id().data(), | 2862 builder.WriteBytes(altsvc.protocol_id().data(), |
2862 altsvc.protocol_id().length()); | 2863 altsvc.protocol_id().length()); |
2863 builder.WriteUInt8(altsvc.host().length()); | 2864 builder.WriteUInt8(static_cast<uint8>(altsvc.host().length())); |
2864 builder.WriteBytes(altsvc.host().data(), altsvc.host().length()); | 2865 builder.WriteBytes(altsvc.host().data(), altsvc.host().length()); |
2865 builder.WriteBytes(altsvc.origin().data(), altsvc.origin().length()); | 2866 builder.WriteBytes(altsvc.origin().data(), altsvc.origin().length()); |
2866 DCHECK_LT(GetAltSvcMinimumSize(), builder.length()); | 2867 DCHECK_LT(GetAltSvcMinimumSize(), builder.length()); |
2867 return builder.take(); | 2868 return builder.take(); |
2868 } | 2869 } |
2869 | 2870 |
2870 SpdyFrame* SpdyFramer::SerializePriority(const SpdyPriorityIR& priority) { | 2871 SpdyFrame* SpdyFramer::SerializePriority(const SpdyPriorityIR& priority) { |
2871 DCHECK_LT(SPDY3, protocol_version()); | 2872 DCHECK_LT(SPDY3, protocol_version()); |
2872 size_t size = GetPrioritySize(); | 2873 size_t size = GetPrioritySize(); |
2873 | 2874 |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3200 } | 3201 } |
3201 } | 3202 } |
3202 return read_successfully; | 3203 return read_successfully; |
3203 } | 3204 } |
3204 | 3205 |
3205 void SpdyFramer::SerializeNameValueBlockWithoutCompression( | 3206 void SpdyFramer::SerializeNameValueBlockWithoutCompression( |
3206 SpdyFrameBuilder* builder, | 3207 SpdyFrameBuilder* builder, |
3207 const SpdyNameValueBlock& name_value_block) const { | 3208 const SpdyNameValueBlock& name_value_block) const { |
3208 // Serialize number of headers. | 3209 // Serialize number of headers. |
3209 if (protocol_version() <= SPDY2) { | 3210 if (protocol_version() <= SPDY2) { |
3210 builder->WriteUInt16(name_value_block.size()); | 3211 builder->WriteUInt16(static_cast<uint16>(name_value_block.size())); |
3211 } else { | 3212 } else { |
3212 builder->WriteUInt32(name_value_block.size()); | 3213 builder->WriteUInt32(name_value_block.size()); |
3213 } | 3214 } |
3214 | 3215 |
3215 // Serialize each header. | 3216 // Serialize each header. |
3216 for (SpdyHeaderBlock::const_iterator it = name_value_block.begin(); | 3217 for (SpdyHeaderBlock::const_iterator it = name_value_block.begin(); |
3217 it != name_value_block.end(); | 3218 it != name_value_block.end(); |
3218 ++it) { | 3219 ++it) { |
3219 if (protocol_version() <= SPDY2) { | 3220 if (protocol_version() <= SPDY2) { |
3220 builder->WriteString(it->first); | 3221 builder->WriteString(it->first); |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3290 builder->Seek(compressed_size); | 3291 builder->Seek(compressed_size); |
3291 builder->RewriteLength(*this); | 3292 builder->RewriteLength(*this); |
3292 | 3293 |
3293 pre_compress_bytes.Add(uncompressed_len); | 3294 pre_compress_bytes.Add(uncompressed_len); |
3294 post_compress_bytes.Add(compressed_size); | 3295 post_compress_bytes.Add(compressed_size); |
3295 | 3296 |
3296 compressed_frames.Increment(); | 3297 compressed_frames.Increment(); |
3297 } | 3298 } |
3298 | 3299 |
3299 } // namespace net | 3300 } // namespace net |
OLD | NEW |