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 SpdyPriority 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, |
| 237 promised_stream_id); |
| 238 push_promise.set_header_block(headers); |
| 239 // PUSH_PROMISE must not be the last frame sent out, at least followed by |
| 240 // response headers. |
| 241 push_promise.set_fin(false); |
| 242 |
| 243 scoped_ptr<SpdySerializedFrame> frame( |
| 244 spdy_framer_.SerializeFrame(push_promise)); |
| 245 WriteOrBufferData(StringPiece(frame->data(), frame->size()), false, |
| 246 ack_listener); |
| 247 return frame->size(); |
| 248 } |
| 249 |
227 void QuicHeadersStream::OnDataAvailable() { | 250 void QuicHeadersStream::OnDataAvailable() { |
228 char buffer[1024]; | 251 char buffer[1024]; |
229 struct iovec iov; | 252 struct iovec iov; |
230 QuicTime timestamp(QuicTime::Zero()); | 253 QuicTime timestamp(QuicTime::Zero()); |
231 while (true) { | 254 while (true) { |
232 iov.iov_base = buffer; | 255 iov.iov_base = buffer; |
233 iov.iov_len = arraysize(buffer); | 256 iov.iov_len = arraysize(buffer); |
234 if (measure_headers_hol_blocking_time_) { | 257 if (measure_headers_hol_blocking_time_) { |
235 if (!sequencer()->GetReadableRegion(&iov, ×tamp)) { | 258 if (!sequencer()->GetReadableRegion(&iov, ×tamp)) { |
236 // No more data to read. | 259 // No more data to read. |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 | 341 |
319 void QuicHeadersStream::OnCompressedFrameSize(size_t frame_len) { | 342 void QuicHeadersStream::OnCompressedFrameSize(size_t frame_len) { |
320 frame_len_ += frame_len; | 343 frame_len_ += frame_len; |
321 } | 344 } |
322 | 345 |
323 bool QuicHeadersStream::IsConnected() { | 346 bool QuicHeadersStream::IsConnected() { |
324 return session()->connection()->connected(); | 347 return session()->connection()->connected(); |
325 } | 348 } |
326 | 349 |
327 } // namespace net | 350 } // namespace net |
OLD | NEW |