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

Side by Side Diff: net/spdy/spdy_http_stream.cc

Issue 2298823002: Resetting the HttpRequestInfo pointers in HttpNetworkTransaction and streams (Closed)
Patch Set: Rebased, removed upload progress plumbing, feedback. (Rebased till refs/heads/master@{#417381}) Created 4 years, 3 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/spdy/spdy_http_stream.h" 5 #include "net/spdy/spdy_http_stream.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <list> 8 #include <list>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 weak_factory_.GetWeakPtr(), callback)); 92 weak_factory_.GetWeakPtr(), callback));
93 93
94 if (rv == OK) { 94 if (rv == OK) {
95 stream_ = stream_request_.ReleaseStream(); 95 stream_ = stream_request_.ReleaseStream();
96 InitializeStreamHelper(); 96 InitializeStreamHelper();
97 } 97 }
98 98
99 return rv; 99 return rv;
100 } 100 }
101 101
102 UploadProgress SpdyHttpStream::GetUploadProgress() const {
103 if (!request_info_ || !HasUploadData())
104 return UploadProgress();
105
106 return UploadProgress(request_info_->upload_data_stream->position(),
107 request_info_->upload_data_stream->size());
108 }
109
110 int SpdyHttpStream::ReadResponseHeaders(const CompletionCallback& callback) { 102 int SpdyHttpStream::ReadResponseHeaders(const CompletionCallback& callback) {
111 CHECK(!callback.is_null()); 103 CHECK(!callback.is_null());
112 if (stream_closed_) 104 if (stream_closed_)
113 return closed_stream_status_; 105 return closed_stream_status_;
114 106
115 CHECK(stream_.get()); 107 CHECK(stream_.get());
116 108
117 // Check if we already have the response headers. If so, return synchronously. 109 // Check if we already have the response headers. If so, return synchronously.
118 if (response_headers_status_ == RESPONSE_HEADERS_ARE_COMPLETE) { 110 if (response_headers_status_ == RESPONSE_HEADERS_ARE_COMPLETE) {
119 CHECK(!stream_->IsIdle()); 111 CHECK(!stream_->IsIdle());
120 return OK; 112 return OK;
121 } 113 }
122 114
123 // Still waiting for the response, return IO_PENDING. 115 // Still waiting for the response, return IO_PENDING.
124 CHECK(response_callback_.is_null()); 116 CHECK(response_callback_.is_null());
125 response_callback_ = callback; 117 response_callback_ = callback;
126 return ERR_IO_PENDING; 118 return ERR_IO_PENDING;
127 } 119 }
128 120
129 int SpdyHttpStream::ReadResponseBody( 121 int SpdyHttpStream::ReadResponseBody(
130 IOBuffer* buf, int buf_len, const CompletionCallback& callback) { 122 IOBuffer* buf, int buf_len, const CompletionCallback& callback) {
123 // Invalidate HttpRequestInfo pointer. This is to allow the stream to be
124 // shared across multiple transactions which might require this
125 // stream to outlive the request_'s owner.
126 if (request_info_)
127 ResetRequestInfo();
128
131 if (stream_.get()) 129 if (stream_.get())
132 CHECK(!stream_->IsIdle()); 130 CHECK(!stream_->IsIdle());
133 131
134 CHECK(buf); 132 CHECK(buf);
135 CHECK(buf_len); 133 CHECK(buf_len);
136 CHECK(!callback.is_null()); 134 CHECK(!callback.is_null());
137 135
138 // If we have data buffered, complete the IO immediately. 136 // If we have data buffered, complete the IO immediately.
139 if (!response_body_queue_.IsEmpty()) { 137 if (!response_body_queue_.IsEmpty()) {
140 return response_body_queue_.Dequeue(buf->data(), buf_len); 138 return response_body_queue_.Dequeue(buf->data(), buf_len);
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 void SpdyHttpStream::OnDataSent() { 366 void SpdyHttpStream::OnDataSent() {
369 request_body_buf_size_ = 0; 367 request_body_buf_size_ = 0;
370 ReadAndSendRequestBodyData(); 368 ReadAndSendRequestBodyData();
371 } 369 }
372 370
373 // TODO(xunjieli): Maybe do something with the trailers. crbug.com/422958. 371 // TODO(xunjieli): Maybe do something with the trailers. crbug.com/422958.
374 void SpdyHttpStream::OnTrailers(const SpdyHeaderBlock& trailers) {} 372 void SpdyHttpStream::OnTrailers(const SpdyHeaderBlock& trailers) {}
375 373
376 void SpdyHttpStream::OnClose(int status) { 374 void SpdyHttpStream::OnClose(int status) {
377 // Cancel any pending reads from the upload data stream. 375 // Cancel any pending reads from the upload data stream.
378 if (request_info_->upload_data_stream) 376 if (request_info_ && request_info_->upload_data_stream)
379 request_info_->upload_data_stream->Reset(); 377 request_info_->upload_data_stream->Reset();
380 378
381 if (stream_.get()) { 379 if (stream_.get()) {
382 stream_closed_ = true; 380 stream_closed_ = true;
383 closed_stream_status_ = status; 381 closed_stream_status_ = status;
384 closed_stream_id_ = stream_->stream_id(); 382 closed_stream_id_ = stream_->stream_id();
385 closed_stream_has_load_timing_info_ = 383 closed_stream_has_load_timing_info_ =
386 stream_->GetLoadTimingInfo(&closed_stream_load_timing_info_); 384 stream_->GetLoadTimingInfo(&closed_stream_load_timing_info_);
387 closed_stream_received_bytes_ = stream_->raw_received_bytes(); 385 closed_stream_received_bytes_ = stream_->raw_received_bytes();
388 closed_stream_sent_bytes_ = stream_->raw_sent_bytes(); 386 closed_stream_sent_bytes_ = stream_->raw_sent_bytes();
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 void SpdyHttpStream::PopulateNetErrorDetails(NetErrorDetails* details) { 611 void SpdyHttpStream::PopulateNetErrorDetails(NetErrorDetails* details) {
614 details->connection_info = HttpResponseInfo::CONNECTION_INFO_HTTP2; 612 details->connection_info = HttpResponseInfo::CONNECTION_INFO_HTTP2;
615 return; 613 return;
616 } 614 }
617 615
618 void SpdyHttpStream::SetPriority(RequestPriority priority) { 616 void SpdyHttpStream::SetPriority(RequestPriority priority) {
619 // TODO(akalin): Plumb this through to |stream_request_| and 617 // TODO(akalin): Plumb this through to |stream_request_| and
620 // |stream_|. 618 // |stream_|.
621 } 619 }
622 620
621 void SpdyHttpStream::ResetRequestInfo() {
622 // Only allowed when Reading of response body starts. It is safe to reset it
623 // at this point since request_->upload_data_stream is also not needed
624 // anymore.
625
626 request_info_ = nullptr;
627 }
628
623 } // namespace net 629 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698