| 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 <iterator> | 10 #include <iterator> |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 if (!(cookie[value_start] == ' ' || cookie[value_start] == '\t')) { | 54 if (!(cookie[value_start] == ' ' || cookie[value_start] == '\t')) { |
| 55 break; | 55 break; |
| 56 } | 56 } |
| 57 } | 57 } |
| 58 return (pos == 0) && ((cookie.size() - value_start) == 0); | 58 return (pos == 0) && ((cookie.size() - value_start) == 0); |
| 59 } | 59 } |
| 60 #endif // !defined(USE_SYSTEM_ZLIB) | 60 #endif // !defined(USE_SYSTEM_ZLIB) |
| 61 | 61 |
| 62 // Pack parent stream ID and exclusive flag into the format used by HTTP/2 | 62 // Pack parent stream ID and exclusive flag into the format used by HTTP/2 |
| 63 // headers and priority frames. | 63 // headers and priority frames. |
| 64 uint32 PackStreamDependencyValues(bool exclusive, | 64 uint32_t PackStreamDependencyValues(bool exclusive, |
| 65 SpdyStreamId parent_stream_id) { | 65 SpdyStreamId parent_stream_id) { |
| 66 // Make sure the highest-order bit in the parent stream id is zeroed out. | 66 // Make sure the highest-order bit in the parent stream id is zeroed out. |
| 67 uint32 parent = parent_stream_id & 0x7fffffff; | 67 uint32_t parent = parent_stream_id & 0x7fffffff; |
| 68 // Set the one-bit exclusivity flag. | 68 // Set the one-bit exclusivity flag. |
| 69 uint32 e_bit = exclusive ? 0x80000000 : 0; | 69 uint32_t e_bit = exclusive ? 0x80000000 : 0; |
| 70 return parent | e_bit; | 70 return parent | e_bit; |
| 71 } | 71 } |
| 72 | 72 |
| 73 // Unpack parent stream ID and exclusive flag from the format used by HTTP/2 | 73 // Unpack parent stream ID and exclusive flag from the format used by HTTP/2 |
| 74 // headers and priority frames. | 74 // headers and priority frames. |
| 75 void UnpackStreamDependencyValues(uint32 packed, | 75 void UnpackStreamDependencyValues(uint32_t packed, |
| 76 bool* exclusive, | 76 bool* exclusive, |
| 77 SpdyStreamId* parent_stream_id) { | 77 SpdyStreamId* parent_stream_id) { |
| 78 *exclusive = (packed >> 31) != 0; | 78 *exclusive = (packed >> 31) != 0; |
| 79 // Zero out the highest-order bit to get the parent stream id. | 79 // Zero out the highest-order bit to get the parent stream id. |
| 80 *parent_stream_id = packed & 0x7fffffff; | 80 *parent_stream_id = packed & 0x7fffffff; |
| 81 } | 81 } |
| 82 | 82 |
| 83 struct DictionaryIds { | 83 struct DictionaryIds { |
| 84 DictionaryIds() | 84 DictionaryIds() |
| 85 : v2_dictionary_id(CalculateDictionaryId(kV2Dictionary, kV2DictionarySize)), | 85 : v2_dictionary_id(CalculateDictionaryId(kV2Dictionary, kV2DictionarySize)), |
| 86 v3_dictionary_id(CalculateDictionaryId(kV3Dictionary, kV3DictionarySize)) | 86 v3_dictionary_id(CalculateDictionaryId(kV3Dictionary, kV3DictionarySize)) |
| 87 {} | 87 {} |
| 88 const uLong v2_dictionary_id; | 88 const uLong v2_dictionary_id; |
| 89 const uLong v3_dictionary_id; | 89 const uLong v3_dictionary_id; |
| 90 }; | 90 }; |
| 91 | 91 |
| 92 // Adler ID for the SPDY header compressor dictionaries. Note that they are | 92 // Adler ID for the SPDY header compressor dictionaries. Note that they are |
| 93 // initialized lazily to avoid static initializers. | 93 // initialized lazily to avoid static initializers. |
| 94 base::LazyInstance<DictionaryIds>::Leaky g_dictionary_ids; | 94 base::LazyInstance<DictionaryIds>::Leaky g_dictionary_ids; |
| 95 | 95 |
| 96 // Used to indicate no flags in a SPDY flags field. | 96 // Used to indicate no flags in a SPDY flags field. |
| 97 const uint8 kNoFlags = 0; | 97 const uint8_t kNoFlags = 0; |
| 98 | 98 |
| 99 // Wire sizes of priority payloads. | 99 // Wire sizes of priority payloads. |
| 100 const size_t kPriorityDependencyPayloadSize = 4; | 100 const size_t kPriorityDependencyPayloadSize = 4; |
| 101 const size_t kPriorityWeightPayloadSize = 1; | 101 const size_t kPriorityWeightPayloadSize = 1; |
| 102 | 102 |
| 103 // Wire size of pad length field. | 103 // Wire size of pad length field. |
| 104 const size_t kPadLengthFieldSize = 1; | 104 const size_t kPadLengthFieldSize = 1; |
| 105 | 105 |
| 106 } // namespace | 106 } // namespace |
| 107 | 107 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 128 #else | 128 #else |
| 129 #define CHANGE_STATE(newstate) \ | 129 #define CHANGE_STATE(newstate) \ |
| 130 do { \ | 130 do { \ |
| 131 DCHECK(state_ != SPDY_ERROR); \ | 131 DCHECK(state_ != SPDY_ERROR); \ |
| 132 DCHECK_EQ(previous_state_, state_); \ | 132 DCHECK_EQ(previous_state_, state_); \ |
| 133 previous_state_ = state_; \ | 133 previous_state_ = state_; \ |
| 134 state_ = newstate; \ | 134 state_ = newstate; \ |
| 135 } while (false) | 135 } while (false) |
| 136 #endif | 136 #endif |
| 137 | 137 |
| 138 SettingsFlagsAndId SettingsFlagsAndId::FromWireFormat( | 138 SettingsFlagsAndId SettingsFlagsAndId::FromWireFormat(SpdyMajorVersion version, |
| 139 SpdyMajorVersion version, uint32 wire) { | 139 uint32_t wire) { |
| 140 if (version < SPDY3) { | 140 if (version < SPDY3) { |
| 141 ConvertFlagsAndIdForSpdy2(&wire); | 141 ConvertFlagsAndIdForSpdy2(&wire); |
| 142 } | 142 } |
| 143 return SettingsFlagsAndId(base::NetToHost32(wire) >> 24, | 143 return SettingsFlagsAndId(base::NetToHost32(wire) >> 24, |
| 144 base::NetToHost32(wire) & 0x00ffffff); | 144 base::NetToHost32(wire) & 0x00ffffff); |
| 145 } | 145 } |
| 146 | 146 |
| 147 SettingsFlagsAndId::SettingsFlagsAndId(uint8 flags, uint32 id) | 147 SettingsFlagsAndId::SettingsFlagsAndId(uint8_t flags, uint32_t id) |
| 148 : flags_(flags), id_(id & 0x00ffffff) { | 148 : flags_(flags), id_(id & 0x00ffffff) { |
| 149 LOG_IF(DFATAL, id > (1u << 24)) << "SPDY setting ID too large: " << id; | 149 LOG_IF(DFATAL, id > (1u << 24)) << "SPDY setting ID too large: " << id; |
| 150 } | 150 } |
| 151 | 151 |
| 152 uint32 SettingsFlagsAndId::GetWireFormat(SpdyMajorVersion version) | 152 uint32_t SettingsFlagsAndId::GetWireFormat(SpdyMajorVersion version) const { |
| 153 const { | 153 uint32_t wire = |
| 154 uint32 wire = | |
| 155 base::HostToNet32(id_ & 0x00ffffff) | base::HostToNet32(flags_ << 24); | 154 base::HostToNet32(id_ & 0x00ffffff) | base::HostToNet32(flags_ << 24); |
| 156 if (version < SPDY3) { | 155 if (version < SPDY3) { |
| 157 ConvertFlagsAndIdForSpdy2(&wire); | 156 ConvertFlagsAndIdForSpdy2(&wire); |
| 158 } | 157 } |
| 159 return wire; | 158 return wire; |
| 160 } | 159 } |
| 161 | 160 |
| 162 // SPDY 2 had a bug in it with respect to byte ordering of id/flags field. | 161 // SPDY 2 had a bug in it with respect to byte ordering of id/flags field. |
| 163 // This method is used to preserve buggy behavior and works on both | 162 // This method is used to preserve buggy behavior and works on both |
| 164 // little-endian and big-endian hosts. | 163 // little-endian and big-endian hosts. |
| 165 // This method is also bidirectional (can be used to translate SPDY 2 to SPDY 3 | 164 // This method is also bidirectional (can be used to translate SPDY 2 to SPDY 3 |
| 166 // as well as vice versa). | 165 // as well as vice versa). |
| 167 void SettingsFlagsAndId::ConvertFlagsAndIdForSpdy2(uint32* val) { | 166 void SettingsFlagsAndId::ConvertFlagsAndIdForSpdy2(uint32_t* val) { |
| 168 uint8* wire_array = reinterpret_cast<uint8*>(val); | 167 uint8_t* wire_array = reinterpret_cast<uint8_t*>(val); |
| 169 std::swap(wire_array[0], wire_array[3]); | 168 std::swap(wire_array[0], wire_array[3]); |
| 170 std::swap(wire_array[1], wire_array[2]); | 169 std::swap(wire_array[1], wire_array[2]); |
| 171 } | 170 } |
| 172 | 171 |
| 173 bool SpdyFramerVisitorInterface::OnGoAwayFrameData(const char* goaway_data, | 172 bool SpdyFramerVisitorInterface::OnGoAwayFrameData(const char* goaway_data, |
| 174 size_t len) { | 173 size_t len) { |
| 175 return true; | 174 return true; |
| 176 } | 175 } |
| 177 | 176 |
| 178 bool SpdyFramerVisitorInterface::OnRstStreamFrameData( | 177 bool SpdyFramerVisitorInterface::OnRstStreamFrameData( |
| (...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 736 SpdyFrameReader reader(current_frame_buffer_.data(), | 735 SpdyFrameReader reader(current_frame_buffer_.data(), |
| 737 current_frame_buffer_.len()); | 736 current_frame_buffer_.len()); |
| 738 bool is_control_frame = false; | 737 bool is_control_frame = false; |
| 739 | 738 |
| 740 int control_frame_type_field = | 739 int control_frame_type_field = |
| 741 SpdyConstants::DataFrameType(protocol_version()); | 740 SpdyConstants::DataFrameType(protocol_version()); |
| 742 // ProcessControlFrameHeader() will set current_frame_type_ to the | 741 // ProcessControlFrameHeader() will set current_frame_type_ to the |
| 743 // correct value if this is a valid control frame. | 742 // correct value if this is a valid control frame. |
| 744 current_frame_type_ = DATA; | 743 current_frame_type_ = DATA; |
| 745 if (protocol_version() <= SPDY3) { | 744 if (protocol_version() <= SPDY3) { |
| 746 uint16 version = 0; | 745 uint16_t version = 0; |
| 747 bool successful_read = reader.ReadUInt16(&version); | 746 bool successful_read = reader.ReadUInt16(&version); |
| 748 DCHECK(successful_read); | 747 DCHECK(successful_read); |
| 749 is_control_frame = (version & kControlFlagMask) != 0; | 748 is_control_frame = (version & kControlFlagMask) != 0; |
| 750 version &= ~kControlFlagMask; // Only valid for control frames. | 749 version &= ~kControlFlagMask; // Only valid for control frames. |
| 751 if (is_control_frame) { | 750 if (is_control_frame) { |
| 752 // We check version before we check validity: version can never be | 751 // We check version before we check validity: version can never be |
| 753 // 'invalid', it can only be unsupported. | 752 // 'invalid', it can only be unsupported. |
| 754 if (version < SpdyConstants::SerializeMajorVersion(SPDY_MIN_VERSION) || | 753 if (version < SpdyConstants::SerializeMajorVersion(SPDY_MIN_VERSION) || |
| 755 version > SpdyConstants::SerializeMajorVersion(SPDY_MAX_VERSION) || | 754 version > SpdyConstants::SerializeMajorVersion(SPDY_MAX_VERSION) || |
| 756 SpdyConstants::ParseMajorVersion(version) != protocol_version()) { | 755 SpdyConstants::ParseMajorVersion(version) != protocol_version()) { |
| 757 // Version does not match the version the framer was initialized with. | 756 // Version does not match the version the framer was initialized with. |
| 758 DVLOG(1) << "Unsupported SPDY version " | 757 DVLOG(1) << "Unsupported SPDY version " |
| 759 << version | 758 << version |
| 760 << " (expected " << protocol_version() << ")"; | 759 << " (expected " << protocol_version() << ")"; |
| 761 set_error(SPDY_UNSUPPORTED_VERSION); | 760 set_error(SPDY_UNSUPPORTED_VERSION); |
| 762 return 0; | 761 return 0; |
| 763 } | 762 } |
| 764 // We check control_frame_type_field's validity in | 763 // We check control_frame_type_field's validity in |
| 765 // ProcessControlFrameHeader(). | 764 // ProcessControlFrameHeader(). |
| 766 uint16 control_frame_type_field_uint16; | 765 uint16_t control_frame_type_field_uint16; |
| 767 successful_read = reader.ReadUInt16(&control_frame_type_field_uint16); | 766 successful_read = reader.ReadUInt16(&control_frame_type_field_uint16); |
| 768 control_frame_type_field = control_frame_type_field_uint16; | 767 control_frame_type_field = control_frame_type_field_uint16; |
| 769 } else { | 768 } else { |
| 770 reader.Rewind(); | 769 reader.Rewind(); |
| 771 successful_read = reader.ReadUInt31(¤t_frame_stream_id_); | 770 successful_read = reader.ReadUInt31(¤t_frame_stream_id_); |
| 772 } | 771 } |
| 773 DCHECK(successful_read); | 772 DCHECK(successful_read); |
| 774 | 773 |
| 775 successful_read = reader.ReadUInt8(¤t_frame_flags_); | 774 successful_read = reader.ReadUInt8(¤t_frame_flags_); |
| 776 DCHECK(successful_read); | 775 DCHECK(successful_read); |
| 777 | 776 |
| 778 uint32 length_field = 0; | 777 uint32_t length_field = 0; |
| 779 successful_read = reader.ReadUInt24(&length_field); | 778 successful_read = reader.ReadUInt24(&length_field); |
| 780 DCHECK(successful_read); | 779 DCHECK(successful_read); |
| 781 remaining_data_length_ = length_field; | 780 remaining_data_length_ = length_field; |
| 782 current_frame_length_ = remaining_data_length_ + reader.GetBytesConsumed(); | 781 current_frame_length_ = remaining_data_length_ + reader.GetBytesConsumed(); |
| 783 } else { | 782 } else { |
| 784 uint32 length_field = 0; | 783 uint32_t length_field = 0; |
| 785 bool successful_read = reader.ReadUInt24(&length_field); | 784 bool successful_read = reader.ReadUInt24(&length_field); |
| 786 DCHECK(successful_read); | 785 DCHECK(successful_read); |
| 787 | 786 |
| 788 uint8 control_frame_type_field_uint8; | 787 uint8_t control_frame_type_field_uint8; |
| 789 successful_read = reader.ReadUInt8(&control_frame_type_field_uint8); | 788 successful_read = reader.ReadUInt8(&control_frame_type_field_uint8); |
| 790 DCHECK(successful_read); | 789 DCHECK(successful_read); |
| 791 // We check control_frame_type_field's validity in | 790 // We check control_frame_type_field's validity in |
| 792 // ProcessControlFrameHeader(). | 791 // ProcessControlFrameHeader(). |
| 793 control_frame_type_field = control_frame_type_field_uint8; | 792 control_frame_type_field = control_frame_type_field_uint8; |
| 794 is_control_frame = control_frame_type_field != | 793 is_control_frame = control_frame_type_field != |
| 795 SpdyConstants::SerializeFrameType(protocol_version(), DATA); | 794 SpdyConstants::SerializeFrameType(protocol_version(), DATA); |
| 796 | 795 |
| 797 if (is_control_frame) { | 796 if (is_control_frame) { |
| 798 current_frame_length_ = length_field + GetControlFrameHeaderSize(); | 797 current_frame_length_ = length_field + GetControlFrameHeaderSize(); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 846 } | 845 } |
| 847 | 846 |
| 848 // if we're here, then we have the common header all received. | 847 // if we're here, then we have the common header all received. |
| 849 if (!is_control_frame) { | 848 if (!is_control_frame) { |
| 850 if (protocol_version() > SPDY3) { | 849 if (protocol_version() > SPDY3) { |
| 851 // Catch bogus tests sending oversized DATA frames. | 850 // Catch bogus tests sending oversized DATA frames. |
| 852 DCHECK_GE(GetFrameMaximumSize(), current_frame_length_) | 851 DCHECK_GE(GetFrameMaximumSize(), current_frame_length_) |
| 853 << "DATA frame too large for SPDY >= 4."; | 852 << "DATA frame too large for SPDY >= 4."; |
| 854 } | 853 } |
| 855 | 854 |
| 856 uint8 valid_data_flags = 0; | 855 uint8_t valid_data_flags = 0; |
| 857 if (protocol_version() > SPDY3) { | 856 if (protocol_version() > SPDY3) { |
| 858 valid_data_flags = | 857 valid_data_flags = |
| 859 DATA_FLAG_FIN | DATA_FLAG_END_SEGMENT | DATA_FLAG_PADDED; | 858 DATA_FLAG_FIN | DATA_FLAG_END_SEGMENT | DATA_FLAG_PADDED; |
| 860 } else { | 859 } else { |
| 861 valid_data_flags = DATA_FLAG_FIN; | 860 valid_data_flags = DATA_FLAG_FIN; |
| 862 } | 861 } |
| 863 | 862 |
| 864 if (current_frame_flags_ & ~valid_data_flags) { | 863 if (current_frame_flags_ & ~valid_data_flags) { |
| 865 set_error(SPDY_INVALID_DATA_FRAME_FLAGS); | 864 set_error(SPDY_INVALID_DATA_FRAME_FLAGS); |
| 866 } else { | 865 } else { |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1109 if (current_frame_type_ == RST_STREAM) { | 1108 if (current_frame_type_ == RST_STREAM) { |
| 1110 CHANGE_STATE(SPDY_RST_STREAM_FRAME_PAYLOAD); | 1109 CHANGE_STATE(SPDY_RST_STREAM_FRAME_PAYLOAD); |
| 1111 return; | 1110 return; |
| 1112 } | 1111 } |
| 1113 | 1112 |
| 1114 if (current_frame_type_ == ALTSVC) { | 1113 if (current_frame_type_ == ALTSVC) { |
| 1115 CHANGE_STATE(SPDY_ALTSVC_FRAME_PAYLOAD); | 1114 CHANGE_STATE(SPDY_ALTSVC_FRAME_PAYLOAD); |
| 1116 return; | 1115 return; |
| 1117 } | 1116 } |
| 1118 // Determine the frame size without variable-length data. | 1117 // Determine the frame size without variable-length data. |
| 1119 int32 frame_size_without_variable_data; | 1118 int32_t frame_size_without_variable_data; |
| 1120 switch (current_frame_type_) { | 1119 switch (current_frame_type_) { |
| 1121 case SYN_STREAM: | 1120 case SYN_STREAM: |
| 1122 syn_frame_processed_ = true; | 1121 syn_frame_processed_ = true; |
| 1123 frame_size_without_variable_data = GetSynStreamMinimumSize(); | 1122 frame_size_without_variable_data = GetSynStreamMinimumSize(); |
| 1124 break; | 1123 break; |
| 1125 case SYN_REPLY: | 1124 case SYN_REPLY: |
| 1126 syn_frame_processed_ = true; | 1125 syn_frame_processed_ = true; |
| 1127 frame_size_without_variable_data = GetSynReplyMinimumSize(); | 1126 frame_size_without_variable_data = GetSynReplyMinimumSize(); |
| 1128 break; | 1127 break; |
| 1129 case SETTINGS: | 1128 case SETTINGS: |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1167 set_error(SPDY_CONTROL_PAYLOAD_TOO_LARGE); | 1166 set_error(SPDY_CONTROL_PAYLOAD_TOO_LARGE); |
| 1168 } | 1167 } |
| 1169 return; | 1168 return; |
| 1170 } | 1169 } |
| 1171 | 1170 |
| 1172 if (frame_size_without_variable_data > 0) { | 1171 if (frame_size_without_variable_data > 0) { |
| 1173 // We have a control frame with a header block. We need to parse the | 1172 // We have a control frame with a header block. We need to parse the |
| 1174 // remainder of the control frame's header before we can parse the header | 1173 // remainder of the control frame's header before we can parse the header |
| 1175 // block. The start of the header block varies with the control type. | 1174 // block. The start of the header block varies with the control type. |
| 1176 DCHECK_GE(frame_size_without_variable_data, | 1175 DCHECK_GE(frame_size_without_variable_data, |
| 1177 static_cast<int32>(current_frame_buffer_.len())); | 1176 static_cast<int32_t>(current_frame_buffer_.len())); |
| 1178 remaining_control_header_ = | 1177 remaining_control_header_ = |
| 1179 frame_size_without_variable_data - current_frame_buffer_.len(); | 1178 frame_size_without_variable_data - current_frame_buffer_.len(); |
| 1180 | 1179 |
| 1181 CHANGE_STATE(SPDY_CONTROL_FRAME_BEFORE_HEADER_BLOCK); | 1180 CHANGE_STATE(SPDY_CONTROL_FRAME_BEFORE_HEADER_BLOCK); |
| 1182 return; | 1181 return; |
| 1183 } | 1182 } |
| 1184 | 1183 |
| 1185 CHANGE_STATE(SPDY_CONTROL_FRAME_PAYLOAD); | 1184 CHANGE_STATE(SPDY_CONTROL_FRAME_PAYLOAD); |
| 1186 } | 1185 } |
| 1187 | 1186 |
| 1188 size_t SpdyFramer::UpdateCurrentFrameBuffer(const char** data, size_t* len, | 1187 size_t SpdyFramer::UpdateCurrentFrameBuffer(const char** data, size_t* len, |
| 1189 size_t max_bytes) { | 1188 size_t max_bytes) { |
| 1190 size_t bytes_to_read = std::min(*len, max_bytes); | 1189 size_t bytes_to_read = std::min(*len, max_bytes); |
| 1191 if (bytes_to_read > 0) { | 1190 if (bytes_to_read > 0) { |
| 1192 current_frame_buffer_.CopyFrom(*data, bytes_to_read); | 1191 current_frame_buffer_.CopyFrom(*data, bytes_to_read); |
| 1193 *data += bytes_to_read; | 1192 *data += bytes_to_read; |
| 1194 *len -= bytes_to_read; | 1193 *len -= bytes_to_read; |
| 1195 } | 1194 } |
| 1196 return bytes_to_read; | 1195 return bytes_to_read; |
| 1197 } | 1196 } |
| 1198 | 1197 |
| 1199 size_t SpdyFramer::GetSerializedLength( | 1198 size_t SpdyFramer::GetSerializedLength( |
| 1200 const SpdyMajorVersion spdy_version, | 1199 const SpdyMajorVersion spdy_version, |
| 1201 const SpdyHeaderBlock* headers) { | 1200 const SpdyHeaderBlock* headers) { |
| 1202 const size_t num_name_value_pairs_size | 1201 const size_t num_name_value_pairs_size = |
| 1203 = (spdy_version < SPDY3) ? sizeof(uint16) : sizeof(uint32); | 1202 (spdy_version < SPDY3) ? sizeof(uint16_t) : sizeof(uint32_t); |
| 1204 const size_t length_of_name_size = num_name_value_pairs_size; | 1203 const size_t length_of_name_size = num_name_value_pairs_size; |
| 1205 const size_t length_of_value_size = num_name_value_pairs_size; | 1204 const size_t length_of_value_size = num_name_value_pairs_size; |
| 1206 | 1205 |
| 1207 size_t total_length = num_name_value_pairs_size; | 1206 size_t total_length = num_name_value_pairs_size; |
| 1208 for (const auto& header : *headers) { | 1207 for (const auto& header : *headers) { |
| 1209 // We add space for the length of the name and the length of the value as | 1208 // We add space for the length of the name and the length of the value as |
| 1210 // well as the length of the name and the length of the value. | 1209 // well as the length of the name and the length of the value. |
| 1211 total_length += length_of_name_size + header.first.size() + | 1210 total_length += length_of_name_size + header.first.size() + |
| 1212 length_of_value_size + header.second.size(); | 1211 length_of_value_size + header.second.size(); |
| 1213 } | 1212 } |
| 1214 return total_length; | 1213 return total_length; |
| 1215 } | 1214 } |
| 1216 | 1215 |
| 1217 void SpdyFramer::WriteHeaderBlock(SpdyFrameBuilder* frame, | 1216 void SpdyFramer::WriteHeaderBlock(SpdyFrameBuilder* frame, |
| 1218 const SpdyMajorVersion spdy_version, | 1217 const SpdyMajorVersion spdy_version, |
| 1219 const SpdyHeaderBlock* headers) { | 1218 const SpdyHeaderBlock* headers) { |
| 1220 if (spdy_version < SPDY3) { | 1219 if (spdy_version < SPDY3) { |
| 1221 frame->WriteUInt16(static_cast<uint16>(headers->size())); | 1220 frame->WriteUInt16(static_cast<uint16_t>(headers->size())); |
| 1222 } else { | 1221 } else { |
| 1223 frame->WriteUInt32(headers->size()); | 1222 frame->WriteUInt32(headers->size()); |
| 1224 } | 1223 } |
| 1225 SpdyHeaderBlock::const_iterator it; | 1224 SpdyHeaderBlock::const_iterator it; |
| 1226 for (it = headers->begin(); it != headers->end(); ++it) { | 1225 for (it = headers->begin(); it != headers->end(); ++it) { |
| 1227 if (spdy_version < SPDY3) { | 1226 if (spdy_version < SPDY3) { |
| 1228 frame->WriteStringPiece16(it->first); | 1227 frame->WriteStringPiece16(it->first); |
| 1229 frame->WriteStringPiece16(it->second); | 1228 frame->WriteStringPiece16(it->second); |
| 1230 } else { | 1229 } else { |
| 1231 frame->WriteStringPiece32(it->first); | 1230 frame->WriteStringPiece32(it->first); |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1501 reader.Seek(2); | 1500 reader.Seek(2); |
| 1502 } | 1501 } |
| 1503 if (protocol_version() > SPDY3 && | 1502 if (protocol_version() > SPDY3 && |
| 1504 !(current_frame_flags_ & HEADERS_FLAG_END_HEADERS) && | 1503 !(current_frame_flags_ & HEADERS_FLAG_END_HEADERS) && |
| 1505 current_frame_type_ == HEADERS) { | 1504 current_frame_type_ == HEADERS) { |
| 1506 expect_continuation_ = current_frame_stream_id_; | 1505 expect_continuation_ = current_frame_stream_id_; |
| 1507 end_stream_when_done_ = current_frame_flags_ & CONTROL_FLAG_FIN; | 1506 end_stream_when_done_ = current_frame_flags_ & CONTROL_FLAG_FIN; |
| 1508 } | 1507 } |
| 1509 if (protocol_version() > SPDY3 && | 1508 if (protocol_version() > SPDY3 && |
| 1510 current_frame_flags_ & HEADERS_FLAG_PADDED) { | 1509 current_frame_flags_ & HEADERS_FLAG_PADDED) { |
| 1511 uint8 pad_payload_len = 0; | 1510 uint8_t pad_payload_len = 0; |
| 1512 DCHECK_EQ(remaining_padding_payload_length_, 0u); | 1511 DCHECK_EQ(remaining_padding_payload_length_, 0u); |
| 1513 successful_read = reader.ReadUInt8(&pad_payload_len); | 1512 successful_read = reader.ReadUInt8(&pad_payload_len); |
| 1514 DCHECK(successful_read); | 1513 DCHECK(successful_read); |
| 1515 remaining_padding_payload_length_ = pad_payload_len; | 1514 remaining_padding_payload_length_ = pad_payload_len; |
| 1516 } | 1515 } |
| 1517 const bool has_priority = | 1516 const bool has_priority = |
| 1518 (current_frame_flags_ & HEADERS_FLAG_PRIORITY) != 0; | 1517 (current_frame_flags_ & HEADERS_FLAG_PRIORITY) != 0; |
| 1519 SpdyPriority priority = 0; | 1518 SpdyPriority priority = 0; |
| 1520 uint32 parent_stream_id = 0; | 1519 uint32_t parent_stream_id = 0; |
| 1521 bool exclusive = false; | 1520 bool exclusive = false; |
| 1522 if (protocol_version() > SPDY3 && has_priority) { | 1521 if (protocol_version() > SPDY3 && has_priority) { |
| 1523 uint32 stream_dependency; | 1522 uint32_t stream_dependency; |
| 1524 successful_read = reader.ReadUInt32(&stream_dependency); | 1523 successful_read = reader.ReadUInt32(&stream_dependency); |
| 1525 DCHECK(successful_read); | 1524 DCHECK(successful_read); |
| 1526 UnpackStreamDependencyValues(stream_dependency, &exclusive, | 1525 UnpackStreamDependencyValues(stream_dependency, &exclusive, |
| 1527 &parent_stream_id); | 1526 &parent_stream_id); |
| 1528 | 1527 |
| 1529 uint8 weight = 0; | 1528 uint8_t weight = 0; |
| 1530 successful_read = reader.ReadUInt8(&weight); | 1529 successful_read = reader.ReadUInt8(&weight); |
| 1531 if (successful_read) { | 1530 if (successful_read) { |
| 1532 priority = MapWeightToPriority(weight); | 1531 priority = MapWeightToPriority(weight); |
| 1533 } | 1532 } |
| 1534 } | 1533 } |
| 1535 DCHECK(reader.IsDoneReading()); | 1534 DCHECK(reader.IsDoneReading()); |
| 1536 if (debug_visitor_) { | 1535 if (debug_visitor_) { |
| 1537 debug_visitor_->OnReceiveCompressedFrame( | 1536 debug_visitor_->OnReceiveCompressedFrame( |
| 1538 current_frame_stream_id_, | 1537 current_frame_stream_id_, |
| 1539 current_frame_type_, | 1538 current_frame_type_, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1558 { | 1557 { |
| 1559 DCHECK_LT(SPDY3, protocol_version()); | 1558 DCHECK_LT(SPDY3, protocol_version()); |
| 1560 if (current_frame_stream_id_ == 0) { | 1559 if (current_frame_stream_id_ == 0) { |
| 1561 set_error(SPDY_INVALID_CONTROL_FRAME); | 1560 set_error(SPDY_INVALID_CONTROL_FRAME); |
| 1562 break; | 1561 break; |
| 1563 } | 1562 } |
| 1564 bool successful_read = true; | 1563 bool successful_read = true; |
| 1565 if (protocol_version() > SPDY3 && | 1564 if (protocol_version() > SPDY3 && |
| 1566 current_frame_flags_ & PUSH_PROMISE_FLAG_PADDED) { | 1565 current_frame_flags_ & PUSH_PROMISE_FLAG_PADDED) { |
| 1567 DCHECK_EQ(remaining_padding_payload_length_, 0u); | 1566 DCHECK_EQ(remaining_padding_payload_length_, 0u); |
| 1568 uint8 pad_payload_len = 0; | 1567 uint8_t pad_payload_len = 0; |
| 1569 successful_read = reader.ReadUInt8(&pad_payload_len); | 1568 successful_read = reader.ReadUInt8(&pad_payload_len); |
| 1570 DCHECK(successful_read); | 1569 DCHECK(successful_read); |
| 1571 remaining_padding_payload_length_ = pad_payload_len; | 1570 remaining_padding_payload_length_ = pad_payload_len; |
| 1572 } | 1571 } |
| 1573 } | 1572 } |
| 1574 { | 1573 { |
| 1575 SpdyStreamId promised_stream_id = kInvalidStream; | 1574 SpdyStreamId promised_stream_id = kInvalidStream; |
| 1576 bool successful_read = reader.ReadUInt31(&promised_stream_id); | 1575 bool successful_read = reader.ReadUInt31(&promised_stream_id); |
| 1577 DCHECK(successful_read); | 1576 DCHECK(successful_read); |
| 1578 DCHECK(reader.IsDoneReading()); | 1577 DCHECK(reader.IsDoneReading()); |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1786 | 1785 |
| 1787 ProcessControlFrameHeaderBlock(frame->data(), frame->size(), false); | 1786 ProcessControlFrameHeaderBlock(frame->data(), frame->size(), false); |
| 1788 | 1787 |
| 1789 remaining_padding_payload_length_ = remaining_padding; | 1788 remaining_padding_payload_length_ = remaining_padding; |
| 1790 remaining_data_length_ = remaining_padding; | 1789 remaining_data_length_ = remaining_padding; |
| 1791 } | 1790 } |
| 1792 | 1791 |
| 1793 bool SpdyFramer::ProcessSetting(const char* data) { | 1792 bool SpdyFramer::ProcessSetting(const char* data) { |
| 1794 int id_field; | 1793 int id_field; |
| 1795 SpdySettingsIds id; | 1794 SpdySettingsIds id; |
| 1796 uint8 flags = 0; | 1795 uint8_t flags = 0; |
| 1797 uint32 value; | 1796 uint32_t value; |
| 1798 | 1797 |
| 1799 // Extract fields. | 1798 // Extract fields. |
| 1800 // Maintain behavior of old SPDY 2 bug with byte ordering of flags/id. | 1799 // Maintain behavior of old SPDY 2 bug with byte ordering of flags/id. |
| 1801 if (protocol_version() <= SPDY3) { | 1800 if (protocol_version() <= SPDY3) { |
| 1802 const uint32 id_and_flags_wire = *(reinterpret_cast<const uint32*>(data)); | 1801 const uint32_t id_and_flags_wire = |
| 1802 *(reinterpret_cast<const uint32_t*>(data)); |
| 1803 SettingsFlagsAndId id_and_flags = | 1803 SettingsFlagsAndId id_and_flags = |
| 1804 SettingsFlagsAndId::FromWireFormat(protocol_version(), id_and_flags_wire); | 1804 SettingsFlagsAndId::FromWireFormat(protocol_version(), id_and_flags_wire); |
| 1805 id_field = id_and_flags.id(); | 1805 id_field = id_and_flags.id(); |
| 1806 flags = id_and_flags.flags(); | 1806 flags = id_and_flags.flags(); |
| 1807 value = base::NetToHost32(*(reinterpret_cast<const uint32*>(data + 4))); | 1807 value = base::NetToHost32(*(reinterpret_cast<const uint32_t*>(data + 4))); |
| 1808 } else { | 1808 } else { |
| 1809 id_field = base::NetToHost16(*(reinterpret_cast<const uint16*>(data))); | 1809 id_field = base::NetToHost16(*(reinterpret_cast<const uint16_t*>(data))); |
| 1810 value = base::NetToHost32(*(reinterpret_cast<const uint32*>(data + 2))); | 1810 value = base::NetToHost32(*(reinterpret_cast<const uint32_t*>(data + 2))); |
| 1811 } | 1811 } |
| 1812 | 1812 |
| 1813 // Validate id. | 1813 // Validate id. |
| 1814 if (!SpdyConstants::IsValidSettingId(protocol_version(), id_field)) { | 1814 if (!SpdyConstants::IsValidSettingId(protocol_version(), id_field)) { |
| 1815 DLOG(WARNING) << "Unknown SETTINGS ID: " << id_field; | 1815 DLOG(WARNING) << "Unknown SETTINGS ID: " << id_field; |
| 1816 if (protocol_version() <= SPDY3) { | 1816 if (protocol_version() <= SPDY3) { |
| 1817 return false; | 1817 return false; |
| 1818 } else { | 1818 } else { |
| 1819 // In HTTP2 we ignore unknown settings for extensibility. | 1819 // In HTTP2 we ignore unknown settings for extensibility. |
| 1820 return true; | 1820 return true; |
| 1821 } | 1821 } |
| 1822 } | 1822 } |
| 1823 id = SpdyConstants::ParseSettingId(protocol_version(), id_field); | 1823 id = SpdyConstants::ParseSettingId(protocol_version(), id_field); |
| 1824 | 1824 |
| 1825 if (protocol_version() <= SPDY3) { | 1825 if (protocol_version() <= SPDY3) { |
| 1826 // Detect duplicates. | 1826 // Detect duplicates. |
| 1827 if (id <= settings_scratch_.last_setting_id) { | 1827 if (id <= settings_scratch_.last_setting_id) { |
| 1828 DLOG(WARNING) << "Duplicate entry or invalid ordering for id " << id | 1828 DLOG(WARNING) << "Duplicate entry or invalid ordering for id " << id |
| 1829 << " in " << display_protocol_ << " SETTINGS frame " | 1829 << " in " << display_protocol_ << " SETTINGS frame " |
| 1830 << "(last setting id was " | 1830 << "(last setting id was " |
| 1831 << settings_scratch_.last_setting_id << ")."; | 1831 << settings_scratch_.last_setting_id << ")."; |
| 1832 return false; | 1832 return false; |
| 1833 } | 1833 } |
| 1834 settings_scratch_.last_setting_id = id; | 1834 settings_scratch_.last_setting_id = id; |
| 1835 | 1835 |
| 1836 // Validate flags. | 1836 // Validate flags. |
| 1837 uint8 kFlagsMask = SETTINGS_FLAG_PLEASE_PERSIST | SETTINGS_FLAG_PERSISTED; | 1837 uint8_t kFlagsMask = SETTINGS_FLAG_PLEASE_PERSIST | SETTINGS_FLAG_PERSISTED; |
| 1838 if ((flags & ~(kFlagsMask)) != 0) { | 1838 if ((flags & ~(kFlagsMask)) != 0) { |
| 1839 DLOG(WARNING) << "Unknown SETTINGS flags provided for id " << id << ": " | 1839 DLOG(WARNING) << "Unknown SETTINGS flags provided for id " << id << ": " |
| 1840 << flags; | 1840 << flags; |
| 1841 return false; | 1841 return false; |
| 1842 } | 1842 } |
| 1843 } | 1843 } |
| 1844 | 1844 |
| 1845 // Validation succeeded. Pass on to visitor. | 1845 // Validation succeeded. Pass on to visitor. |
| 1846 visitor_->OnSetting(id, flags, value); | 1846 visitor_->OnSetting(id, flags, value); |
| 1847 return true; | 1847 return true; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1858 reader.Seek(GetControlFrameHeaderSize()); // Skip frame header. | 1858 reader.Seek(GetControlFrameHeaderSize()); // Skip frame header. |
| 1859 | 1859 |
| 1860 // Use frame-specific handlers. | 1860 // Use frame-specific handlers. |
| 1861 switch (current_frame_type_) { | 1861 switch (current_frame_type_) { |
| 1862 case PING: { | 1862 case PING: { |
| 1863 SpdyPingId id = 0; | 1863 SpdyPingId id = 0; |
| 1864 bool is_ack = protocol_version() > SPDY3 && | 1864 bool is_ack = protocol_version() > SPDY3 && |
| 1865 (current_frame_flags_ & PING_FLAG_ACK); | 1865 (current_frame_flags_ & PING_FLAG_ACK); |
| 1866 bool successful_read = true; | 1866 bool successful_read = true; |
| 1867 if (protocol_version() <= SPDY3) { | 1867 if (protocol_version() <= SPDY3) { |
| 1868 uint32 id32 = 0; | 1868 uint32_t id32 = 0; |
| 1869 successful_read = reader.ReadUInt32(&id32); | 1869 successful_read = reader.ReadUInt32(&id32); |
| 1870 id = id32; | 1870 id = id32; |
| 1871 } else { | 1871 } else { |
| 1872 successful_read = reader.ReadUInt64(&id); | 1872 successful_read = reader.ReadUInt64(&id); |
| 1873 } | 1873 } |
| 1874 DCHECK(successful_read); | 1874 DCHECK(successful_read); |
| 1875 DCHECK(reader.IsDoneReading()); | 1875 DCHECK(reader.IsDoneReading()); |
| 1876 visitor_->OnPing(id, is_ack); | 1876 visitor_->OnPing(id, is_ack); |
| 1877 } | 1877 } |
| 1878 break; | 1878 break; |
| 1879 case WINDOW_UPDATE: { | 1879 case WINDOW_UPDATE: { |
| 1880 uint32 delta_window_size = 0; | 1880 uint32_t delta_window_size = 0; |
| 1881 bool successful_read = true; | 1881 bool successful_read = true; |
| 1882 if (protocol_version() <= SPDY3) { | 1882 if (protocol_version() <= SPDY3) { |
| 1883 successful_read = reader.ReadUInt31(¤t_frame_stream_id_); | 1883 successful_read = reader.ReadUInt31(¤t_frame_stream_id_); |
| 1884 DCHECK(successful_read); | 1884 DCHECK(successful_read); |
| 1885 } | 1885 } |
| 1886 successful_read = reader.ReadUInt32(&delta_window_size); | 1886 successful_read = reader.ReadUInt32(&delta_window_size); |
| 1887 DCHECK(successful_read); | 1887 DCHECK(successful_read); |
| 1888 DCHECK(reader.IsDoneReading()); | 1888 DCHECK(reader.IsDoneReading()); |
| 1889 visitor_->OnWindowUpdate(current_frame_stream_id_, | 1889 visitor_->OnWindowUpdate(current_frame_stream_id_, |
| 1890 delta_window_size); | 1890 delta_window_size); |
| 1891 } | 1891 } |
| 1892 break; | 1892 break; |
| 1893 case BLOCKED: { | 1893 case BLOCKED: { |
| 1894 DCHECK_LT(SPDY3, protocol_version()); | 1894 DCHECK_LT(SPDY3, protocol_version()); |
| 1895 DCHECK(reader.IsDoneReading()); | 1895 DCHECK(reader.IsDoneReading()); |
| 1896 visitor_->OnBlocked(current_frame_stream_id_); | 1896 visitor_->OnBlocked(current_frame_stream_id_); |
| 1897 } | 1897 } |
| 1898 break; | 1898 break; |
| 1899 case PRIORITY: { | 1899 case PRIORITY: { |
| 1900 DCHECK_LT(SPDY3, protocol_version()); | 1900 DCHECK_LT(SPDY3, protocol_version()); |
| 1901 uint32 stream_dependency; | 1901 uint32_t stream_dependency; |
| 1902 uint32 parent_stream_id; | 1902 uint32_t parent_stream_id; |
| 1903 bool exclusive; | 1903 bool exclusive; |
| 1904 uint8 weight; | 1904 uint8_t weight; |
| 1905 bool successful_read = reader.ReadUInt32(&stream_dependency); | 1905 bool successful_read = reader.ReadUInt32(&stream_dependency); |
| 1906 DCHECK(successful_read); | 1906 DCHECK(successful_read); |
| 1907 UnpackStreamDependencyValues(stream_dependency, &exclusive, | 1907 UnpackStreamDependencyValues(stream_dependency, &exclusive, |
| 1908 &parent_stream_id); | 1908 &parent_stream_id); |
| 1909 | 1909 |
| 1910 successful_read = reader.ReadUInt8(&weight); | 1910 successful_read = reader.ReadUInt8(&weight); |
| 1911 DCHECK(successful_read); | 1911 DCHECK(successful_read); |
| 1912 DCHECK(reader.IsDoneReading()); | 1912 DCHECK(reader.IsDoneReading()); |
| 1913 visitor_->OnPriority( | 1913 visitor_->OnPriority( |
| 1914 current_frame_stream_id_, parent_stream_id, weight, exclusive); | 1914 current_frame_stream_id_, parent_stream_id, weight, exclusive); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1947 // Parse out the last good stream id. | 1947 // Parse out the last good stream id. |
| 1948 SpdyFrameReader reader(current_frame_buffer_.data(), | 1948 SpdyFrameReader reader(current_frame_buffer_.data(), |
| 1949 current_frame_buffer_.len()); | 1949 current_frame_buffer_.len()); |
| 1950 reader.Seek(GetControlFrameHeaderSize()); // Seek past frame header. | 1950 reader.Seek(GetControlFrameHeaderSize()); // Seek past frame header. |
| 1951 bool successful_read = reader.ReadUInt31(¤t_frame_stream_id_); | 1951 bool successful_read = reader.ReadUInt31(¤t_frame_stream_id_); |
| 1952 DCHECK(successful_read); | 1952 DCHECK(successful_read); |
| 1953 | 1953 |
| 1954 // In SPDYv3 and up, frames also specify a status code - parse it out. | 1954 // In SPDYv3 and up, frames also specify a status code - parse it out. |
| 1955 SpdyGoAwayStatus status = GOAWAY_OK; | 1955 SpdyGoAwayStatus status = GOAWAY_OK; |
| 1956 if (protocol_version() >= SPDY3) { | 1956 if (protocol_version() >= SPDY3) { |
| 1957 uint32 status_raw = GOAWAY_OK; | 1957 uint32_t status_raw = GOAWAY_OK; |
| 1958 successful_read = reader.ReadUInt32(&status_raw); | 1958 successful_read = reader.ReadUInt32(&status_raw); |
| 1959 DCHECK(successful_read); | 1959 DCHECK(successful_read); |
| 1960 if (SpdyConstants::IsValidGoAwayStatus(protocol_version(), | 1960 if (SpdyConstants::IsValidGoAwayStatus(protocol_version(), |
| 1961 status_raw)) { | 1961 status_raw)) { |
| 1962 status = SpdyConstants::ParseGoAwayStatus(protocol_version(), | 1962 status = SpdyConstants::ParseGoAwayStatus(protocol_version(), |
| 1963 status_raw); | 1963 status_raw); |
| 1964 } else { | 1964 } else { |
| 1965 if (protocol_version() > SPDY3) { | 1965 if (protocol_version() > SPDY3) { |
| 1966 // Treat unrecognized status codes as INTERNAL_ERROR as | 1966 // Treat unrecognized status codes as INTERNAL_ERROR as |
| 1967 // recommended by the HTTP/2 spec. | 1967 // recommended by the HTTP/2 spec. |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2014 // Parse out the last good stream id. | 2014 // Parse out the last good stream id. |
| 2015 SpdyFrameReader reader(current_frame_buffer_.data(), | 2015 SpdyFrameReader reader(current_frame_buffer_.data(), |
| 2016 current_frame_buffer_.len()); | 2016 current_frame_buffer_.len()); |
| 2017 reader.Seek(GetControlFrameHeaderSize()); // Seek past frame header. | 2017 reader.Seek(GetControlFrameHeaderSize()); // Seek past frame header. |
| 2018 if (protocol_version() <= SPDY3) { | 2018 if (protocol_version() <= SPDY3) { |
| 2019 bool successful_read = reader.ReadUInt31(¤t_frame_stream_id_); | 2019 bool successful_read = reader.ReadUInt31(¤t_frame_stream_id_); |
| 2020 DCHECK(successful_read); | 2020 DCHECK(successful_read); |
| 2021 } | 2021 } |
| 2022 | 2022 |
| 2023 SpdyRstStreamStatus status = RST_STREAM_INVALID; | 2023 SpdyRstStreamStatus status = RST_STREAM_INVALID; |
| 2024 uint32 status_raw = status; | 2024 uint32_t status_raw = status; |
| 2025 bool successful_read = reader.ReadUInt32(&status_raw); | 2025 bool successful_read = reader.ReadUInt32(&status_raw); |
| 2026 DCHECK(successful_read); | 2026 DCHECK(successful_read); |
| 2027 if (SpdyConstants::IsValidRstStreamStatus(protocol_version(), | 2027 if (SpdyConstants::IsValidRstStreamStatus(protocol_version(), |
| 2028 status_raw)) { | 2028 status_raw)) { |
| 2029 status = | 2029 status = |
| 2030 SpdyConstants::ParseRstStreamStatus(protocol_version(), status_raw); | 2030 SpdyConstants::ParseRstStreamStatus(protocol_version(), status_raw); |
| 2031 } else { | 2031 } else { |
| 2032 if (protocol_version() > SPDY3) { | 2032 if (protocol_version() > SPDY3) { |
| 2033 // Treat unrecognized status codes as INTERNAL_ERROR as | 2033 // Treat unrecognized status codes as INTERNAL_ERROR as |
| 2034 // recommended by the HTTP/2 spec. | 2034 // recommended by the HTTP/2 spec. |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2105 size_t original_len = len; | 2105 size_t original_len = len; |
| 2106 if (current_frame_flags_ & DATA_FLAG_PADDED) { | 2106 if (current_frame_flags_ & DATA_FLAG_PADDED) { |
| 2107 if (len != 0) { | 2107 if (len != 0) { |
| 2108 if (remaining_data_length_ < kPadLengthFieldSize) { | 2108 if (remaining_data_length_ < kPadLengthFieldSize) { |
| 2109 set_error(SPDY_INVALID_DATA_FRAME_FLAGS); | 2109 set_error(SPDY_INVALID_DATA_FRAME_FLAGS); |
| 2110 return 0; | 2110 return 0; |
| 2111 } | 2111 } |
| 2112 | 2112 |
| 2113 static_assert(kPadLengthFieldSize == 1, | 2113 static_assert(kPadLengthFieldSize == 1, |
| 2114 "Unexpected pad length field size."); | 2114 "Unexpected pad length field size."); |
| 2115 remaining_padding_payload_length_ = *reinterpret_cast<const uint8*>(data); | 2115 remaining_padding_payload_length_ = |
| 2116 *reinterpret_cast<const uint8_t*>(data); |
| 2116 ++data; | 2117 ++data; |
| 2117 --len; | 2118 --len; |
| 2118 --remaining_data_length_; | 2119 --remaining_data_length_; |
| 2119 visitor_->OnStreamPadding(current_frame_stream_id_, kPadLengthFieldSize); | 2120 visitor_->OnStreamPadding(current_frame_stream_id_, kPadLengthFieldSize); |
| 2120 } else { | 2121 } else { |
| 2121 // We don't have the data available for parsing the pad length field. Keep | 2122 // We don't have the data available for parsing the pad length field. Keep |
| 2122 // waiting. | 2123 // waiting. |
| 2123 return 0; | 2124 return 0; |
| 2124 } | 2125 } |
| 2125 } | 2126 } |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2200 } | 2201 } |
| 2201 return original_len - len; | 2202 return original_len - len; |
| 2202 } | 2203 } |
| 2203 | 2204 |
| 2204 bool SpdyFramer::ParseHeaderBlockInBuffer(const char* header_data, | 2205 bool SpdyFramer::ParseHeaderBlockInBuffer(const char* header_data, |
| 2205 size_t header_length, | 2206 size_t header_length, |
| 2206 SpdyHeaderBlock* block) const { | 2207 SpdyHeaderBlock* block) const { |
| 2207 SpdyFrameReader reader(header_data, header_length); | 2208 SpdyFrameReader reader(header_data, header_length); |
| 2208 | 2209 |
| 2209 // Read number of headers. | 2210 // Read number of headers. |
| 2210 uint32 num_headers; | 2211 uint32_t num_headers; |
| 2211 if (protocol_version() <= SPDY2) { | 2212 if (protocol_version() <= SPDY2) { |
| 2212 uint16 temp; | 2213 uint16_t temp; |
| 2213 if (!reader.ReadUInt16(&temp)) { | 2214 if (!reader.ReadUInt16(&temp)) { |
| 2214 DVLOG(1) << "Unable to read number of headers."; | 2215 DVLOG(1) << "Unable to read number of headers."; |
| 2215 return false; | 2216 return false; |
| 2216 } | 2217 } |
| 2217 num_headers = temp; | 2218 num_headers = temp; |
| 2218 } else { | 2219 } else { |
| 2219 if (!reader.ReadUInt32(&num_headers)) { | 2220 if (!reader.ReadUInt32(&num_headers)) { |
| 2220 DVLOG(1) << "Unable to read number of headers."; | 2221 DVLOG(1) << "Unable to read number of headers."; |
| 2221 return false; | 2222 return false; |
| 2222 } | 2223 } |
| 2223 } | 2224 } |
| 2224 | 2225 |
| 2225 // Read each header. | 2226 // Read each header. |
| 2226 for (uint32 index = 0; index < num_headers; ++index) { | 2227 for (uint32_t index = 0; index < num_headers; ++index) { |
| 2227 base::StringPiece temp; | 2228 base::StringPiece temp; |
| 2228 | 2229 |
| 2229 // Read header name. | 2230 // Read header name. |
| 2230 if ((protocol_version() <= SPDY2) ? !reader.ReadStringPiece16(&temp) | 2231 if ((protocol_version() <= SPDY2) ? !reader.ReadStringPiece16(&temp) |
| 2231 : !reader.ReadStringPiece32(&temp)) { | 2232 : !reader.ReadStringPiece32(&temp)) { |
| 2232 DVLOG(1) << "Unable to read header name (" << index + 1 << " of " | 2233 DVLOG(1) << "Unable to read header name (" << index + 1 << " of " |
| 2233 << num_headers << ")."; | 2234 << num_headers << ")."; |
| 2234 return false; | 2235 return false; |
| 2235 } | 2236 } |
| 2236 std::string name = temp.as_string(); | 2237 std::string name = temp.as_string(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2259 << reader.GetBytesConsumed() << " bytes consumed, from " | 2260 << reader.GetBytesConsumed() << " bytes consumed, from " |
| 2260 << header_length; | 2261 << header_length; |
| 2261 return false; | 2262 return false; |
| 2262 } | 2263 } |
| 2263 | 2264 |
| 2264 return true; | 2265 return true; |
| 2265 } | 2266 } |
| 2266 | 2267 |
| 2267 SpdySerializedFrame* SpdyFramer::SerializeData( | 2268 SpdySerializedFrame* SpdyFramer::SerializeData( |
| 2268 const SpdyDataIR& data_ir) const { | 2269 const SpdyDataIR& data_ir) const { |
| 2269 uint8 flags = DATA_FLAG_NONE; | 2270 uint8_t flags = DATA_FLAG_NONE; |
| 2270 if (data_ir.fin()) { | 2271 if (data_ir.fin()) { |
| 2271 flags = DATA_FLAG_FIN; | 2272 flags = DATA_FLAG_FIN; |
| 2272 } | 2273 } |
| 2273 | 2274 |
| 2274 if (protocol_version() > SPDY3) { | 2275 if (protocol_version() > SPDY3) { |
| 2275 int num_padding_fields = 0; | 2276 int num_padding_fields = 0; |
| 2276 if (data_ir.padded()) { | 2277 if (data_ir.padded()) { |
| 2277 flags |= DATA_FLAG_PADDED; | 2278 flags |= DATA_FLAG_PADDED; |
| 2278 ++num_padding_fields; | 2279 ++num_padding_fields; |
| 2279 } | 2280 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2298 SpdyFrameBuilder builder(size, protocol_version()); | 2299 SpdyFrameBuilder builder(size, protocol_version()); |
| 2299 builder.WriteDataFrameHeader(*this, data_ir.stream_id(), flags); | 2300 builder.WriteDataFrameHeader(*this, data_ir.stream_id(), flags); |
| 2300 builder.WriteBytes(data_ir.data().data(), data_ir.data().length()); | 2301 builder.WriteBytes(data_ir.data().data(), data_ir.data().length()); |
| 2301 DCHECK_EQ(size, builder.length()); | 2302 DCHECK_EQ(size, builder.length()); |
| 2302 return builder.take(); | 2303 return builder.take(); |
| 2303 } | 2304 } |
| 2304 } | 2305 } |
| 2305 | 2306 |
| 2306 SpdySerializedFrame* SpdyFramer::SerializeDataFrameHeaderWithPaddingLengthField( | 2307 SpdySerializedFrame* SpdyFramer::SerializeDataFrameHeaderWithPaddingLengthField( |
| 2307 const SpdyDataIR& data_ir) const { | 2308 const SpdyDataIR& data_ir) const { |
| 2308 uint8 flags = DATA_FLAG_NONE; | 2309 uint8_t flags = DATA_FLAG_NONE; |
| 2309 if (data_ir.fin()) { | 2310 if (data_ir.fin()) { |
| 2310 flags = DATA_FLAG_FIN; | 2311 flags = DATA_FLAG_FIN; |
| 2311 } | 2312 } |
| 2312 | 2313 |
| 2313 size_t frame_size = GetDataFrameMinimumSize(); | 2314 size_t frame_size = GetDataFrameMinimumSize(); |
| 2314 size_t num_padding_fields = 0; | 2315 size_t num_padding_fields = 0; |
| 2315 if (protocol_version() > SPDY3) { | 2316 if (protocol_version() > SPDY3) { |
| 2316 if (data_ir.padded()) { | 2317 if (data_ir.padded()) { |
| 2317 flags |= DATA_FLAG_PADDED; | 2318 flags |= DATA_FLAG_PADDED; |
| 2318 ++num_padding_fields; | 2319 ++num_padding_fields; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2331 } else { | 2332 } else { |
| 2332 builder.OverwriteLength(*this, data_ir.data().length()); | 2333 builder.OverwriteLength(*this, data_ir.data().length()); |
| 2333 } | 2334 } |
| 2334 DCHECK_EQ(frame_size, builder.length()); | 2335 DCHECK_EQ(frame_size, builder.length()); |
| 2335 return builder.take(); | 2336 return builder.take(); |
| 2336 } | 2337 } |
| 2337 | 2338 |
| 2338 SpdySerializedFrame* SpdyFramer::SerializeSynStream( | 2339 SpdySerializedFrame* SpdyFramer::SerializeSynStream( |
| 2339 const SpdySynStreamIR& syn_stream) { | 2340 const SpdySynStreamIR& syn_stream) { |
| 2340 DCHECK_GE(SPDY3, protocol_version()); | 2341 DCHECK_GE(SPDY3, protocol_version()); |
| 2341 uint8 flags = 0; | 2342 uint8_t flags = 0; |
| 2342 if (syn_stream.fin()) { | 2343 if (syn_stream.fin()) { |
| 2343 flags |= CONTROL_FLAG_FIN; | 2344 flags |= CONTROL_FLAG_FIN; |
| 2344 } | 2345 } |
| 2345 if (syn_stream.unidirectional()) { | 2346 if (syn_stream.unidirectional()) { |
| 2346 // TODO(hkhalil): invalid for HTTP2. | 2347 // TODO(hkhalil): invalid for HTTP2. |
| 2347 flags |= CONTROL_FLAG_UNIDIRECTIONAL; | 2348 flags |= CONTROL_FLAG_UNIDIRECTIONAL; |
| 2348 } | 2349 } |
| 2349 | 2350 |
| 2350 // Sanitize priority. | 2351 // Sanitize priority. |
| 2351 uint8 priority = syn_stream.priority(); | 2352 uint8_t priority = syn_stream.priority(); |
| 2352 if (priority > GetLowestPriority()) { | 2353 if (priority > GetLowestPriority()) { |
| 2353 DLOG(DFATAL) << "Priority out-of-bounds."; | 2354 DLOG(DFATAL) << "Priority out-of-bounds."; |
| 2354 priority = GetLowestPriority(); | 2355 priority = GetLowestPriority(); |
| 2355 } | 2356 } |
| 2356 | 2357 |
| 2357 // The size of this frame, including variable-length header block. | 2358 // The size of this frame, including variable-length header block. |
| 2358 size_t size = GetSynStreamMinimumSize() + | 2359 size_t size = GetSynStreamMinimumSize() + |
| 2359 GetSerializedLength(syn_stream.header_block()); | 2360 GetSerializedLength(syn_stream.header_block()); |
| 2360 | 2361 |
| 2361 SpdyFrameBuilder builder(size, protocol_version()); | 2362 SpdyFrameBuilder builder(size, protocol_version()); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2375 payload_len, | 2376 payload_len, |
| 2376 builder.length()); | 2377 builder.length()); |
| 2377 } | 2378 } |
| 2378 | 2379 |
| 2379 return builder.take(); | 2380 return builder.take(); |
| 2380 } | 2381 } |
| 2381 | 2382 |
| 2382 SpdySerializedFrame* SpdyFramer::SerializeSynReply( | 2383 SpdySerializedFrame* SpdyFramer::SerializeSynReply( |
| 2383 const SpdySynReplyIR& syn_reply) { | 2384 const SpdySynReplyIR& syn_reply) { |
| 2384 DCHECK_GE(SPDY3, protocol_version()); | 2385 DCHECK_GE(SPDY3, protocol_version()); |
| 2385 uint8 flags = 0; | 2386 uint8_t flags = 0; |
| 2386 if (syn_reply.fin()) { | 2387 if (syn_reply.fin()) { |
| 2387 flags |= CONTROL_FLAG_FIN; | 2388 flags |= CONTROL_FLAG_FIN; |
| 2388 } | 2389 } |
| 2389 | 2390 |
| 2390 // The size of this frame, including variable-length header block. | 2391 // The size of this frame, including variable-length header block. |
| 2391 const size_t size = | 2392 const size_t size = |
| 2392 GetSynReplyMinimumSize() + GetSerializedLength(syn_reply.header_block()); | 2393 GetSynReplyMinimumSize() + GetSerializedLength(syn_reply.header_block()); |
| 2393 | 2394 |
| 2394 SpdyFrameBuilder builder(size, protocol_version()); | 2395 SpdyFrameBuilder builder(size, protocol_version()); |
| 2395 if (protocol_version() <= SPDY3) { | 2396 if (protocol_version() <= SPDY3) { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2439 | 2440 |
| 2440 builder.WriteUInt32(SpdyConstants::SerializeRstStreamStatus( | 2441 builder.WriteUInt32(SpdyConstants::SerializeRstStreamStatus( |
| 2441 protocol_version(), rst_stream.status())); | 2442 protocol_version(), rst_stream.status())); |
| 2442 | 2443 |
| 2443 DCHECK_EQ(expected_length, builder.length()); | 2444 DCHECK_EQ(expected_length, builder.length()); |
| 2444 return builder.take(); | 2445 return builder.take(); |
| 2445 } | 2446 } |
| 2446 | 2447 |
| 2447 SpdySerializedFrame* SpdyFramer::SerializeSettings( | 2448 SpdySerializedFrame* SpdyFramer::SerializeSettings( |
| 2448 const SpdySettingsIR& settings) const { | 2449 const SpdySettingsIR& settings) const { |
| 2449 uint8 flags = 0; | 2450 uint8_t flags = 0; |
| 2450 | 2451 |
| 2451 if (protocol_version() <= SPDY3) { | 2452 if (protocol_version() <= SPDY3) { |
| 2452 if (settings.clear_settings()) { | 2453 if (settings.clear_settings()) { |
| 2453 flags |= SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS; | 2454 flags |= SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS; |
| 2454 } | 2455 } |
| 2455 } else { | 2456 } else { |
| 2456 if (settings.is_ack()) { | 2457 if (settings.is_ack()) { |
| 2457 flags |= SETTINGS_FLAG_ACK; | 2458 flags |= SETTINGS_FLAG_ACK; |
| 2458 } | 2459 } |
| 2459 } | 2460 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 2479 builder.WriteUInt32(values->size()); | 2480 builder.WriteUInt32(values->size()); |
| 2480 } | 2481 } |
| 2481 DCHECK_EQ(GetSettingsMinimumSize(), builder.length()); | 2482 DCHECK_EQ(GetSettingsMinimumSize(), builder.length()); |
| 2482 for (SpdySettingsIR::ValueMap::const_iterator it = values->begin(); | 2483 for (SpdySettingsIR::ValueMap::const_iterator it = values->begin(); |
| 2483 it != values->end(); | 2484 it != values->end(); |
| 2484 ++it) { | 2485 ++it) { |
| 2485 int setting_id = | 2486 int setting_id = |
| 2486 SpdyConstants::SerializeSettingId(protocol_version(), it->first); | 2487 SpdyConstants::SerializeSettingId(protocol_version(), it->first); |
| 2487 DCHECK_GE(setting_id, 0); | 2488 DCHECK_GE(setting_id, 0); |
| 2488 if (protocol_version() <= SPDY3) { | 2489 if (protocol_version() <= SPDY3) { |
| 2489 uint8 setting_flags = 0; | 2490 uint8_t setting_flags = 0; |
| 2490 if (it->second.persist_value) { | 2491 if (it->second.persist_value) { |
| 2491 setting_flags |= SETTINGS_FLAG_PLEASE_PERSIST; | 2492 setting_flags |= SETTINGS_FLAG_PLEASE_PERSIST; |
| 2492 } | 2493 } |
| 2493 if (it->second.persisted) { | 2494 if (it->second.persisted) { |
| 2494 setting_flags |= SETTINGS_FLAG_PERSISTED; | 2495 setting_flags |= SETTINGS_FLAG_PERSISTED; |
| 2495 } | 2496 } |
| 2496 SettingsFlagsAndId flags_and_id(setting_flags, setting_id); | 2497 SettingsFlagsAndId flags_and_id(setting_flags, setting_id); |
| 2497 uint32 id_and_flags_wire = flags_and_id.GetWireFormat(protocol_version()); | 2498 uint32_t id_and_flags_wire = |
| 2499 flags_and_id.GetWireFormat(protocol_version()); |
| 2498 builder.WriteBytes(&id_and_flags_wire, 4); | 2500 builder.WriteBytes(&id_and_flags_wire, 4); |
| 2499 } else { | 2501 } else { |
| 2500 builder.WriteUInt16(static_cast<uint16>(setting_id)); | 2502 builder.WriteUInt16(static_cast<uint16_t>(setting_id)); |
| 2501 } | 2503 } |
| 2502 builder.WriteUInt32(it->second.value); | 2504 builder.WriteUInt32(it->second.value); |
| 2503 } | 2505 } |
| 2504 DCHECK_EQ(size, builder.length()); | 2506 DCHECK_EQ(size, builder.length()); |
| 2505 return builder.take(); | 2507 return builder.take(); |
| 2506 } | 2508 } |
| 2507 | 2509 |
| 2508 SpdySerializedFrame* SpdyFramer::SerializePing(const SpdyPingIR& ping) const { | 2510 SpdySerializedFrame* SpdyFramer::SerializePing(const SpdyPingIR& ping) const { |
| 2509 SpdyFrameBuilder builder(GetPingSize(), protocol_version()); | 2511 SpdyFrameBuilder builder(GetPingSize(), protocol_version()); |
| 2510 if (protocol_version() <= SPDY3) { | 2512 if (protocol_version() <= SPDY3) { |
| 2511 builder.WriteControlFrameHeader(*this, PING, kNoFlags); | 2513 builder.WriteControlFrameHeader(*this, PING, kNoFlags); |
| 2512 builder.WriteUInt32(static_cast<uint32>(ping.id())); | 2514 builder.WriteUInt32(static_cast<uint32_t>(ping.id())); |
| 2513 } else { | 2515 } else { |
| 2514 uint8 flags = 0; | 2516 uint8_t flags = 0; |
| 2515 if (ping.is_ack()) { | 2517 if (ping.is_ack()) { |
| 2516 flags |= PING_FLAG_ACK; | 2518 flags |= PING_FLAG_ACK; |
| 2517 } | 2519 } |
| 2518 builder.BeginNewFrame(*this, PING, flags, 0); | 2520 builder.BeginNewFrame(*this, PING, flags, 0); |
| 2519 builder.WriteUInt64(ping.id()); | 2521 builder.WriteUInt64(ping.id()); |
| 2520 } | 2522 } |
| 2521 DCHECK_EQ(GetPingSize(), builder.length()); | 2523 DCHECK_EQ(GetPingSize(), builder.length()); |
| 2522 return builder.take(); | 2524 return builder.take(); |
| 2523 } | 2525 } |
| 2524 | 2526 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2554 builder.WriteBytes(goaway.description().data(), | 2556 builder.WriteBytes(goaway.description().data(), |
| 2555 goaway.description().size()); | 2557 goaway.description().size()); |
| 2556 } | 2558 } |
| 2557 | 2559 |
| 2558 DCHECK_EQ(expected_length, builder.length()); | 2560 DCHECK_EQ(expected_length, builder.length()); |
| 2559 return builder.take(); | 2561 return builder.take(); |
| 2560 } | 2562 } |
| 2561 | 2563 |
| 2562 SpdySerializedFrame* SpdyFramer::SerializeHeaders( | 2564 SpdySerializedFrame* SpdyFramer::SerializeHeaders( |
| 2563 const SpdyHeadersIR& headers) { | 2565 const SpdyHeadersIR& headers) { |
| 2564 uint8 flags = 0; | 2566 uint8_t flags = 0; |
| 2565 if (headers.fin()) { | 2567 if (headers.fin()) { |
| 2566 flags |= CONTROL_FLAG_FIN; | 2568 flags |= CONTROL_FLAG_FIN; |
| 2567 } | 2569 } |
| 2568 if (protocol_version() > SPDY3) { | 2570 if (protocol_version() > SPDY3) { |
| 2569 // This will get overwritten if we overflow into a CONTINUATION frame. | 2571 // This will get overwritten if we overflow into a CONTINUATION frame. |
| 2570 flags |= HEADERS_FLAG_END_HEADERS; | 2572 flags |= HEADERS_FLAG_END_HEADERS; |
| 2571 if (headers.has_priority()) { | 2573 if (headers.has_priority()) { |
| 2572 flags |= HEADERS_FLAG_PRIORITY; | 2574 flags |= HEADERS_FLAG_PRIORITY; |
| 2573 } | 2575 } |
| 2574 if (headers.padded()) { | 2576 if (headers.padded()) { |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2683 SpdyFrame* SpdyFramer::SerializeBlocked(const SpdyBlockedIR& blocked) const { | 2685 SpdyFrame* SpdyFramer::SerializeBlocked(const SpdyBlockedIR& blocked) const { |
| 2684 DCHECK_LT(SPDY3, protocol_version()); | 2686 DCHECK_LT(SPDY3, protocol_version()); |
| 2685 SpdyFrameBuilder builder(GetBlockedSize(), protocol_version()); | 2687 SpdyFrameBuilder builder(GetBlockedSize(), protocol_version()); |
| 2686 builder.BeginNewFrame(*this, BLOCKED, kNoFlags, blocked.stream_id()); | 2688 builder.BeginNewFrame(*this, BLOCKED, kNoFlags, blocked.stream_id()); |
| 2687 return builder.take(); | 2689 return builder.take(); |
| 2688 } | 2690 } |
| 2689 | 2691 |
| 2690 SpdyFrame* SpdyFramer::SerializePushPromise( | 2692 SpdyFrame* SpdyFramer::SerializePushPromise( |
| 2691 const SpdyPushPromiseIR& push_promise) { | 2693 const SpdyPushPromiseIR& push_promise) { |
| 2692 DCHECK_LT(SPDY3, protocol_version()); | 2694 DCHECK_LT(SPDY3, protocol_version()); |
| 2693 uint8 flags = 0; | 2695 uint8_t flags = 0; |
| 2694 // This will get overwritten if we overflow into a CONTINUATION frame. | 2696 // This will get overwritten if we overflow into a CONTINUATION frame. |
| 2695 flags |= PUSH_PROMISE_FLAG_END_PUSH_PROMISE; | 2697 flags |= PUSH_PROMISE_FLAG_END_PUSH_PROMISE; |
| 2696 // The size of this frame, including variable-length name-value block. | 2698 // The size of this frame, including variable-length name-value block. |
| 2697 size_t size = GetPushPromiseMinimumSize(); | 2699 size_t size = GetPushPromiseMinimumSize(); |
| 2698 | 2700 |
| 2699 if (push_promise.padded()) { | 2701 if (push_promise.padded()) { |
| 2700 flags |= PUSH_PROMISE_FLAG_PADDED; | 2702 flags |= PUSH_PROMISE_FLAG_PADDED; |
| 2701 size += kPadLengthFieldSize; | 2703 size += kPadLengthFieldSize; |
| 2702 size += push_promise.padding_payload_len(); | 2704 size += push_promise.padding_payload_len(); |
| 2703 } | 2705 } |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2755 | 2757 |
| 2756 return builder.take(); | 2758 return builder.take(); |
| 2757 } | 2759 } |
| 2758 | 2760 |
| 2759 // TODO(jgraettinger): This implementation is incorrect. The continuation | 2761 // TODO(jgraettinger): This implementation is incorrect. The continuation |
| 2760 // frame continues a previously-begun HPACK encoding; it doesn't begin a | 2762 // frame continues a previously-begun HPACK encoding; it doesn't begin a |
| 2761 // new one. Figure out whether it makes sense to keep SerializeContinuation(). | 2763 // new one. Figure out whether it makes sense to keep SerializeContinuation(). |
| 2762 SpdyFrame* SpdyFramer::SerializeContinuation( | 2764 SpdyFrame* SpdyFramer::SerializeContinuation( |
| 2763 const SpdyContinuationIR& continuation) { | 2765 const SpdyContinuationIR& continuation) { |
| 2764 CHECK_LT(SPDY3, protocol_version()); | 2766 CHECK_LT(SPDY3, protocol_version()); |
| 2765 uint8 flags = 0; | 2767 uint8_t flags = 0; |
| 2766 if (continuation.end_headers()) { | 2768 if (continuation.end_headers()) { |
| 2767 flags |= HEADERS_FLAG_END_HEADERS; | 2769 flags |= HEADERS_FLAG_END_HEADERS; |
| 2768 } | 2770 } |
| 2769 | 2771 |
| 2770 // The size of this frame, including variable-length name-value block. | 2772 // The size of this frame, including variable-length name-value block. |
| 2771 size_t size = GetContinuationMinimumSize(); | 2773 size_t size = GetContinuationMinimumSize(); |
| 2772 string hpack_encoding; | 2774 string hpack_encoding; |
| 2773 if (enable_compression_) { | 2775 if (enable_compression_) { |
| 2774 GetHpackEncoder()->EncodeHeaderSet(continuation.header_block(), | 2776 GetHpackEncoder()->EncodeHeaderSet(continuation.header_block(), |
| 2775 &hpack_encoding); | 2777 &hpack_encoding); |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2906 size_t payload_size = kMaxControlFrameSize - GetContinuationMinimumSize(); | 2908 size_t payload_size = kMaxControlFrameSize - GetContinuationMinimumSize(); |
| 2907 // This is ceiling(overflow/payload_size) using integer arithmetics. | 2909 // This is ceiling(overflow/payload_size) using integer arithmetics. |
| 2908 return (overflow - 1) / payload_size + 1; | 2910 return (overflow - 1) / payload_size + 1; |
| 2909 } | 2911 } |
| 2910 | 2912 |
| 2911 void SpdyFramer::WritePayloadWithContinuation(SpdyFrameBuilder* builder, | 2913 void SpdyFramer::WritePayloadWithContinuation(SpdyFrameBuilder* builder, |
| 2912 const string& hpack_encoding, | 2914 const string& hpack_encoding, |
| 2913 SpdyStreamId stream_id, | 2915 SpdyStreamId stream_id, |
| 2914 SpdyFrameType type, | 2916 SpdyFrameType type, |
| 2915 int padding_payload_len) { | 2917 int padding_payload_len) { |
| 2916 uint8 end_flag = 0; | 2918 uint8_t end_flag = 0; |
| 2917 uint8 flags = 0; | 2919 uint8_t flags = 0; |
| 2918 if (type == HEADERS) { | 2920 if (type == HEADERS) { |
| 2919 end_flag = HEADERS_FLAG_END_HEADERS; | 2921 end_flag = HEADERS_FLAG_END_HEADERS; |
| 2920 } else if (type == PUSH_PROMISE) { | 2922 } else if (type == PUSH_PROMISE) { |
| 2921 end_flag = PUSH_PROMISE_FLAG_END_PUSH_PROMISE; | 2923 end_flag = PUSH_PROMISE_FLAG_END_PUSH_PROMISE; |
| 2922 } else { | 2924 } else { |
| 2923 DLOG(FATAL) << "CONTINUATION frames cannot be used with frame type " | 2925 DLOG(FATAL) << "CONTINUATION frames cannot be used with frame type " |
| 2924 << FrameTypeToString(type); | 2926 << FrameTypeToString(type); |
| 2925 } | 2927 } |
| 2926 | 2928 |
| 2927 // Write all the padding payload and as much of the data payload as possible | 2929 // Write all the padding payload and as much of the data payload as possible |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3030 } | 3032 } |
| 3031 | 3033 |
| 3032 HpackDecoder* SpdyFramer::GetHpackDecoder() { | 3034 HpackDecoder* SpdyFramer::GetHpackDecoder() { |
| 3033 DCHECK_LT(SPDY3, protocol_version()); | 3035 DCHECK_LT(SPDY3, protocol_version()); |
| 3034 if (hpack_decoder_.get() == nullptr) { | 3036 if (hpack_decoder_.get() == nullptr) { |
| 3035 hpack_decoder_.reset(new HpackDecoder(ObtainHpackHuffmanTable())); | 3037 hpack_decoder_.reset(new HpackDecoder(ObtainHpackHuffmanTable())); |
| 3036 } | 3038 } |
| 3037 return hpack_decoder_.get(); | 3039 return hpack_decoder_.get(); |
| 3038 } | 3040 } |
| 3039 | 3041 |
| 3040 uint8 SpdyFramer::MapPriorityToWeight(SpdyPriority priority) { | 3042 uint8_t SpdyFramer::MapPriorityToWeight(SpdyPriority priority) { |
| 3041 const float kSteps = 255.9f / 7.f; | 3043 const float kSteps = 255.9f / 7.f; |
| 3042 return static_cast<uint8>(kSteps * (7.f - priority)); | 3044 return static_cast<uint8_t>(kSteps * (7.f - priority)); |
| 3043 } | 3045 } |
| 3044 | 3046 |
| 3045 SpdyPriority SpdyFramer::MapWeightToPriority(uint8 weight) { | 3047 SpdyPriority SpdyFramer::MapWeightToPriority(uint8_t weight) { |
| 3046 const float kSteps = 255.9f / 7.f; | 3048 const float kSteps = 255.9f / 7.f; |
| 3047 return static_cast<SpdyPriority>(7.f - weight / kSteps); | 3049 return static_cast<SpdyPriority>(7.f - weight / kSteps); |
| 3048 } | 3050 } |
| 3049 | 3051 |
| 3050 // Incrementally decompress the control frame's header block, feeding the | 3052 // Incrementally decompress the control frame's header block, feeding the |
| 3051 // result to the visitor in chunks. Continue this until the visitor | 3053 // result to the visitor in chunks. Continue this until the visitor |
| 3052 // indicates that it cannot process any more data, or (more commonly) we | 3054 // indicates that it cannot process any more data, or (more commonly) we |
| 3053 // run out of data to deliver. | 3055 // run out of data to deliver. |
| 3054 bool SpdyFramer::IncrementallyDecompressControlFrameHeaderData( | 3056 bool SpdyFramer::IncrementallyDecompressControlFrameHeaderData( |
| 3055 SpdyStreamId stream_id, | 3057 SpdyStreamId stream_id, |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3132 len -= bytes_to_deliver; | 3134 len -= bytes_to_deliver; |
| 3133 if (!read_successfully) { | 3135 if (!read_successfully) { |
| 3134 // Assume that the problem was the header block was too large for the | 3136 // Assume that the problem was the header block was too large for the |
| 3135 // visitor. | 3137 // visitor. |
| 3136 set_error(SPDY_CONTROL_PAYLOAD_TOO_LARGE); | 3138 set_error(SPDY_CONTROL_PAYLOAD_TOO_LARGE); |
| 3137 } | 3139 } |
| 3138 } | 3140 } |
| 3139 return read_successfully; | 3141 return read_successfully; |
| 3140 } | 3142 } |
| 3141 | 3143 |
| 3142 void SpdyFramer::UpdateHeaderEncoderTableSize(uint32 value) { | 3144 void SpdyFramer::UpdateHeaderEncoderTableSize(uint32_t value) { |
| 3143 GetHpackEncoder()->ApplyHeaderTableSizeSetting(value); | 3145 GetHpackEncoder()->ApplyHeaderTableSizeSetting(value); |
| 3144 } | 3146 } |
| 3145 | 3147 |
| 3146 size_t SpdyFramer::header_encoder_table_size() const { | 3148 size_t SpdyFramer::header_encoder_table_size() const { |
| 3147 if (hpack_encoder_ == nullptr) { | 3149 if (hpack_encoder_ == nullptr) { |
| 3148 return kDefaultHeaderTableSizeSetting; | 3150 return kDefaultHeaderTableSizeSetting; |
| 3149 } else { | 3151 } else { |
| 3150 return hpack_encoder_->CurrentHeaderTableSizeSetting(); | 3152 return hpack_encoder_->CurrentHeaderTableSizeSetting(); |
| 3151 } | 3153 } |
| 3152 } | 3154 } |
| 3153 | 3155 |
| 3154 void SpdyFramer::SerializeHeaderBlockWithoutCompression( | 3156 void SpdyFramer::SerializeHeaderBlockWithoutCompression( |
| 3155 SpdyFrameBuilder* builder, | 3157 SpdyFrameBuilder* builder, |
| 3156 const SpdyHeaderBlock& header_block) const { | 3158 const SpdyHeaderBlock& header_block) const { |
| 3157 // Serialize number of headers. | 3159 // Serialize number of headers. |
| 3158 if (protocol_version() <= SPDY2) { | 3160 if (protocol_version() <= SPDY2) { |
| 3159 builder->WriteUInt16(static_cast<uint16>(header_block.size())); | 3161 builder->WriteUInt16(static_cast<uint16_t>(header_block.size())); |
| 3160 } else { | 3162 } else { |
| 3161 builder->WriteUInt32(header_block.size()); | 3163 builder->WriteUInt32(header_block.size()); |
| 3162 } | 3164 } |
| 3163 | 3165 |
| 3164 // Serialize each header. | 3166 // Serialize each header. |
| 3165 for (const auto& header : header_block) { | 3167 for (const auto& header : header_block) { |
| 3166 if (protocol_version() <= SPDY2) { | 3168 if (protocol_version() <= SPDY2) { |
| 3167 builder->WriteStringPiece16(header.first); | 3169 builder->WriteStringPiece16(header.first); |
| 3168 builder->WriteStringPiece16(header.second); | 3170 builder->WriteStringPiece16(header.second); |
| 3169 } else { | 3171 } else { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3226 #else | 3228 #else |
| 3227 WriteHeaderBlockToZ(&frame.header_block(), compressor); | 3229 WriteHeaderBlockToZ(&frame.header_block(), compressor); |
| 3228 #endif // defined(USE_SYSTEM_ZLIB) | 3230 #endif // defined(USE_SYSTEM_ZLIB) |
| 3229 | 3231 |
| 3230 int compressed_size = compressed_max_size - compressor->avail_out; | 3232 int compressed_size = compressed_max_size - compressor->avail_out; |
| 3231 builder->Seek(compressed_size); | 3233 builder->Seek(compressed_size); |
| 3232 builder->RewriteLength(*this); | 3234 builder->RewriteLength(*this); |
| 3233 } | 3235 } |
| 3234 | 3236 |
| 3235 } // namespace net | 3237 } // namespace net |
| OLD | NEW |