Index: net/quic/bidirectional_stream_quic_impl.cc |
diff --git a/net/quic/bidirectional_stream_quic_impl.cc b/net/quic/bidirectional_stream_quic_impl.cc |
deleted file mode 100644 |
index e7ba39016808ac1f202526f740163810fa3fd1de..0000000000000000000000000000000000000000 |
--- a/net/quic/bidirectional_stream_quic_impl.cc |
+++ /dev/null |
@@ -1,262 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/quic/bidirectional_stream_quic_impl.h" |
- |
-#include "base/bind.h" |
-#include "base/location.h" |
-#include "base/logging.h" |
-#include "base/timer/timer.h" |
-#include "net/http/bidirectional_stream_request_info.h" |
-#include "net/socket/next_proto.h" |
-#include "net/spdy/spdy_header_block.h" |
-#include "net/spdy/spdy_http_utils.h" |
- |
-namespace net { |
- |
-BidirectionalStreamQuicImpl::BidirectionalStreamQuicImpl( |
- const base::WeakPtr<QuicChromiumClientSession>& session) |
- : session_(session), |
- was_handshake_confirmed_(session->IsCryptoHandshakeConfirmed()), |
- stream_(nullptr), |
- request_info_(nullptr), |
- delegate_(nullptr), |
- response_status_(OK), |
- negotiated_protocol_(kProtoUnknown), |
- read_buffer_len_(0), |
- headers_bytes_received_(0), |
- headers_bytes_sent_(0), |
- closed_stream_received_bytes_(0), |
- closed_stream_sent_bytes_(0), |
- has_sent_headers_(false), |
- has_received_headers_(false), |
- weak_factory_(this) { |
- DCHECK(session_); |
- session_->AddObserver(this); |
-} |
- |
-BidirectionalStreamQuicImpl::~BidirectionalStreamQuicImpl() { |
- Cancel(); |
- if (session_) |
- session_->RemoveObserver(this); |
-} |
- |
-void BidirectionalStreamQuicImpl::Start( |
- const BidirectionalStreamRequestInfo* request_info, |
- const BoundNetLog& net_log, |
- BidirectionalStreamJob::Delegate* delegate, |
- scoped_ptr<base::Timer> /* timer */) { |
- DCHECK(!stream_); |
- |
- if (!session_) { |
- NotifyError(was_handshake_confirmed_ ? ERR_QUIC_PROTOCOL_ERROR |
- : ERR_QUIC_HANDSHAKE_FAILED); |
- return; |
- } |
- |
- delegate_ = delegate; |
- request_info_ = request_info; |
- |
- int rv = stream_request_.StartRequest( |
- session_, &stream_, |
- base::Bind(&BidirectionalStreamQuicImpl::OnStreamReady, |
- weak_factory_.GetWeakPtr())); |
- if (rv == OK) { |
- OnStreamReady(rv); |
- } else if (!was_handshake_confirmed_) { |
- NotifyError(ERR_QUIC_HANDSHAKE_FAILED); |
- } |
-} |
- |
-int BidirectionalStreamQuicImpl::ReadData(IOBuffer* buffer, int buffer_len) { |
- DCHECK(buffer); |
- DCHECK(buffer_len); |
- |
- if (!stream_) { |
- // If the stream is already closed, there is no body to read. |
- return response_status_; |
- } |
- int rv = stream_->Read(buffer, buffer_len); |
- if (rv != ERR_IO_PENDING) { |
- if (stream_->IsDoneReading()) { |
- // If the write side is closed, OnFinRead() will call |
- // BidirectionalStreamQuicImpl::OnClose(). |
- stream_->OnFinRead(); |
- } |
- return rv; |
- } |
- // Read will complete asynchronously and Delegate::OnReadCompleted will be |
- // called upon completion. |
- read_buffer_ = buffer; |
- read_buffer_len_ = buffer_len; |
- return ERR_IO_PENDING; |
-} |
- |
-void BidirectionalStreamQuicImpl::SendData(IOBuffer* data, |
- int length, |
- bool end_stream) { |
- DCHECK(stream_); |
- DCHECK(length > 0 || (length == 0 && end_stream)); |
- |
- base::StringPiece string_data(data->data(), length); |
- int rv = stream_->WriteStreamData( |
- string_data, end_stream, |
- base::Bind(&BidirectionalStreamQuicImpl::OnSendDataComplete, |
- weak_factory_.GetWeakPtr())); |
- DCHECK(rv == OK || rv == ERR_IO_PENDING); |
- if (rv == OK) { |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, base::Bind(&BidirectionalStreamQuicImpl::OnSendDataComplete, |
- weak_factory_.GetWeakPtr(), OK)); |
- } |
-} |
- |
-void BidirectionalStreamQuicImpl::Cancel() { |
- if (stream_) { |
- stream_->SetDelegate(nullptr); |
- stream_->Reset(QUIC_STREAM_CANCELLED); |
- ResetStream(); |
- } |
-} |
- |
-NextProto BidirectionalStreamQuicImpl::GetProtocol() const { |
- return negotiated_protocol_; |
-} |
- |
-int64_t BidirectionalStreamQuicImpl::GetTotalReceivedBytes() const { |
- if (stream_) |
- return headers_bytes_received_ + stream_->stream_bytes_read(); |
- return headers_bytes_received_ + closed_stream_received_bytes_; |
-} |
- |
-int64_t BidirectionalStreamQuicImpl::GetTotalSentBytes() const { |
- if (stream_) |
- return headers_bytes_sent_ + stream_->stream_bytes_written(); |
- return headers_bytes_sent_ + closed_stream_sent_bytes_; |
-} |
- |
-void BidirectionalStreamQuicImpl::OnHeadersAvailable( |
- const SpdyHeaderBlock& headers, |
- size_t frame_len) { |
- headers_bytes_received_ += frame_len; |
- negotiated_protocol_ = kProtoQUIC1SPDY3; |
- if (!has_received_headers_) { |
- has_received_headers_ = true; |
- delegate_->OnHeadersReceived(headers); |
- } else { |
- if (stream_->IsDoneReading()) { |
- // If the write side is closed, OnFinRead() will call |
- // BidirectionalStreamQuicImpl::OnClose(). |
- stream_->OnFinRead(); |
- } |
- delegate_->OnTrailersReceived(headers); |
- } |
-} |
- |
-void BidirectionalStreamQuicImpl::OnDataAvailable() { |
- // Return early if ReadData has not been called. |
- if (!read_buffer_) |
- return; |
- |
- CHECK(read_buffer_); |
- CHECK_NE(0, read_buffer_len_); |
- int rv = ReadData(read_buffer_.get(), read_buffer_len_); |
- if (rv == ERR_IO_PENDING) { |
- // Spurrious notification. Wait for the next one. |
- return; |
- } |
- read_buffer_ = nullptr; |
- read_buffer_len_ = 0; |
- delegate_->OnDataRead(rv); |
-} |
- |
-void BidirectionalStreamQuicImpl::OnClose(QuicErrorCode error) { |
- DCHECK(stream_); |
- if (error == QUIC_NO_ERROR && |
- stream_->stream_error() == QUIC_STREAM_NO_ERROR) { |
- ResetStream(); |
- return; |
- } |
- ResetStream(); |
- NotifyError(was_handshake_confirmed_ ? ERR_QUIC_PROTOCOL_ERROR |
- : ERR_QUIC_HANDSHAKE_FAILED); |
-} |
- |
-void BidirectionalStreamQuicImpl::OnError(int error) { |
- NotifyError(error); |
-} |
- |
-bool BidirectionalStreamQuicImpl::HasSendHeadersComplete() { |
- return has_sent_headers_; |
-} |
- |
-void BidirectionalStreamQuicImpl::OnCryptoHandshakeConfirmed() { |
- was_handshake_confirmed_ = true; |
-} |
- |
-void BidirectionalStreamQuicImpl::OnSessionClosed(int error) { |
- DCHECK_NE(OK, error); |
- session_.reset(); |
- NotifyError(error); |
-} |
- |
-void BidirectionalStreamQuicImpl::OnStreamReady(int rv) { |
- DCHECK_NE(ERR_IO_PENDING, rv); |
- DCHECK(rv == OK || !stream_); |
- if (rv == OK) { |
- stream_->SetDelegate(this); |
- SendRequestHeaders(); |
- } else { |
- NotifyError(rv); |
- } |
-} |
- |
-void BidirectionalStreamQuicImpl::OnSendDataComplete(int rv) { |
- DCHECK(rv == OK || !stream_); |
- if (rv == OK) { |
- delegate_->OnDataSent(); |
- } else { |
- NotifyError(rv); |
- } |
-} |
- |
-void BidirectionalStreamQuicImpl::SendRequestHeaders() { |
- DCHECK(!has_sent_headers_); |
- DCHECK(stream_); |
- |
- SpdyHeaderBlock headers; |
- HttpRequestInfo http_request_info; |
- http_request_info.url = request_info_->url; |
- http_request_info.method = request_info_->method; |
- http_request_info.extra_headers = request_info_->extra_headers; |
- |
- CreateSpdyHeadersFromHttpRequest(http_request_info, |
- http_request_info.extra_headers, HTTP2, true, |
- &headers); |
- size_t frame_len = stream_->WriteHeaders( |
- headers, request_info_->end_stream_on_headers, nullptr); |
- headers_bytes_sent_ += frame_len; |
- has_sent_headers_ = true; |
- delegate_->OnHeadersSent(); |
-} |
- |
-void BidirectionalStreamQuicImpl::NotifyError(int error) { |
- DCHECK_NE(OK, error); |
- DCHECK_NE(ERR_IO_PENDING, error); |
- |
- response_status_ = error; |
- ResetStream(); |
- delegate_->OnFailed(error); |
-} |
- |
-void BidirectionalStreamQuicImpl::ResetStream() { |
- if (!stream_) |
- return; |
- closed_stream_received_bytes_ = stream_->stream_bytes_read(); |
- closed_stream_sent_bytes_ = stream_->stream_bytes_written(); |
- stream_->SetDelegate(nullptr); |
- stream_ = nullptr; |
-} |
- |
-} // namespace net |