Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(747)

Side by Side Diff: net/quic/quic_headers_stream.cc

Issue 1470713003: Landing Recent QUIC changes until and including Mon Nov 16 14:15:48 2015 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review feedback fixes in quic_connection.cc, quic_connection_test.cc and quic_server_bin.cc. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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,
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, &timestamp)) { 258 if (!sequencer()->GetReadableRegion(&iov, &timestamp)) {
236 // No more data to read. 259 // No more data to read.
237 break; 260 break;
238 } 261 }
239 DCHECK(timestamp.IsInitialized()); 262 DCHECK(timestamp.IsInitialized());
240 cur_max_timestamp_ = QuicTime::Max(timestamp, cur_max_timestamp_); 263 cur_max_timestamp_ = QuicTime::Max(timestamp, cur_max_timestamp_);
241 } else { 264 } else {
242 if (sequencer()->GetReadableRegions(&iov, 1) != 1) { 265 if (sequencer()->GetReadableRegions(&iov, 1) != 1) {
243 // No more data to read. 266 // No more data to read.
244 break; 267 break;
245 } 268 }
246 } 269 }
247 if (spdy_framer_.ProcessInput(static_cast<char*>(iov.iov_base), 270 if (spdy_framer_.ProcessInput(static_cast<char*>(iov.iov_base),
248 iov.iov_len) != iov.iov_len) { 271 iov.iov_len) != iov.iov_len) {
249 // Error processing data. 272 // Error processing data.
250 return; 273 return;
251 } 274 }
252 sequencer()->MarkConsumed(iov.iov_len); 275 sequencer()->MarkConsumed(iov.iov_len);
253 } 276 }
254 } 277 }
255 278
256 QuicPriority QuicHeadersStream::EffectivePriority() const { return 0; } 279 SpdyPriority QuicHeadersStream::Priority() const {
280 return net::kHighestPriority; // The smallest priority is also the highest
281 }
257 282
258 void QuicHeadersStream::OnSynStream(SpdyStreamId stream_id, 283 void QuicHeadersStream::OnSynStream(SpdyStreamId stream_id,
259 SpdyPriority priority, 284 SpdyPriority priority,
260 bool fin) { 285 bool fin) {
261 if (session()->perspective() == Perspective::IS_CLIENT) { 286 if (session()->perspective() == Perspective::IS_CLIENT) {
262 CloseConnectionWithDetails( 287 CloseConnectionWithDetails(
263 QUIC_INVALID_HEADERS_STREAM_DATA, 288 QUIC_INVALID_HEADERS_STREAM_DATA,
264 "SPDY SYN_STREAM frame received at the client"); 289 "SPDY SYN_STREAM frame received at the client");
265 return; 290 return;
266 } 291 }
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 341
317 void QuicHeadersStream::OnCompressedFrameSize(size_t frame_len) { 342 void QuicHeadersStream::OnCompressedFrameSize(size_t frame_len) {
318 frame_len_ += frame_len; 343 frame_len_ += frame_len;
319 } 344 }
320 345
321 bool QuicHeadersStream::IsConnected() { 346 bool QuicHeadersStream::IsConnected() {
322 return session()->connection()->connected(); 347 return session()->connection()->connected();
323 } 348 }
324 349
325 } // namespace net 350 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698