Index: net/quic/chromium/quic_chromium_client_session.cc |
diff --git a/net/quic/chromium/quic_chromium_client_session.cc b/net/quic/chromium/quic_chromium_client_session.cc |
index e7a334289a587bff6ee4f8c3fc7457ad29395f57..0701f6a1599e92df8acaf55aff1c7af1f3c3a83b 100644 |
--- a/net/quic/chromium/quic_chromium_client_session.cc |
+++ b/net/quic/chromium/quic_chromium_client_session.cc |
@@ -186,37 +186,43 @@ class QuicServerPushHelper : public ServerPushDelegate::ServerPushHelper { |
} // namespace |
-QuicChromiumClientSession::StreamRequest::StreamRequest() : stream_(nullptr) {} |
+QuicChromiumClientSession::StreamRequest::StreamRequest( |
+ const base::WeakPtr<QuicChromiumClientSession>& session) |
+ : session_(session), stream_(nullptr) {} |
QuicChromiumClientSession::StreamRequest::~StreamRequest() { |
- CancelRequest(); |
+ if (stream_) |
+ stream_->Reset(QUIC_STREAM_CANCELLED); |
+ |
+ if (session_) |
+ session_->CancelRequest(this); |
} |
int QuicChromiumClientSession::StreamRequest::StartRequest( |
- const base::WeakPtr<QuicChromiumClientSession>& session, |
- QuicChromiumClientStream** stream, |
const CompletionCallback& callback) { |
- session_ = session; |
- stream_ = stream; |
- int rv = session_->TryCreateStream(this, stream_); |
+ DCHECK(session_); |
+ int rv = session_->TryCreateStream(this); |
if (rv == ERR_IO_PENDING) { |
callback_ = callback; |
+ } else { |
+ session_.reset(); |
} |
return rv; |
} |
-void QuicChromiumClientSession::StreamRequest::CancelRequest() { |
- if (session_) |
- session_->CancelRequest(this); |
- session_.reset(); |
- callback_.Reset(); |
+QuicChromiumClientStream* |
+QuicChromiumClientSession::StreamRequest::ReleaseStream() { |
+ DCHECK(stream_); |
+ QuicChromiumClientStream* stream = stream_; |
+ stream_ = nullptr; |
+ return stream; |
} |
void QuicChromiumClientSession::StreamRequest::OnRequestCompleteSuccess( |
QuicChromiumClientStream* stream) { |
session_.reset(); |
- *stream_ = stream; |
+ stream_ = stream; |
base::ResetAndReturn(&callback_).Run(OK); |
} |
@@ -456,9 +462,15 @@ void QuicChromiumClientSession::RemoveObserver(Observer* observer) { |
observers_.erase(observer); |
} |
-int QuicChromiumClientSession::TryCreateStream( |
- StreamRequest* request, |
- QuicChromiumClientStream** stream) { |
+std::unique_ptr<QuicChromiumClientSession::StreamRequest> |
+QuicChromiumClientSession::CreateStreamRequest() { |
+ // base::MakeUnique does not work because the StreamRequest constructor |
+ // is private. |
+ return std::unique_ptr<StreamRequest>( |
+ new StreamRequest(weak_factory_.GetWeakPtr())); |
+} |
+ |
+int QuicChromiumClientSession::TryCreateStream(StreamRequest* request) { |
if (goaway_received()) { |
DVLOG(1) << "Going away."; |
return ERR_CONNECTION_CLOSED; |
@@ -475,7 +487,7 @@ int QuicChromiumClientSession::TryCreateStream( |
} |
if (GetNumOpenOutgoingStreams() < max_open_outgoing_streams()) { |
- *stream = CreateOutgoingReliableStreamImpl(); |
+ request->stream_ = CreateOutgoingReliableStreamImpl(); |
return OK; |
} |