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

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: Adding NET_EXPORT_PRIVATE to DelegateInterface. 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, 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, &timestamp)) { 257 if (!sequencer()->GetReadableRegion(&iov, &timestamp)) {
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698