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