| 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 <cctype> | 10 #include <cctype> |
| (...skipping 1281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1292 remaining_data_length_); | 1292 remaining_data_length_); |
| 1293 remaining_data_length_ -= bytes_read; | 1293 remaining_data_length_ -= bytes_read; |
| 1294 if (remaining_data_length_ == 0) { | 1294 if (remaining_data_length_ == 0) { |
| 1295 SpdyFrameReader reader(current_frame_buffer_.data(), | 1295 SpdyFrameReader reader(current_frame_buffer_.data(), |
| 1296 current_frame_buffer_.len()); | 1296 current_frame_buffer_.len()); |
| 1297 reader.Seek(GetFrameHeaderSize()); // Skip frame header. | 1297 reader.Seek(GetFrameHeaderSize()); // Skip frame header. |
| 1298 | 1298 |
| 1299 // Use frame-specific handlers. | 1299 // Use frame-specific handlers. |
| 1300 switch (current_frame_type_) { | 1300 switch (current_frame_type_) { |
| 1301 case RST_STREAM: { | 1301 case RST_STREAM: { |
| 1302 uint32_t status_raw = RST_STREAM_NO_ERROR; | 1302 uint32_t error_code = ERROR_CODE_NO_ERROR; |
| 1303 bool successful_read = reader.ReadUInt32(&status_raw); | 1303 bool successful_read = reader.ReadUInt32(&error_code); |
| 1304 DCHECK(successful_read); | 1304 DCHECK(successful_read); |
| 1305 DCHECK(reader.IsDoneReading()); | 1305 DCHECK(reader.IsDoneReading()); |
| 1306 SpdyRstStreamStatus status = ParseRstStreamStatus(status_raw); | 1306 visitor_->OnRstStream(current_frame_stream_id_, |
| 1307 visitor_->OnRstStream(current_frame_stream_id_, status); | 1307 ParseErrorCode(error_code)); |
| 1308 } break; | 1308 } break; |
| 1309 case PING: { | 1309 case PING: { |
| 1310 SpdyPingId id = 0; | 1310 SpdyPingId id = 0; |
| 1311 bool is_ack = current_frame_flags_ & PING_FLAG_ACK; | 1311 bool is_ack = current_frame_flags_ & PING_FLAG_ACK; |
| 1312 bool successful_read = true; | 1312 bool successful_read = true; |
| 1313 successful_read = reader.ReadUInt64(&id); | 1313 successful_read = reader.ReadUInt64(&id); |
| 1314 DCHECK(successful_read); | 1314 DCHECK(successful_read); |
| 1315 DCHECK(reader.IsDoneReading()); | 1315 DCHECK(reader.IsDoneReading()); |
| 1316 visitor_->OnPing(id, is_ack); | 1316 visitor_->OnPing(id, is_ack); |
| 1317 } break; | 1317 } break; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1377 // Do we have enough to parse the constant size GOAWAY header? | 1377 // Do we have enough to parse the constant size GOAWAY header? |
| 1378 if (current_frame_buffer_.len() == header_size) { | 1378 if (current_frame_buffer_.len() == header_size) { |
| 1379 // Parse out the last good stream id. | 1379 // Parse out the last good stream id. |
| 1380 SpdyFrameReader reader(current_frame_buffer_.data(), | 1380 SpdyFrameReader reader(current_frame_buffer_.data(), |
| 1381 current_frame_buffer_.len()); | 1381 current_frame_buffer_.len()); |
| 1382 reader.Seek(GetFrameHeaderSize()); // Seek past frame header. | 1382 reader.Seek(GetFrameHeaderSize()); // Seek past frame header. |
| 1383 bool successful_read = reader.ReadUInt31(¤t_frame_stream_id_); | 1383 bool successful_read = reader.ReadUInt31(¤t_frame_stream_id_); |
| 1384 DCHECK(successful_read); | 1384 DCHECK(successful_read); |
| 1385 | 1385 |
| 1386 // Parse status code. | 1386 // Parse status code. |
| 1387 uint32_t status_raw = GOAWAY_NO_ERROR; | 1387 uint32_t error_code = ERROR_CODE_NO_ERROR; |
| 1388 successful_read = reader.ReadUInt32(&status_raw); | 1388 successful_read = reader.ReadUInt32(&error_code); |
| 1389 DCHECK(successful_read); | 1389 DCHECK(successful_read); |
| 1390 SpdyGoAwayStatus status = ParseGoAwayStatus(status_raw); | |
| 1391 // Finished parsing the GOAWAY header, call frame handler. | 1390 // Finished parsing the GOAWAY header, call frame handler. |
| 1392 visitor_->OnGoAway(current_frame_stream_id_, status); | 1391 visitor_->OnGoAway(current_frame_stream_id_, ParseErrorCode(error_code)); |
| 1393 } | 1392 } |
| 1394 } | 1393 } |
| 1395 | 1394 |
| 1396 // Handle remaining data as opaque. | 1395 // Handle remaining data as opaque. |
| 1397 bool processed_successfully = true; | 1396 bool processed_successfully = true; |
| 1398 if (len > 0) { | 1397 if (len > 0) { |
| 1399 processed_successfully = visitor_->OnGoAwayFrameData(data, len); | 1398 processed_successfully = visitor_->OnGoAwayFrameData(data, len); |
| 1400 } | 1399 } |
| 1401 remaining_data_length_ -= original_len; | 1400 remaining_data_length_ -= original_len; |
| 1402 if (!processed_successfully) { | 1401 if (!processed_successfully) { |
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1734 return builder.take(); | 1733 return builder.take(); |
| 1735 } | 1734 } |
| 1736 | 1735 |
| 1737 SpdySerializedFrame SpdyFramer::SerializeRstStream( | 1736 SpdySerializedFrame SpdyFramer::SerializeRstStream( |
| 1738 const SpdyRstStreamIR& rst_stream) const { | 1737 const SpdyRstStreamIR& rst_stream) const { |
| 1739 size_t expected_length = GetRstStreamSize(); | 1738 size_t expected_length = GetRstStreamSize(); |
| 1740 SpdyFrameBuilder builder(expected_length); | 1739 SpdyFrameBuilder builder(expected_length); |
| 1741 | 1740 |
| 1742 builder.BeginNewFrame(*this, RST_STREAM, 0, rst_stream.stream_id()); | 1741 builder.BeginNewFrame(*this, RST_STREAM, 0, rst_stream.stream_id()); |
| 1743 | 1742 |
| 1744 builder.WriteUInt32(rst_stream.status()); | 1743 builder.WriteUInt32(rst_stream.error_code()); |
| 1745 | 1744 |
| 1746 DCHECK_EQ(expected_length, builder.length()); | 1745 DCHECK_EQ(expected_length, builder.length()); |
| 1747 return builder.take(); | 1746 return builder.take(); |
| 1748 } | 1747 } |
| 1749 | 1748 |
| 1750 SpdySerializedFrame SpdyFramer::SerializeSettings( | 1749 SpdySerializedFrame SpdyFramer::SerializeSettings( |
| 1751 const SpdySettingsIR& settings) const { | 1750 const SpdySettingsIR& settings) const { |
| 1752 uint8_t flags = 0; | 1751 uint8_t flags = 0; |
| 1753 | 1752 |
| 1754 if (settings.is_ack()) { | 1753 if (settings.is_ack()) { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1798 size_t expected_length = GetGoAwayMinimumSize(); | 1797 size_t expected_length = GetGoAwayMinimumSize(); |
| 1799 expected_length += goaway.description().size(); | 1798 expected_length += goaway.description().size(); |
| 1800 SpdyFrameBuilder builder(expected_length); | 1799 SpdyFrameBuilder builder(expected_length); |
| 1801 | 1800 |
| 1802 // Serialize the GOAWAY frame. | 1801 // Serialize the GOAWAY frame. |
| 1803 builder.BeginNewFrame(*this, GOAWAY, 0, 0); | 1802 builder.BeginNewFrame(*this, GOAWAY, 0, 0); |
| 1804 | 1803 |
| 1805 // GOAWAY frames specify the last good stream id. | 1804 // GOAWAY frames specify the last good stream id. |
| 1806 builder.WriteUInt32(goaway.last_good_stream_id()); | 1805 builder.WriteUInt32(goaway.last_good_stream_id()); |
| 1807 | 1806 |
| 1808 // GOAWAY frames also specify the error status code. | 1807 // GOAWAY frames also specify the error code. |
| 1809 builder.WriteUInt32(goaway.status()); | 1808 builder.WriteUInt32(goaway.error_code()); |
| 1810 | 1809 |
| 1811 // GOAWAY frames may also specify opaque data. | 1810 // GOAWAY frames may also specify opaque data. |
| 1812 if (!goaway.description().empty()) { | 1811 if (!goaway.description().empty()) { |
| 1813 builder.WriteBytes(goaway.description().data(), | 1812 builder.WriteBytes(goaway.description().data(), |
| 1814 goaway.description().size()); | 1813 goaway.description().size()); |
| 1815 } | 1814 } |
| 1816 | 1815 |
| 1817 DCHECK_EQ(expected_length, builder.length()); | 1816 DCHECK_EQ(expected_length, builder.length()); |
| 1818 return builder.take(); | 1817 return builder.take(); |
| 1819 } | 1818 } |
| (...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2377 builder->WriteUInt32(header_block.size()); | 2376 builder->WriteUInt32(header_block.size()); |
| 2378 | 2377 |
| 2379 // Serialize each header. | 2378 // Serialize each header. |
| 2380 for (const auto& header : header_block) { | 2379 for (const auto& header : header_block) { |
| 2381 builder->WriteStringPiece32(base::ToLowerASCII(header.first)); | 2380 builder->WriteStringPiece32(base::ToLowerASCII(header.first)); |
| 2382 builder->WriteStringPiece32(header.second); | 2381 builder->WriteStringPiece32(header.second); |
| 2383 } | 2382 } |
| 2384 } | 2383 } |
| 2385 | 2384 |
| 2386 } // namespace net | 2385 } // namespace net |
| OLD | NEW |