| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |