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/tools/quic/quic_spdy_client_stream.h" | 5 #include "net/tools/quic/quic_spdy_client_stream.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 | 35 |
36 void QuicSpdyClientStream::OnStreamFrame(const QuicStreamFrame& frame) { | 36 void QuicSpdyClientStream::OnStreamFrame(const QuicStreamFrame& frame) { |
37 if (!allow_bidirectional_data() && !write_side_closed()) { | 37 if (!allow_bidirectional_data() && !write_side_closed()) { |
38 DVLOG(1) << "Got a response before the request was complete. " | 38 DVLOG(1) << "Got a response before the request was complete. " |
39 << "Aborting request."; | 39 << "Aborting request."; |
40 CloseWriteSide(); | 40 CloseWriteSide(); |
41 } | 41 } |
42 QuicSpdyStream::OnStreamFrame(frame); | 42 QuicSpdyStream::OnStreamFrame(frame); |
43 } | 43 } |
44 | 44 |
45 void QuicSpdyClientStream::OnInitialHeadersComplete(bool fin, | |
46 size_t frame_len) { | |
47 QuicSpdyStream::OnInitialHeadersComplete(fin, frame_len); | |
48 | |
49 DCHECK(headers_decompressed()); | |
50 header_bytes_read_ += frame_len; | |
51 if (!SpdyUtils::ParseHeaders(decompressed_headers().data(), | |
52 decompressed_headers().length(), | |
53 &content_length_, &response_headers_)) { | |
54 DLOG(ERROR) << "Failed to parse headers: " << decompressed_headers(); | |
55 Reset(QUIC_BAD_APPLICATION_PAYLOAD); | |
56 return; | |
57 } | |
58 | |
59 if (!ParseHeaderStatusCode(response_headers_, &response_code_)) { | |
60 DLOG(ERROR) << "Received invalid response code: " | |
61 << response_headers_[":status"].as_string(); | |
62 Reset(QUIC_BAD_APPLICATION_PAYLOAD); | |
63 return; | |
64 } | |
65 | |
66 MarkHeadersConsumed(decompressed_headers().length()); | |
67 DVLOG(1) << "headers complete for stream " << id(); | |
68 | |
69 session_->OnInitialHeadersComplete(id(), response_headers_); | |
70 } | |
71 | |
72 void QuicSpdyClientStream::OnInitialHeadersComplete( | 45 void QuicSpdyClientStream::OnInitialHeadersComplete( |
73 bool fin, | 46 bool fin, |
74 size_t frame_len, | 47 size_t frame_len, |
75 const QuicHeaderList& header_list) { | 48 const QuicHeaderList& header_list) { |
76 QuicSpdyStream::OnInitialHeadersComplete(fin, frame_len, header_list); | 49 QuicSpdyStream::OnInitialHeadersComplete(fin, frame_len, header_list); |
77 | 50 |
78 DCHECK(headers_decompressed()); | 51 DCHECK(headers_decompressed()); |
79 header_bytes_read_ += frame_len; | 52 header_bytes_read_ += frame_len; |
80 if (!SpdyUtils::CopyAndValidateHeaders(header_list, &content_length_, | 53 if (!SpdyUtils::CopyAndValidateHeaders(header_list, &content_length_, |
81 &response_headers_)) { | 54 &response_headers_)) { |
(...skipping 16 matching lines...) Expand all Loading... |
98 } | 71 } |
99 | 72 |
100 void QuicSpdyClientStream::OnTrailingHeadersComplete( | 73 void QuicSpdyClientStream::OnTrailingHeadersComplete( |
101 bool fin, | 74 bool fin, |
102 size_t frame_len, | 75 size_t frame_len, |
103 const QuicHeaderList& header_list) { | 76 const QuicHeaderList& header_list) { |
104 QuicSpdyStream::OnTrailingHeadersComplete(fin, frame_len, header_list); | 77 QuicSpdyStream::OnTrailingHeadersComplete(fin, frame_len, header_list); |
105 MarkTrailersConsumed(); | 78 MarkTrailersConsumed(); |
106 } | 79 } |
107 | 80 |
108 void QuicSpdyClientStream::OnPromiseHeadersComplete(QuicStreamId promised_id, | |
109 size_t frame_len) { | |
110 header_bytes_read_ += frame_len; | |
111 int64_t content_length = -1; | |
112 SpdyHeaderBlock promise_headers; | |
113 if (!SpdyUtils::ParseHeaders(decompressed_headers().data(), | |
114 decompressed_headers().length(), &content_length, | |
115 &promise_headers)) { | |
116 DLOG(ERROR) << "Failed to parse promise headers: " | |
117 << decompressed_headers(); | |
118 Reset(QUIC_BAD_APPLICATION_PAYLOAD); | |
119 return; | |
120 } | |
121 MarkHeadersConsumed(decompressed_headers().length()); | |
122 | |
123 session_->HandlePromised(id(), promised_id, promise_headers); | |
124 if (visitor() != nullptr) { | |
125 visitor()->OnPromiseHeadersComplete(promised_id, frame_len); | |
126 } | |
127 } | |
128 | |
129 void QuicSpdyClientStream::OnPromiseHeaderList( | 81 void QuicSpdyClientStream::OnPromiseHeaderList( |
130 QuicStreamId promised_id, | 82 QuicStreamId promised_id, |
131 size_t frame_len, | 83 size_t frame_len, |
132 const QuicHeaderList& header_list) { | 84 const QuicHeaderList& header_list) { |
133 header_bytes_read_ += frame_len; | 85 header_bytes_read_ += frame_len; |
134 int64_t content_length = -1; | 86 int64_t content_length = -1; |
135 SpdyHeaderBlock promise_headers; | 87 SpdyHeaderBlock promise_headers; |
136 if (!SpdyUtils::CopyAndValidateHeaders(header_list, &content_length, | 88 if (!SpdyUtils::CopyAndValidateHeaders(header_list, &content_length, |
137 &promise_headers)) { | 89 &promise_headers)) { |
138 DLOG(ERROR) << "Failed to parse promise headers: " | 90 DLOG(ERROR) << "Failed to parse promise headers: " |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 bytes_sent += header_bytes_written_; | 141 bytes_sent += header_bytes_written_; |
190 | 142 |
191 if (!body.empty()) { | 143 if (!body.empty()) { |
192 WriteOrBufferData(body, fin, nullptr); | 144 WriteOrBufferData(body, fin, nullptr); |
193 } | 145 } |
194 | 146 |
195 return bytes_sent; | 147 return bytes_sent; |
196 } | 148 } |
197 | 149 |
198 } // namespace net | 150 } // namespace net |
OLD | NEW |