OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/quic/quic_spdy_stream.h" | 5 #include "net/quic/quic_spdy_stream.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
9 #include "net/quic/quic_bug_tracker.h" | 9 #include "net/quic/quic_bug_tracker.h" |
10 #include "net/quic/quic_spdy_session.h" | 10 #include "net/quic/quic_spdy_session.h" |
11 #include "net/quic/quic_utils.h" | 11 #include "net/quic/quic_utils.h" |
12 #include "net/quic/quic_write_blocked_list.h" | 12 #include "net/quic/quic_write_blocked_list.h" |
13 #include "net/quic/spdy_utils.h" | 13 #include "net/quic/spdy_utils.h" |
14 | 14 |
| 15 using base::IntToString; |
15 using base::StringPiece; | 16 using base::StringPiece; |
16 using net::SpdyPriority; | |
17 using std::min; | 17 using std::min; |
18 using std::string; | 18 using std::string; |
19 | 19 |
20 namespace net { | 20 namespace net { |
21 | 21 |
22 #define ENDPOINT \ | 22 #define ENDPOINT \ |
23 (session()->perspective() == Perspective::IS_SERVER ? "Server: " : "Client:" \ | 23 (session()->perspective() == Perspective::IS_SERVER ? "Server: " : "Client:" \ |
24 " ") | 24 " ") |
25 | 25 |
26 QuicSpdyStream::QuicSpdyStream(QuicStreamId id, QuicSpdySession* spdy_session) | 26 QuicSpdyStream::QuicSpdyStream(QuicStreamId id, QuicSpdySession* spdy_session) |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 if (fin_sent()) { | 94 if (fin_sent()) { |
95 QUIC_BUG << "Trailers cannot be sent after a FIN."; | 95 QUIC_BUG << "Trailers cannot be sent after a FIN."; |
96 return 0; | 96 return 0; |
97 } | 97 } |
98 | 98 |
99 // The header block must contain the final offset for this stream, as the | 99 // The header block must contain the final offset for this stream, as the |
100 // trailers may be processed out of order at the peer. | 100 // trailers may be processed out of order at the peer. |
101 DVLOG(1) << "Inserting trailer: (" << kFinalOffsetHeaderKey << ", " | 101 DVLOG(1) << "Inserting trailer: (" << kFinalOffsetHeaderKey << ", " |
102 << stream_bytes_written() + queued_data_bytes() << ")"; | 102 << stream_bytes_written() + queued_data_bytes() << ")"; |
103 SpdyHeaderBlock trailer_block_with_offset(trailer_block); | 103 SpdyHeaderBlock trailer_block_with_offset(trailer_block); |
104 trailer_block_with_offset.insert(std::make_pair( | 104 trailer_block_with_offset.insert( |
105 kFinalOffsetHeaderKey, | 105 std::make_pair(kFinalOffsetHeaderKey, |
106 base::IntToString(stream_bytes_written() + queued_data_bytes()))); | 106 IntToString(stream_bytes_written() + queued_data_bytes())))
; |
107 | 107 |
108 // Write the trailing headers with a FIN, and close stream for writing: | 108 // Write the trailing headers with a FIN, and close stream for writing: |
109 // trailers are the last thing to be sent on a stream. | 109 // trailers are the last thing to be sent on a stream. |
110 const bool kFin = true; | 110 const bool kFin = true; |
111 size_t bytes_written = spdy_session_->WriteHeaders( | 111 size_t bytes_written = spdy_session_->WriteHeaders( |
112 id(), trailer_block_with_offset, kFin, priority_, ack_notifier_delegate); | 112 id(), trailer_block_with_offset, kFin, priority_, ack_notifier_delegate); |
113 set_fin_sent(kFin); | 113 set_fin_sent(kFin); |
114 | 114 |
115 // Trailers are the last thing to be sent on a stream, but if there is still | 115 // Trailers are the last thing to be sent on a stream, but if there is still |
116 // queued data then CloseWriteSide() will cause it never to be sent. | 116 // queued data then CloseWriteSide() will cause it never to be sent. |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 visitor_ = nullptr; | 354 visitor_ = nullptr; |
355 visitor->OnClose(this); | 355 visitor->OnClose(this); |
356 } | 356 } |
357 } | 357 } |
358 | 358 |
359 bool QuicSpdyStream::FinishedReadingHeaders() const { | 359 bool QuicSpdyStream::FinishedReadingHeaders() const { |
360 return headers_decompressed_ && decompressed_headers_.empty() && | 360 return headers_decompressed_ && decompressed_headers_.empty() && |
361 header_list_.empty(); | 361 header_list_.empty(); |
362 } | 362 } |
363 | 363 |
364 bool QuicSpdyStream::ParseHeaderStatusCode(SpdyHeaderBlock* header, | 364 bool QuicSpdyStream::ParseHeaderStatusCode(const SpdyHeaderBlock& header, |
365 int* status_code) const { | 365 int* status_code) const { |
366 StringPiece status = (*header)[":status"]; | 366 SpdyHeaderBlock::const_iterator it = header.find(":status"); |
| 367 if (it == header.end()) { |
| 368 return false; |
| 369 } |
| 370 const StringPiece status(it->second); |
367 if (status.size() != 3) { | 371 if (status.size() != 3) { |
368 return false; | 372 return false; |
369 } | 373 } |
370 // First character must be an integer in range [1,5]. | 374 // First character must be an integer in range [1,5]. |
371 if (status[0] < '1' || status[0] > '5') { | 375 if (status[0] < '1' || status[0] > '5') { |
372 return false; | 376 return false; |
373 } | 377 } |
374 // The remaining two characters must be integers. | 378 // The remaining two characters must be integers. |
375 if (!isdigit(status[1]) || !isdigit(status[2])) { | 379 if (!isdigit(status[1]) || !isdigit(status[2])) { |
376 return false; | 380 return false; |
(...skipping 15 matching lines...) Expand all Loading... |
392 | 396 |
393 SpdyPriority QuicSpdyStream::priority() const { | 397 SpdyPriority QuicSpdyStream::priority() const { |
394 return priority_; | 398 return priority_; |
395 } | 399 } |
396 | 400 |
397 void QuicSpdyStream::ClearSession() { | 401 void QuicSpdyStream::ClearSession() { |
398 spdy_session_ = nullptr; | 402 spdy_session_ = nullptr; |
399 } | 403 } |
400 | 404 |
401 } // namespace net | 405 } // namespace net |
OLD | NEW |