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_headers_stream.h" | 5 #include "net/quic/quic_headers_stream.h" |
6 | 6 |
7 #include "base/metrics/histogram_macros.h" | 7 #include "base/metrics/histogram_macros.h" |
8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
9 #include "net/quic/quic_flags.h" | 9 #include "net/quic/quic_flags.h" |
10 #include "net/quic/quic_headers_stream.h" | 10 #include "net/quic/quic_headers_stream.h" |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 spdy_framer_(HTTP2), | 197 spdy_framer_(HTTP2), |
198 spdy_framer_visitor_(new SpdyFramerVisitor(this)) { | 198 spdy_framer_visitor_(new SpdyFramerVisitor(this)) { |
199 spdy_framer_.set_visitor(spdy_framer_visitor_.get()); | 199 spdy_framer_.set_visitor(spdy_framer_visitor_.get()); |
200 spdy_framer_.set_debug_visitor(spdy_framer_visitor_.get()); | 200 spdy_framer_.set_debug_visitor(spdy_framer_visitor_.get()); |
201 // The headers stream is exempt from connection level flow control. | 201 // The headers stream is exempt from connection level flow control. |
202 DisableConnectionFlowControlForThisStream(); | 202 DisableConnectionFlowControlForThisStream(); |
203 } | 203 } |
204 | 204 |
205 QuicHeadersStream::~QuicHeadersStream() {} | 205 QuicHeadersStream::~QuicHeadersStream() {} |
206 | 206 |
207 size_t QuicHeadersStream::WriteHeaders( | 207 size_t QuicHeadersStream::WriteHeaders(QuicStreamId stream_id, |
208 QuicStreamId stream_id, | 208 const SpdyHeaderBlock& headers, |
209 const SpdyHeaderBlock& headers, | 209 bool fin, |
210 bool fin, | 210 SpdyPriority priority, |
211 QuicPriority priority, | 211 QuicAckListenerInterface* ack_listener) { |
212 QuicAckListenerInterface* ack_notifier_delegate) { | |
213 SpdyHeadersIR headers_frame(stream_id); | 212 SpdyHeadersIR headers_frame(stream_id); |
214 headers_frame.set_header_block(headers); | 213 headers_frame.set_header_block(headers); |
215 headers_frame.set_fin(fin); | 214 headers_frame.set_fin(fin); |
216 if (session()->perspective() == Perspective::IS_CLIENT) { | 215 if (session()->perspective() == Perspective::IS_CLIENT) { |
217 headers_frame.set_has_priority(true); | 216 headers_frame.set_has_priority(true); |
218 headers_frame.set_priority(priority); | 217 headers_frame.set_priority(priority); |
219 } | 218 } |
220 scoped_ptr<SpdySerializedFrame> frame( | 219 scoped_ptr<SpdySerializedFrame> frame( |
221 spdy_framer_.SerializeFrame(headers_frame)); | 220 spdy_framer_.SerializeFrame(headers_frame)); |
222 WriteOrBufferData(StringPiece(frame->data(), frame->size()), false, | 221 WriteOrBufferData(StringPiece(frame->data(), frame->size()), false, |
223 ack_notifier_delegate); | 222 ack_listener); |
224 return frame->size(); | 223 return frame->size(); |
225 } | 224 } |
226 | 225 |
| 226 size_t QuicHeadersStream::WritePushPromise( |
| 227 QuicStreamId original_stream_id, |
| 228 QuicStreamId promised_stream_id, |
| 229 const SpdyHeaderBlock& headers, |
| 230 QuicAckListenerInterface* ack_listener) { |
| 231 if (session()->perspective() == Perspective::IS_CLIENT) { |
| 232 LOG(DFATAL) << "Client shouldn't send PUSH_PROMISE"; |
| 233 return 0; |
| 234 } |
| 235 |
| 236 SpdyPushPromiseIR push_promise(original_stream_id, promised_stream_id); |
| 237 push_promise.set_header_block(headers); |
| 238 // PUSH_PROMISE must not be the last frame sent out, at least followed by |
| 239 // response headers. |
| 240 push_promise.set_fin(false); |
| 241 |
| 242 scoped_ptr<SpdySerializedFrame> frame( |
| 243 spdy_framer_.SerializeFrame(push_promise)); |
| 244 WriteOrBufferData(StringPiece(frame->data(), frame->size()), false, |
| 245 ack_listener); |
| 246 return frame->size(); |
| 247 } |
| 248 |
227 void QuicHeadersStream::OnDataAvailable() { | 249 void QuicHeadersStream::OnDataAvailable() { |
228 char buffer[1024]; | 250 char buffer[1024]; |
229 struct iovec iov; | 251 struct iovec iov; |
230 QuicTime timestamp(QuicTime::Zero()); | 252 QuicTime timestamp(QuicTime::Zero()); |
231 while (true) { | 253 while (true) { |
232 iov.iov_base = buffer; | 254 iov.iov_base = buffer; |
233 iov.iov_len = arraysize(buffer); | 255 iov.iov_len = arraysize(buffer); |
234 if (measure_headers_hol_blocking_time_) { | 256 if (measure_headers_hol_blocking_time_) { |
235 if (!sequencer()->GetReadableRegion(&iov, ×tamp)) { | 257 if (!sequencer()->GetReadableRegion(&iov, ×tamp)) { |
236 // No more data to read. | 258 // No more data to read. |
237 break; | 259 break; |
238 } | 260 } |
239 DCHECK(timestamp.IsInitialized()); | 261 DCHECK(timestamp.IsInitialized()); |
240 cur_max_timestamp_ = QuicTime::Max(timestamp, cur_max_timestamp_); | 262 cur_max_timestamp_ = QuicTime::Max(timestamp, cur_max_timestamp_); |
241 } else { | 263 } else { |
242 if (sequencer()->GetReadableRegions(&iov, 1) != 1) { | 264 if (sequencer()->GetReadableRegions(&iov, 1) != 1) { |
243 // No more data to read. | 265 // No more data to read. |
244 break; | 266 break; |
245 } | 267 } |
246 } | 268 } |
247 if (spdy_framer_.ProcessInput(static_cast<char*>(iov.iov_base), | 269 if (spdy_framer_.ProcessInput(static_cast<char*>(iov.iov_base), |
248 iov.iov_len) != iov.iov_len) { | 270 iov.iov_len) != iov.iov_len) { |
249 // Error processing data. | 271 // Error processing data. |
250 return; | 272 return; |
251 } | 273 } |
252 sequencer()->MarkConsumed(iov.iov_len); | 274 sequencer()->MarkConsumed(iov.iov_len); |
253 } | 275 } |
254 } | 276 } |
255 | 277 |
256 QuicPriority QuicHeadersStream::EffectivePriority() const { return 0; } | 278 SpdyPriority QuicHeadersStream::Priority() const { |
| 279 return net::kHighestPriority; // The smallest priority is also the highest |
| 280 } |
257 | 281 |
258 void QuicHeadersStream::OnSynStream(SpdyStreamId stream_id, | 282 void QuicHeadersStream::OnSynStream(SpdyStreamId stream_id, |
259 SpdyPriority priority, | 283 SpdyPriority priority, |
260 bool fin) { | 284 bool fin) { |
261 if (session()->perspective() == Perspective::IS_CLIENT) { | 285 if (session()->perspective() == Perspective::IS_CLIENT) { |
262 CloseConnectionWithDetails( | 286 CloseConnectionWithDetails( |
263 QUIC_INVALID_HEADERS_STREAM_DATA, | 287 QUIC_INVALID_HEADERS_STREAM_DATA, |
264 "SPDY SYN_STREAM frame received at the client"); | 288 "SPDY SYN_STREAM frame received at the client"); |
265 return; | 289 return; |
266 } | 290 } |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 | 340 |
317 void QuicHeadersStream::OnCompressedFrameSize(size_t frame_len) { | 341 void QuicHeadersStream::OnCompressedFrameSize(size_t frame_len) { |
318 frame_len_ += frame_len; | 342 frame_len_ += frame_len; |
319 } | 343 } |
320 | 344 |
321 bool QuicHeadersStream::IsConnected() { | 345 bool QuicHeadersStream::IsConnected() { |
322 return session()->connection()->connected(); | 346 return session()->connection()->connected(); |
323 } | 347 } |
324 | 348 |
325 } // namespace net | 349 } // namespace net |
OLD | NEW |