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 <ios> | 10 #include <ios> |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 SpdyFramer::SpdyFramer(SpdyMajorVersion version) | 168 SpdyFramer::SpdyFramer(SpdyMajorVersion version) |
169 : current_frame_buffer_(kControlFrameBufferSize), | 169 : current_frame_buffer_(kControlFrameBufferSize), |
170 expect_continuation_(0), | 170 expect_continuation_(0), |
171 visitor_(NULL), | 171 visitor_(NULL), |
172 debug_visitor_(NULL), | 172 debug_visitor_(NULL), |
173 display_protocol_("SPDY"), | 173 display_protocol_("SPDY"), |
174 protocol_version_(version), | 174 protocol_version_(version), |
175 enable_compression_(true), | 175 enable_compression_(true), |
176 syn_frame_processed_(false), | 176 syn_frame_processed_(false), |
177 probable_http_response_(false), | 177 probable_http_response_(false), |
178 end_stream_when_done_(false), | 178 end_stream_when_done_(false) { |
179 spdy_on_stream_end_(FLAGS_spdy_on_stream_end) { | |
180 DCHECK(protocol_version_ == SPDY3 || protocol_version_ == HTTP2); | 179 DCHECK(protocol_version_ == SPDY3 || protocol_version_ == HTTP2); |
181 // TODO(bnc): The way kMaxControlFrameSize is currently interpreted, it | 180 // TODO(bnc): The way kMaxControlFrameSize is currently interpreted, it |
182 // includes the frame header, whereas kSpdyInitialFrameSizeLimit does not. | 181 // includes the frame header, whereas kSpdyInitialFrameSizeLimit does not. |
183 // Therefore this assertion is unnecessarily strict. | 182 // Therefore this assertion is unnecessarily strict. |
184 static_assert(kMaxControlFrameSize <= kSpdyInitialFrameSizeLimit, | 183 static_assert(kMaxControlFrameSize <= kSpdyInitialFrameSizeLimit, |
185 "Our send limit should be at most our receive limit"); | 184 "Our send limit should be at most our receive limit"); |
186 Reset(); | 185 Reset(); |
187 } | 186 } |
188 | 187 |
189 SpdyFramer::~SpdyFramer() { | 188 SpdyFramer::~SpdyFramer() { |
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
887 set_error(SPDY_INVALID_DATA_FRAME_FLAGS); | 886 set_error(SPDY_INVALID_DATA_FRAME_FLAGS); |
888 } else { | 887 } else { |
889 visitor_->OnDataFrameHeader(current_frame_stream_id_, | 888 visitor_->OnDataFrameHeader(current_frame_stream_id_, |
890 remaining_data_length_, | 889 remaining_data_length_, |
891 current_frame_flags_ & DATA_FLAG_FIN); | 890 current_frame_flags_ & DATA_FLAG_FIN); |
892 if (remaining_data_length_ > 0) { | 891 if (remaining_data_length_ > 0) { |
893 CHANGE_STATE(SPDY_READ_DATA_FRAME_PADDING_LENGTH); | 892 CHANGE_STATE(SPDY_READ_DATA_FRAME_PADDING_LENGTH); |
894 } else { | 893 } else { |
895 // Empty data frame. | 894 // Empty data frame. |
896 if (current_frame_flags_ & DATA_FLAG_FIN) { | 895 if (current_frame_flags_ & DATA_FLAG_FIN) { |
897 if (spdy_on_stream_end_) { | 896 visitor_->OnStreamEnd(current_frame_stream_id_); |
898 visitor_->OnStreamEnd(current_frame_stream_id_); | |
899 } else { | |
900 visitor_->OnStreamFrameData(current_frame_stream_id_, nullptr, 0, | |
901 true); | |
902 } | |
903 } | 897 } |
904 CHANGE_STATE(SPDY_FRAME_COMPLETE); | 898 CHANGE_STATE(SPDY_FRAME_COMPLETE); |
905 } | 899 } |
906 } | 900 } |
907 } else { | 901 } else { |
908 ProcessControlFrameHeader(control_frame_type_field); | 902 ProcessControlFrameHeader(control_frame_type_field); |
909 } | 903 } |
910 | 904 |
911 return original_len - len; | 905 return original_len - len; |
912 } | 906 } |
(...skipping 1252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2165 remaining_data_length_ -= amount_to_discard; | 2159 remaining_data_length_ -= amount_to_discard; |
2166 } | 2160 } |
2167 | 2161 |
2168 if (remaining_data_length_ == 0) { | 2162 if (remaining_data_length_ == 0) { |
2169 // If the FIN flag is set, or this ends a header block which set FIN, | 2163 // If the FIN flag is set, or this ends a header block which set FIN, |
2170 // inform the visitor of EOF via a 0-length data frame. | 2164 // inform the visitor of EOF via a 0-length data frame. |
2171 if (expect_continuation_ == 0 && | 2165 if (expect_continuation_ == 0 && |
2172 ((current_frame_flags_ & CONTROL_FLAG_FIN) != 0 || | 2166 ((current_frame_flags_ & CONTROL_FLAG_FIN) != 0 || |
2173 end_stream_when_done_)) { | 2167 end_stream_when_done_)) { |
2174 end_stream_when_done_ = false; | 2168 end_stream_when_done_ = false; |
2175 if (spdy_on_stream_end_) { | 2169 visitor_->OnStreamEnd(current_frame_stream_id_); |
2176 visitor_->OnStreamEnd(current_frame_stream_id_); | |
2177 } else { | |
2178 visitor_->OnStreamFrameData(current_frame_stream_id_, nullptr, 0, true); | |
2179 } | |
2180 } | 2170 } |
2181 CHANGE_STATE(SPDY_FRAME_COMPLETE); | 2171 CHANGE_STATE(SPDY_FRAME_COMPLETE); |
2182 } | 2172 } |
2183 return original_len - len; | 2173 return original_len - len; |
2184 } | 2174 } |
2185 | 2175 |
2186 size_t SpdyFramer::ProcessDataFramePayload(const char* data, size_t len) { | 2176 size_t SpdyFramer::ProcessDataFramePayload(const char* data, size_t len) { |
2187 size_t original_len = len; | 2177 size_t original_len = len; |
2188 if (remaining_data_length_ - remaining_padding_payload_length_ > 0) { | 2178 if (remaining_data_length_ - remaining_padding_payload_length_ > 0) { |
2189 size_t amount_to_forward = std::min( | 2179 size_t amount_to_forward = std::min( |
(...skipping 1013 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3203 #else | 3193 #else |
3204 WriteHeaderBlockToZ(&frame.header_block(), compressor); | 3194 WriteHeaderBlockToZ(&frame.header_block(), compressor); |
3205 #endif // defined(USE_SYSTEM_ZLIB) | 3195 #endif // defined(USE_SYSTEM_ZLIB) |
3206 | 3196 |
3207 int compressed_size = compressed_max_size - compressor->avail_out; | 3197 int compressed_size = compressed_max_size - compressor->avail_out; |
3208 builder->Seek(compressed_size); | 3198 builder->Seek(compressed_size); |
3209 builder->RewriteLength(*this); | 3199 builder->RewriteLength(*this); |
3210 } | 3200 } |
3211 | 3201 |
3212 } // namespace net | 3202 } // namespace net |
OLD | NEW |