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

Side by Side Diff: net/socket_stream/socket_stream.cc

Issue 669157: Refactor WebSocket throttling feature. (Closed)
Patch Set: Fix for tyoshino's comment Created 10 years, 9 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
« no previous file with comments | « net/socket_stream/socket_stream.h ('k') | net/socket_stream/socket_stream_throttle.h » ('j') | 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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 // TODO(ukai): code is similar with http_network_transaction.cc. We should 5 // TODO(ukai): code is similar with http_network_transaction.cc. We should
6 // think about ways to share code, if possible. 6 // think about ways to share code, if possible.
7 7
8 #include "net/socket_stream/socket_stream.h" 8 #include "net/socket_stream/socket_stream.h"
9 9
10 #include <string> 10 #include <string>
11 11
12 #include "base/compiler_specific.h" 12 #include "base/compiler_specific.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/message_loop.h" 14 #include "base/message_loop.h"
15 #include "base/string_util.h" 15 #include "base/string_util.h"
16 #include "net/base/auth.h" 16 #include "net/base/auth.h"
17 #include "net/base/host_resolver.h" 17 #include "net/base/host_resolver.h"
18 #include "net/base/io_buffer.h" 18 #include "net/base/io_buffer.h"
19 #include "net/base/net_errors.h" 19 #include "net/base/net_errors.h"
20 #include "net/base/net_util.h" 20 #include "net/base/net_util.h"
21 #include "net/http/http_response_headers.h" 21 #include "net/http/http_response_headers.h"
22 #include "net/http/http_util.h" 22 #include "net/http/http_util.h"
23 #include "net/socket/client_socket_factory.h" 23 #include "net/socket/client_socket_factory.h"
24 #include "net/socket/ssl_client_socket.h" 24 #include "net/socket/ssl_client_socket.h"
25 #include "net/socket/socks5_client_socket.h" 25 #include "net/socket/socks5_client_socket.h"
26 #include "net/socket/socks_client_socket.h" 26 #include "net/socket/socks_client_socket.h"
27 #include "net/socket/tcp_client_socket.h" 27 #include "net/socket/tcp_client_socket.h"
28 #include "net/socket_stream/socket_stream_metrics.h" 28 #include "net/socket_stream/socket_stream_metrics.h"
29 #include "net/socket_stream/socket_stream_throttle.h"
30 #include "net/url_request/url_request.h" 29 #include "net/url_request/url_request.h"
31 30
32 static const int kMaxPendingSendAllowed = 32768; // 32 kilobytes. 31 static const int kMaxPendingSendAllowed = 32768; // 32 kilobytes.
33 static const int kReadBufferSize = 4096; 32 static const int kReadBufferSize = 4096;
34 33
35 namespace net { 34 namespace net {
36 35
37 void SocketStream::ResponseHeaders::Realloc(size_t new_size) { 36 void SocketStream::ResponseHeaders::Realloc(size_t new_size) {
38 headers_.reset(static_cast<char*>(realloc(headers_.release(), new_size))); 37 headers_.reset(static_cast<char*>(realloc(headers_.release(), new_size)));
39 } 38 }
(...skipping 12 matching lines...) Expand all
52 io_callback_(this, &SocketStream::OnIOCompleted)), 51 io_callback_(this, &SocketStream::OnIOCompleted)),
53 ALLOW_THIS_IN_INITIALIZER_LIST( 52 ALLOW_THIS_IN_INITIALIZER_LIST(
54 read_callback_(this, &SocketStream::OnReadCompleted)), 53 read_callback_(this, &SocketStream::OnReadCompleted)),
55 ALLOW_THIS_IN_INITIALIZER_LIST( 54 ALLOW_THIS_IN_INITIALIZER_LIST(
56 write_callback_(this, &SocketStream::OnWriteCompleted)), 55 write_callback_(this, &SocketStream::OnWriteCompleted)),
57 read_buf_(NULL), 56 read_buf_(NULL),
58 write_buf_(NULL), 57 write_buf_(NULL),
59 current_write_buf_(NULL), 58 current_write_buf_(NULL),
60 write_buf_offset_(0), 59 write_buf_offset_(0),
61 write_buf_size_(0), 60 write_buf_size_(0),
62 throttle_(
63 SocketStreamThrottle::GetSocketStreamThrottleForScheme(
64 url.scheme())),
65 metrics_(new SocketStreamMetrics(url)) { 61 metrics_(new SocketStreamMetrics(url)) {
66 DCHECK(MessageLoop::current()) << 62 DCHECK(MessageLoop::current()) <<
67 "The current MessageLoop must exist"; 63 "The current MessageLoop must exist";
68 DCHECK_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type()) << 64 DCHECK_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type()) <<
69 "The current MessageLoop must be TYPE_IO"; 65 "The current MessageLoop must be TYPE_IO";
70 DCHECK(delegate_); 66 DCHECK(delegate_);
71 DCHECK(throttle_);
72 } 67 }
73 68
74 SocketStream::~SocketStream() { 69 SocketStream::~SocketStream() {
75 set_context(NULL); 70 set_context(NULL);
76 DCHECK(!delegate_); 71 DCHECK(!delegate_);
77 } 72 }
78 73
79 SocketStream::UserData* SocketStream::GetUserData( 74 SocketStream::UserData* SocketStream::GetUserData(
80 const void* key) const { 75 const void* key) const {
81 UserDataMap::const_iterator found = user_data_.find(key); 76 UserDataMap::const_iterator found = user_data_.find(key);
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 DLOG(INFO) << "Finish result=" << net::ErrorToString(result); 223 DLOG(INFO) << "Finish result=" << net::ErrorToString(result);
229 if (delegate_) 224 if (delegate_)
230 delegate_->OnError(this, result); 225 delegate_->OnError(this, result);
231 226
232 metrics_->OnClose(); 227 metrics_->OnClose();
233 Delegate* delegate = delegate_; 228 Delegate* delegate = delegate_;
234 delegate_ = NULL; 229 delegate_ = NULL;
235 if (delegate) { 230 if (delegate) {
236 delegate->OnClose(this); 231 delegate->OnClose(this);
237 } 232 }
238 throttle_->OnClose(this);
239 Release(); 233 Release();
240 } 234 }
241 235
242 void SocketStream::SetHostResolver(HostResolver* host_resolver) { 236 void SocketStream::SetHostResolver(HostResolver* host_resolver) {
243 DCHECK(host_resolver); 237 DCHECK(host_resolver);
244 host_resolver_ = host_resolver; 238 host_resolver_ = host_resolver;
245 } 239 }
246 240
247 void SocketStream::SetClientSocketFactory( 241 void SocketStream::SetClientSocketFactory(
248 ClientSocketFactory* factory) { 242 ClientSocketFactory* factory) {
(...skipping 19 matching lines...) Expand all
268 262
269 return OK; 263 return OK;
270 } 264 }
271 265
272 int SocketStream::DidReceiveData(int result) { 266 int SocketStream::DidReceiveData(int result) {
273 DCHECK(read_buf_); 267 DCHECK(read_buf_);
274 DCHECK_GT(result, 0); 268 DCHECK_GT(result, 0);
275 net_log_.AddEvent(NetLog::TYPE_SOCKET_STREAM_RECEIVED); 269 net_log_.AddEvent(NetLog::TYPE_SOCKET_STREAM_RECEIVED);
276 int len = result; 270 int len = result;
277 metrics_->OnRead(len); 271 metrics_->OnRead(len);
278 result = throttle_->OnRead(this, read_buf_->data(), len, &io_callback_);
279 if (delegate_) { 272 if (delegate_) {
280 // Notify recevied data to delegate. 273 // Notify recevied data to delegate.
281 delegate_->OnReceivedData(this, read_buf_->data(), len); 274 delegate_->OnReceivedData(this, read_buf_->data(), len);
282 } 275 }
283 read_buf_ = NULL; 276 read_buf_ = NULL;
284 return result; 277 return OK;
285 } 278 }
286 279
287 int SocketStream::DidSendData(int result) { 280 int SocketStream::DidSendData(int result) {
288 DCHECK_GT(result, 0); 281 DCHECK_GT(result, 0);
289 net_log_.AddEvent(NetLog::TYPE_SOCKET_STREAM_SENT); 282 net_log_.AddEvent(NetLog::TYPE_SOCKET_STREAM_SENT);
290 int len = result; 283 int len = result;
291 metrics_->OnWrite(len); 284 metrics_->OnWrite(len);
292 result = throttle_->OnWrite(this, current_write_buf_->data(), len,
293 &io_callback_);
294 current_write_buf_ = NULL; 285 current_write_buf_ = NULL;
295 if (delegate_) 286 if (delegate_)
296 delegate_->OnSentData(this, len); 287 delegate_->OnSentData(this, len);
297 288
298 int remaining_size = write_buf_size_ - write_buf_offset_ - len; 289 int remaining_size = write_buf_size_ - write_buf_offset_ - len;
299 if (remaining_size == 0) { 290 if (remaining_size == 0) {
300 if (!pending_write_bufs_.empty()) { 291 if (!pending_write_bufs_.empty()) {
301 write_buf_size_ = pending_write_bufs_.front()->size(); 292 write_buf_size_ = pending_write_bufs_.front()->size();
302 write_buf_ = pending_write_bufs_.front(); 293 write_buf_ = pending_write_bufs_.front();
303 pending_write_bufs_.pop_front(); 294 pending_write_bufs_.pop_front();
304 } else { 295 } else {
305 write_buf_size_ = 0; 296 write_buf_size_ = 0;
306 write_buf_ = NULL; 297 write_buf_ = NULL;
307 } 298 }
308 write_buf_offset_ = 0; 299 write_buf_offset_ = 0;
309 } else { 300 } else {
310 write_buf_offset_ += len; 301 write_buf_offset_ += len;
311 } 302 }
312 return result; 303 return OK;
313 } 304 }
314 305
315 void SocketStream::OnIOCompleted(int result) { 306 void SocketStream::OnIOCompleted(int result) {
316 DoLoop(result); 307 DoLoop(result);
317 } 308 }
318 309
319 void SocketStream::OnReadCompleted(int result) { 310 void SocketStream::OnReadCompleted(int result) {
320 if (result == 0) { 311 if (result == 0) {
321 // 0 indicates end-of-file, so socket was closed. 312 // 0 indicates end-of-file, so socket was closed.
322 next_state_ = STATE_CLOSE; 313 next_state_ = STATE_CLOSE;
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 474
484 DCHECK(host_resolver_.get()); 475 DCHECK(host_resolver_.get());
485 resolver_.reset(new SingleRequestHostResolver(host_resolver_.get())); 476 resolver_.reset(new SingleRequestHostResolver(host_resolver_.get()));
486 return resolver_->Resolve(resolve_info, &addresses_, &io_callback_, 477 return resolver_->Resolve(resolve_info, &addresses_, &io_callback_,
487 net_log_); 478 net_log_);
488 } 479 }
489 480
490 int SocketStream::DoResolveHostComplete(int result) { 481 int SocketStream::DoResolveHostComplete(int result) {
491 if (result == OK) { 482 if (result == OK) {
492 next_state_ = STATE_TCP_CONNECT; 483 next_state_ = STATE_TCP_CONNECT;
493 result = throttle_->OnStartOpenConnection(this, &io_callback_); 484 result = delegate_->OnStartOpenConnection(this, &io_callback_);
494 if (result == net::ERR_IO_PENDING) 485 if (result == net::ERR_IO_PENDING)
495 metrics_->OnWaitConnection(); 486 metrics_->OnWaitConnection();
496 } else { 487 } else {
497 next_state_ = STATE_CLOSE; 488 next_state_ = STATE_CLOSE;
498 } 489 }
499 // TODO(ukai): if error occured, reconsider proxy after error. 490 // TODO(ukai): if error occured, reconsider proxy after error.
500 return result; 491 return result;
501 } 492 }
502 493
503 int SocketStream::DoTcpConnect() { 494 int SocketStream::DoTcpConnect() {
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after
942 933
943 SSLConfigService* SocketStream::ssl_config_service() const { 934 SSLConfigService* SocketStream::ssl_config_service() const {
944 return context_->ssl_config_service(); 935 return context_->ssl_config_service();
945 } 936 }
946 937
947 ProxyService* SocketStream::proxy_service() const { 938 ProxyService* SocketStream::proxy_service() const {
948 return context_->proxy_service(); 939 return context_->proxy_service();
949 } 940 }
950 941
951 } // namespace net 942 } // namespace net
OLDNEW
« no previous file with comments | « net/socket_stream/socket_stream.h ('k') | net/socket_stream/socket_stream_throttle.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698