| 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 |