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 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
668 // Not enough information to do anything meaningful. | 668 // Not enough information to do anything meaningful. |
669 return original_len - len; | 669 return original_len - len; |
670 } | 670 } |
671 | 671 |
672 // Using a scoped_ptr here since we may need to create a new SpdyFrameReader | 672 // Using a scoped_ptr here since we may need to create a new SpdyFrameReader |
673 // when processing DATA frames below. | 673 // when processing DATA frames below. |
674 scoped_ptr<SpdyFrameReader> reader( | 674 scoped_ptr<SpdyFrameReader> reader( |
675 new SpdyFrameReader(current_frame_buffer_.get(), | 675 new SpdyFrameReader(current_frame_buffer_.get(), |
676 current_frame_buffer_length_)); | 676 current_frame_buffer_length_)); |
677 | 677 |
678 uint16 version = 0; | |
679 bool is_control_frame = false; | 678 bool is_control_frame = false; |
680 | 679 |
681 uint16 control_frame_type_field = | 680 uint16 control_frame_type_field = |
682 SpdyConstants::DataFrameType(protocol_version()); | 681 SpdyConstants::DataFrameType(protocol_version()); |
683 // ProcessControlFrameHeader() will set current_frame_type_ to the | 682 // ProcessControlFrameHeader() will set current_frame_type_ to the |
684 // correct value if this is a valid control frame. | 683 // correct value if this is a valid control frame. |
685 current_frame_type_ = DATA; | 684 current_frame_type_ = DATA; |
686 if (protocol_version() <= SPDY3) { | 685 if (protocol_version() <= SPDY3) { |
| 686 uint16 version = 0; |
687 bool successful_read = reader->ReadUInt16(&version); | 687 bool successful_read = reader->ReadUInt16(&version); |
688 DCHECK(successful_read); | 688 DCHECK(successful_read); |
689 is_control_frame = (version & kControlFlagMask) != 0; | 689 is_control_frame = (version & kControlFlagMask) != 0; |
690 version &= ~kControlFlagMask; // Only valid for control frames. | 690 version &= ~kControlFlagMask; // Only valid for control frames. |
691 if (is_control_frame) { | 691 if (is_control_frame) { |
692 // We check version before we check validity: version can never be | 692 // We check version before we check validity: version can never be |
693 // 'invalid', it can only be unsupported. | 693 // 'invalid', it can only be unsupported. |
694 if (version < SpdyConstants::SerializeMajorVersion(SPDY_MIN_VERSION) || | 694 if (version < SpdyConstants::SerializeMajorVersion(SPDY_MIN_VERSION) || |
695 version > SpdyConstants::SerializeMajorVersion(SPDY_MAX_VERSION) || | 695 version > SpdyConstants::SerializeMajorVersion(SPDY_MAX_VERSION) || |
696 SpdyConstants::ParseMajorVersion(version) != protocol_version()) { | 696 SpdyConstants::ParseMajorVersion(version) != protocol_version()) { |
697 // Version does not match the version the framer was initialized with. | 697 // Version does not match the version the framer was initialized with. |
698 DVLOG(1) << "Unsupported SPDY version " | 698 DVLOG(1) << "Unsupported SPDY version " |
699 << version | 699 << version |
700 << " (expected " << protocol_version() << ")"; | 700 << " (expected " << protocol_version() << ")"; |
701 set_error(SPDY_UNSUPPORTED_VERSION); | 701 set_error(SPDY_UNSUPPORTED_VERSION); |
702 return 0; | 702 return 0; |
703 } else { | |
704 // Convert version from wire format to SpdyMajorVersion. | |
705 version = SpdyConstants::ParseMajorVersion(version); | |
706 } | 703 } |
707 // We check control_frame_type_field's validity in | 704 // We check control_frame_type_field's validity in |
708 // ProcessControlFrameHeader(). | 705 // ProcessControlFrameHeader(). |
709 successful_read = reader->ReadUInt16(&control_frame_type_field); | 706 successful_read = reader->ReadUInt16(&control_frame_type_field); |
710 } else { | 707 } else { |
711 reader->Rewind(); | 708 reader->Rewind(); |
712 successful_read = reader->ReadUInt31(¤t_frame_stream_id_); | 709 successful_read = reader->ReadUInt31(¤t_frame_stream_id_); |
713 } | 710 } |
714 DCHECK(successful_read); | 711 DCHECK(successful_read); |
715 | 712 |
716 successful_read = reader->ReadUInt8(¤t_frame_flags_); | 713 successful_read = reader->ReadUInt8(¤t_frame_flags_); |
717 DCHECK(successful_read); | 714 DCHECK(successful_read); |
718 | 715 |
719 uint32 length_field = 0; | 716 uint32 length_field = 0; |
720 successful_read = reader->ReadUInt24(&length_field); | 717 successful_read = reader->ReadUInt24(&length_field); |
721 DCHECK(successful_read); | 718 DCHECK(successful_read); |
722 remaining_data_length_ = length_field; | 719 remaining_data_length_ = length_field; |
723 current_frame_length_ = remaining_data_length_ + reader->GetBytesConsumed(); | 720 current_frame_length_ = remaining_data_length_ + reader->GetBytesConsumed(); |
724 } else { | 721 } else { |
725 version = protocol_version(); | |
726 uint32 length_field = 0; | 722 uint32 length_field = 0; |
727 bool successful_read = reader->ReadUInt24(&length_field); | 723 bool successful_read = reader->ReadUInt24(&length_field); |
728 DCHECK(successful_read); | 724 DCHECK(successful_read); |
729 | 725 |
730 uint8 control_frame_type_field_uint8 = | 726 uint8 control_frame_type_field_uint8 = |
731 SpdyConstants::DataFrameType(protocol_version()); | 727 SpdyConstants::DataFrameType(protocol_version()); |
732 successful_read = reader->ReadUInt8(&control_frame_type_field_uint8); | 728 successful_read = reader->ReadUInt8(&control_frame_type_field_uint8); |
733 DCHECK(successful_read); | 729 DCHECK(successful_read); |
734 // We check control_frame_type_field's validity in | 730 // We check control_frame_type_field's validity in |
735 // ProcessControlFrameHeader(). | 731 // ProcessControlFrameHeader(). |
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1166 total_length += length_of_name_size + it->first.size() + | 1162 total_length += length_of_name_size + it->first.size() + |
1167 length_of_value_size + it->second.size(); | 1163 length_of_value_size + it->second.size(); |
1168 } | 1164 } |
1169 return total_length; | 1165 return total_length; |
1170 } | 1166 } |
1171 | 1167 |
1172 void SpdyFramer::WriteHeaderBlock(SpdyFrameBuilder* frame, | 1168 void SpdyFramer::WriteHeaderBlock(SpdyFrameBuilder* frame, |
1173 const SpdyMajorVersion spdy_version, | 1169 const SpdyMajorVersion spdy_version, |
1174 const SpdyHeaderBlock* headers) { | 1170 const SpdyHeaderBlock* headers) { |
1175 if (spdy_version < SPDY3) { | 1171 if (spdy_version < SPDY3) { |
1176 frame->WriteUInt16(headers->size()); // Number of headers. | 1172 frame->WriteUInt16(headers->size()); |
1177 } else { | 1173 } else { |
1178 frame->WriteUInt32(headers->size()); // Number of headers. | 1174 frame->WriteUInt32(headers->size()); |
1179 } | 1175 } |
1180 SpdyHeaderBlock::const_iterator it; | 1176 SpdyHeaderBlock::const_iterator it; |
1181 for (it = headers->begin(); it != headers->end(); ++it) { | 1177 for (it = headers->begin(); it != headers->end(); ++it) { |
1182 if (spdy_version < SPDY3) { | 1178 if (spdy_version < SPDY3) { |
1183 frame->WriteString(it->first); | 1179 frame->WriteString(it->first); |
1184 frame->WriteString(it->second); | 1180 frame->WriteString(it->second); |
1185 } else { | 1181 } else { |
1186 frame->WriteStringPiece32(it->first); | 1182 frame->WriteStringPiece32(it->first); |
1187 frame->WriteStringPiece32(it->second); | 1183 frame->WriteStringPiece32(it->second); |
1188 } | 1184 } |
(...skipping 2058 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3247 builder->Seek(compressed_size); | 3243 builder->Seek(compressed_size); |
3248 builder->RewriteLength(*this); | 3244 builder->RewriteLength(*this); |
3249 | 3245 |
3250 pre_compress_bytes.Add(uncompressed_len); | 3246 pre_compress_bytes.Add(uncompressed_len); |
3251 post_compress_bytes.Add(compressed_size); | 3247 post_compress_bytes.Add(compressed_size); |
3252 | 3248 |
3253 compressed_frames.Increment(); | 3249 compressed_frames.Increment(); |
3254 } | 3250 } |
3255 | 3251 |
3256 } // namespace net | 3252 } // namespace net |
OLD | NEW |