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

Side by Side Diff: net/quic/chromium/quic_chromium_client_stream.cc

Issue 2900533002: Add an async ReadTrailers method to QuicChromiumClientStream::Handle (Closed)
Patch Set: Rebase and fix test Created 3 years, 6 months 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/chromium/quic_chromium_client_stream.h" 5 #include "net/quic/chromium/quic_chromium_client_stream.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind_helpers.h" 9 #include "base/bind_helpers.h"
10 #include "base/callback_helpers.h" 10 #include "base/callback_helpers.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 if (!read_headers_callback_) 47 if (!read_headers_callback_)
48 return; // Wait for ReadInitialHeaders to be called. 48 return; // Wait for ReadInitialHeaders to be called.
49 49
50 int rv = ERR_QUIC_PROTOCOL_ERROR; 50 int rv = ERR_QUIC_PROTOCOL_ERROR;
51 if (!stream_->DeliverInitialHeaders(read_headers_buffer_, &rv)) 51 if (!stream_->DeliverInitialHeaders(read_headers_buffer_, &rv))
52 rv = ERR_QUIC_PROTOCOL_ERROR; 52 rv = ERR_QUIC_PROTOCOL_ERROR;
53 53
54 ResetAndReturn(&read_headers_callback_).Run(rv); 54 ResetAndReturn(&read_headers_callback_).Run(rv);
55 } 55 }
56 56
57 void QuicChromiumClientStream::Handle::OnTrailingHeadersAvailable( 57 void QuicChromiumClientStream::Handle::OnTrailingHeadersAvailable() {
58 const SpdyHeaderBlock& headers, 58 if (!read_headers_callback_)
59 size_t frame_len) { 59 return; // Wait for ReadInitialHeaders to be called.
60 delegate_->OnTrailingHeadersAvailable(headers, frame_len); 60
61 int rv = ERR_QUIC_PROTOCOL_ERROR;
62 if (!stream_->DeliverTrailingHeaders(read_headers_buffer_, &rv))
63 rv = ERR_QUIC_PROTOCOL_ERROR;
64
65 ResetAndReturn(&read_headers_callback_).Run(rv);
61 } 66 }
62 67
63 void QuicChromiumClientStream::Handle::OnDataAvailable() { 68 void QuicChromiumClientStream::Handle::OnDataAvailable() {
64 if (!read_body_callback_) 69 if (!read_body_callback_)
65 return; // Wait for ReadBody to be called. 70 return; // Wait for ReadBody to be called.
66 71
67 int rv = stream_->Read(read_body_buffer_, read_body_buffer_len_); 72 int rv = stream_->Read(read_body_buffer_, read_body_buffer_len_);
68 if (rv == ERR_IO_PENDING) 73 if (rv == ERR_IO_PENDING)
69 return; // Spurrious, likely because of trailers? 74 return; // Spurrious, likely because of trailers?
70 75
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 int rv = stream_->Read(buffer, buffer_len); 132 int rv = stream_->Read(buffer, buffer_len);
128 if (rv != ERR_IO_PENDING) 133 if (rv != ERR_IO_PENDING)
129 return rv; 134 return rv;
130 135
131 read_body_callback_ = callback; 136 read_body_callback_ = callback;
132 read_body_buffer_ = buffer; 137 read_body_buffer_ = buffer;
133 read_body_buffer_len_ = buffer_len; 138 read_body_buffer_len_ = buffer_len;
134 return ERR_IO_PENDING; 139 return ERR_IO_PENDING;
135 } 140 }
136 141
142 int QuicChromiumClientStream::Handle::ReadTrailingHeaders(
143 SpdyHeaderBlock* header_block,
144 const CompletionCallback& callback) {
145 if (!stream_)
146 return ERR_CONNECTION_CLOSED;
147
148 int frame_len = 0;
149 if (stream_->DeliverTrailingHeaders(header_block, &frame_len))
150 return frame_len;
151
152 read_headers_buffer_ = header_block;
153 read_headers_callback_ = callback;
154 return ERR_IO_PENDING;
155 }
156
137 size_t QuicChromiumClientStream::Handle::WriteHeaders( 157 size_t QuicChromiumClientStream::Handle::WriteHeaders(
138 SpdyHeaderBlock header_block, 158 SpdyHeaderBlock header_block,
139 bool fin, 159 bool fin,
140 QuicReferenceCountedPointer<QuicAckListenerInterface> 160 QuicReferenceCountedPointer<QuicAckListenerInterface>
141 ack_notifier_delegate) { 161 ack_notifier_delegate) {
142 if (!stream_) 162 if (!stream_)
143 return 0; 163 return 0;
144 return stream_->WriteHeaders(std::move(header_block), fin, 164 return stream_->WriteHeaders(std::move(header_block), fin,
145 ack_notifier_delegate); 165 ack_notifier_delegate);
146 } 166 }
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 // The handle will be notified of the headers via a posted task. 365 // The handle will be notified of the headers via a posted task.
346 NotifyHandleOfInitialHeadersAvailableLater(); 366 NotifyHandleOfInitialHeadersAvailableLater();
347 } 367 }
348 } 368 }
349 369
350 void QuicChromiumClientStream::OnTrailingHeadersComplete( 370 void QuicChromiumClientStream::OnTrailingHeadersComplete(
351 bool fin, 371 bool fin,
352 size_t frame_len, 372 size_t frame_len,
353 const QuicHeaderList& header_list) { 373 const QuicHeaderList& header_list) {
354 QuicSpdyStream::OnTrailingHeadersComplete(fin, frame_len, header_list); 374 QuicSpdyStream::OnTrailingHeadersComplete(fin, frame_len, header_list);
355 NotifyHandleOfTrailingHeadersAvailableLater(received_trailers().Clone(), 375 trailing_headers_frame_len_ = frame_len;
356 frame_len); 376 if (handle_) {
377 // The handle will be notified of the headers via a posted task.
378 NotifyHandleOfTrailingHeadersAvailableLater();
379 }
357 } 380 }
358 381
359 void QuicChromiumClientStream::OnPromiseHeaderList( 382 void QuicChromiumClientStream::OnPromiseHeaderList(
360 QuicStreamId promised_id, 383 QuicStreamId promised_id,
361 size_t frame_len, 384 size_t frame_len,
362 const QuicHeaderList& header_list) { 385 const QuicHeaderList& header_list) {
363 SpdyHeaderBlock promise_headers; 386 SpdyHeaderBlock promise_headers;
364 int64_t content_length = -1; 387 int64_t content_length = -1;
365 if (!SpdyUtils::CopyAndValidateHeaders(header_list, &content_length, 388 if (!SpdyUtils::CopyAndValidateHeaders(header_list, &content_length,
366 &promise_headers)) { 389 &promise_headers)) {
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
507 } 530 }
508 531
509 void QuicChromiumClientStream::NotifyHandleOfInitialHeadersAvailable() { 532 void QuicChromiumClientStream::NotifyHandleOfInitialHeadersAvailable() {
510 if (!handle_) 533 if (!handle_)
511 return; 534 return;
512 535
513 if (!headers_delivered_) 536 if (!headers_delivered_)
514 handle_->OnInitialHeadersAvailable(); 537 handle_->OnInitialHeadersAvailable();
515 } 538 }
516 539
517 void QuicChromiumClientStream::NotifyHandleOfTrailingHeadersAvailableLater( 540 void QuicChromiumClientStream::NotifyHandleOfTrailingHeadersAvailableLater() {
518 SpdyHeaderBlock headers,
519 size_t frame_len) {
520 DCHECK(handle_); 541 DCHECK(handle_);
521 base::ThreadTaskRunnerHandle::Get()->PostTask( 542 base::ThreadTaskRunnerHandle::Get()->PostTask(
522 FROM_HERE, 543 FROM_HERE,
523 base::Bind( 544 base::Bind(
524 &QuicChromiumClientStream::NotifyHandleOfTrailingHeadersAvailable, 545 &QuicChromiumClientStream::NotifyHandleOfTrailingHeadersAvailable,
525 weak_factory_.GetWeakPtr(), base::Passed(std::move(headers)), 546 weak_factory_.GetWeakPtr()));
526 frame_len));
527 } 547 }
528 548
529 void QuicChromiumClientStream::NotifyHandleOfTrailingHeadersAvailable( 549 void QuicChromiumClientStream::NotifyHandleOfTrailingHeadersAvailable() {
530 SpdyHeaderBlock headers,
531 size_t frame_len) {
532 if (!handle_) 550 if (!handle_)
533 return; 551 return;
534 552
535 DCHECK(headers_delivered_); 553 DCHECK(headers_delivered_);
536 // Only mark trailers consumed when we are about to notify delegate. 554 // Only mark trailers consumed when we are about to notify delegate.
537 MarkTrailersConsumed(); 555 MarkTrailersConsumed();
538 // Post an async task to notify delegate of the FIN flag. 556 // Post an async task to notify delegate of the FIN flag.
539 NotifyHandleOfDataAvailableLater(); 557 NotifyHandleOfDataAvailableLater();
540 net_log_.AddEvent( 558 handle_->OnTrailingHeadersAvailable();
541 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_TRAILERS,
542 base::Bind(&SpdyHeaderBlockNetLogCallback, &headers));
543 handle_->OnTrailingHeadersAvailable(headers, frame_len);
544 } 559 }
545 560
546 bool QuicChromiumClientStream::DeliverInitialHeaders(SpdyHeaderBlock* headers, 561 bool QuicChromiumClientStream::DeliverInitialHeaders(SpdyHeaderBlock* headers,
547 int* frame_len) { 562 int* frame_len) {
548 if (initial_headers_.empty()) 563 if (initial_headers_.empty())
549 return false; 564 return false;
550 565
551 headers_delivered_ = true; 566 headers_delivered_ = true;
552 net_log_.AddEvent( 567 net_log_.AddEvent(
553 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_HEADERS, 568 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_HEADERS,
554 base::Bind(&SpdyHeaderBlockNetLogCallback, &initial_headers_)); 569 base::Bind(&SpdyHeaderBlockNetLogCallback, &initial_headers_));
555 570
556 *headers = std::move(initial_headers_); 571 *headers = std::move(initial_headers_);
557 *frame_len = initial_headers_frame_len_; 572 *frame_len = initial_headers_frame_len_;
558 return true; 573 return true;
559 } 574 }
560 575
576 bool QuicChromiumClientStream::DeliverTrailingHeaders(SpdyHeaderBlock* headers,
577 int* frame_len) {
578 if (received_trailers().empty())
579 return false;
580
581 net_log_.AddEvent(
582 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_TRAILERS,
583 base::Bind(&SpdyHeaderBlockNetLogCallback, &received_trailers()));
584
585 *headers = received_trailers().Clone();
586 *frame_len = trailing_headers_frame_len_;
587 return true;
588 }
589
561 void QuicChromiumClientStream::NotifyHandleOfDataAvailableLater() { 590 void QuicChromiumClientStream::NotifyHandleOfDataAvailableLater() {
562 DCHECK(handle_); 591 DCHECK(handle_);
563 base::ThreadTaskRunnerHandle::Get()->PostTask( 592 base::ThreadTaskRunnerHandle::Get()->PostTask(
564 FROM_HERE, 593 FROM_HERE,
565 base::Bind(&QuicChromiumClientStream::NotifyHandleOfDataAvailable, 594 base::Bind(&QuicChromiumClientStream::NotifyHandleOfDataAvailable,
566 weak_factory_.GetWeakPtr())); 595 weak_factory_.GetWeakPtr()));
567 } 596 }
568 597
569 void QuicChromiumClientStream::NotifyHandleOfDataAvailable() { 598 void QuicChromiumClientStream::NotifyHandleOfDataAvailable() {
570 if (handle_) 599 if (handle_)
571 handle_->OnDataAvailable(); 600 handle_->OnDataAvailable();
572 } 601 }
573 602
574 void QuicChromiumClientStream::DisableConnectionMigration() { 603 void QuicChromiumClientStream::DisableConnectionMigration() {
575 can_migrate_ = false; 604 can_migrate_ = false;
576 } 605 }
577 606
578 bool QuicChromiumClientStream::IsFirstStream() { 607 bool QuicChromiumClientStream::IsFirstStream() {
579 return id() == kHeadersStreamId + 2; 608 return id() == kHeadersStreamId + 2;
580 } 609 }
581 610
582 } // namespace net 611 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698