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

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

Issue 338583003: Cancel posted write callbacks in Disconnect(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix a comment. Created 6 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 | Annotate | Revision Log
« no previous file with comments | « net/spdy/spdy_proxy_client_socket.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_proxy_client_socket.h" 5 #include "net/spdy/spdy_proxy_client_socket.h"
6 6
7 #include <algorithm> // min 7 #include <algorithm> // min
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 18 matching lines...) Expand all
29 const std::string& user_agent, 29 const std::string& user_agent,
30 const HostPortPair& endpoint, 30 const HostPortPair& endpoint,
31 const GURL& url, 31 const GURL& url,
32 const HostPortPair& proxy_server, 32 const HostPortPair& proxy_server,
33 const BoundNetLog& source_net_log, 33 const BoundNetLog& source_net_log,
34 HttpAuthCache* auth_cache, 34 HttpAuthCache* auth_cache,
35 HttpAuthHandlerFactory* auth_handler_factory) 35 HttpAuthHandlerFactory* auth_handler_factory)
36 : next_state_(STATE_DISCONNECTED), 36 : next_state_(STATE_DISCONNECTED),
37 spdy_stream_(spdy_stream), 37 spdy_stream_(spdy_stream),
38 endpoint_(endpoint), 38 endpoint_(endpoint),
39 auth_( 39 auth_(new HttpAuthController(HttpAuth::AUTH_PROXY,
40 new HttpAuthController(HttpAuth::AUTH_PROXY, 40 GURL("https://" + proxy_server.ToString()),
41 GURL("https://" + proxy_server.ToString()), 41 auth_cache,
42 auth_cache, 42 auth_handler_factory)),
43 auth_handler_factory)),
44 user_buffer_len_(0), 43 user_buffer_len_(0),
45 write_buffer_len_(0), 44 write_buffer_len_(0),
46 was_ever_used_(false), 45 was_ever_used_(false),
47 redirect_has_load_timing_info_(false), 46 redirect_has_load_timing_info_(false),
48 net_log_(BoundNetLog::Make(spdy_stream->net_log().net_log(), 47 net_log_(BoundNetLog::Make(spdy_stream->net_log().net_log(),
49 NetLog::SOURCE_PROXY_CLIENT_SOCKET)), 48 NetLog::SOURCE_PROXY_CLIENT_SOCKET)),
50 weak_factory_(this) { 49 weak_factory_(this),
50 write_callback_weak_factory_(this) {
51 request_.method = "CONNECT"; 51 request_.method = "CONNECT";
52 request_.url = url; 52 request_.url = url;
53 if (!user_agent.empty()) 53 if (!user_agent.empty())
54 request_.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, 54 request_.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent,
55 user_agent); 55 user_agent);
56 56
57 net_log_.BeginEvent(NetLog::TYPE_SOCKET_ALIVE, 57 net_log_.BeginEvent(NetLog::TYPE_SOCKET_ALIVE,
58 source_net_log.source().ToEventParametersCallback()); 58 source_net_log.source().ToEventParametersCallback());
59 net_log_.AddEvent( 59 net_log_.AddEvent(
60 NetLog::TYPE_SPDY_PROXY_CLIENT_SESSION, 60 NetLog::TYPE_SPDY_PROXY_CLIENT_SESSION,
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 } 130 }
131 131
132 void SpdyProxyClientSocket::Disconnect() { 132 void SpdyProxyClientSocket::Disconnect() {
133 read_buffer_queue_.Clear(); 133 read_buffer_queue_.Clear();
134 user_buffer_ = NULL; 134 user_buffer_ = NULL;
135 user_buffer_len_ = 0; 135 user_buffer_len_ = 0;
136 read_callback_.Reset(); 136 read_callback_.Reset();
137 137
138 write_buffer_len_ = 0; 138 write_buffer_len_ = 0;
139 write_callback_.Reset(); 139 write_callback_.Reset();
140 write_callback_weak_factory_.InvalidateWeakPtrs();
140 141
141 next_state_ = STATE_DISCONNECTED; 142 next_state_ = STATE_DISCONNECTED;
142 143
143 if (spdy_stream_.get()) { 144 if (spdy_stream_.get()) {
144 // This will cause OnClose to be invoked, which takes care of 145 // This will cause OnClose to be invoked, which takes care of
145 // cleaning up all the internal state. 146 // cleaning up all the internal state.
146 spdy_stream_->Cancel(); 147 spdy_stream_->Cancel();
147 DCHECK(!spdy_stream_.get()); 148 DCHECK(!spdy_stream_.get());
148 } 149 }
149 } 150 }
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 return spdy_stream_->GetLocalAddress(address); 262 return spdy_stream_->GetLocalAddress(address);
262 } 263 }
263 264
264 void SpdyProxyClientSocket::LogBlockedTunnelResponse() const { 265 void SpdyProxyClientSocket::LogBlockedTunnelResponse() const {
265 ProxyClientSocket::LogBlockedTunnelResponse( 266 ProxyClientSocket::LogBlockedTunnelResponse(
266 response_.headers->response_code(), 267 response_.headers->response_code(),
267 request_.url, 268 request_.url,
268 /* is_https_proxy = */ true); 269 /* is_https_proxy = */ true);
269 } 270 }
270 271
272 void SpdyProxyClientSocket::RunCallback(const CompletionCallback& callback,
273 int result) const {
274 callback.Run(result);
275 }
276
271 void SpdyProxyClientSocket::OnIOComplete(int result) { 277 void SpdyProxyClientSocket::OnIOComplete(int result) {
272 DCHECK_NE(STATE_DISCONNECTED, next_state_); 278 DCHECK_NE(STATE_DISCONNECTED, next_state_);
273 int rv = DoLoop(result); 279 int rv = DoLoop(result);
274 if (rv != ERR_IO_PENDING) { 280 if (rv != ERR_IO_PENDING) {
275 CompletionCallback c = read_callback_; 281 CompletionCallback c = read_callback_;
276 read_callback_.Reset(); 282 read_callback_.Reset();
277 c.Run(rv); 283 c.Run(rv);
278 } 284 }
279 } 285 }
280 286
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
481 void SpdyProxyClientSocket::OnDataSent() { 487 void SpdyProxyClientSocket::OnDataSent() {
482 DCHECK(!write_callback_.is_null()); 488 DCHECK(!write_callback_.is_null());
483 489
484 int rv = write_buffer_len_; 490 int rv = write_buffer_len_;
485 write_buffer_len_ = 0; 491 write_buffer_len_ = 0;
486 492
487 // Proxy write callbacks result in deep callback chains. Post to allow the 493 // Proxy write callbacks result in deep callback chains. Post to allow the
488 // stream's write callback chain to unwind (see crbug.com/355511). 494 // stream's write callback chain to unwind (see crbug.com/355511).
489 base::MessageLoop::current()->PostTask( 495 base::MessageLoop::current()->PostTask(
490 FROM_HERE, 496 FROM_HERE,
491 base::Bind(ResetAndReturn(&write_callback_), rv)); 497 base::Bind(&SpdyProxyClientSocket::RunCallback,
Ryan Hamilton 2014/06/13 19:02:06 If this is the only place RunCallback is called, h
wtc 2014/06/14 00:31:52 Ryan, did you suggest this because it is expensive
498 write_callback_weak_factory_.GetWeakPtr(),
499 ResetAndReturn(&write_callback_),
500 rv));
492 } 501 }
493 502
494 void SpdyProxyClientSocket::OnClose(int status) { 503 void SpdyProxyClientSocket::OnClose(int status) {
495 was_ever_used_ = spdy_stream_->WasEverUsed(); 504 was_ever_used_ = spdy_stream_->WasEverUsed();
496 spdy_stream_.reset(); 505 spdy_stream_.reset();
497 506
498 bool connecting = next_state_ != STATE_DISCONNECTED && 507 bool connecting = next_state_ != STATE_DISCONNECTED &&
499 next_state_ < STATE_OPEN; 508 next_state_ < STATE_OPEN;
500 if (next_state_ == STATE_OPEN) 509 if (next_state_ == STATE_OPEN)
501 next_state_ = STATE_CLOSED; 510 next_state_ = STATE_CLOSED;
(...skipping 15 matching lines...) Expand all
517 } else if (!read_callback_.is_null()) { 526 } else if (!read_callback_.is_null()) {
518 // If we have a read_callback_, the we need to make sure we call it back. 527 // If we have a read_callback_, the we need to make sure we call it back.
519 OnDataReceived(scoped_ptr<SpdyBuffer>()); 528 OnDataReceived(scoped_ptr<SpdyBuffer>());
520 } 529 }
521 // This may have been deleted by read_callback_, so check first. 530 // This may have been deleted by read_callback_, so check first.
522 if (weak_ptr.get() && !write_callback.is_null()) 531 if (weak_ptr.get() && !write_callback.is_null())
523 write_callback.Run(ERR_CONNECTION_CLOSED); 532 write_callback.Run(ERR_CONNECTION_CLOSED);
524 } 533 }
525 534
526 } // namespace net 535 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_proxy_client_socket.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698