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

Unified Diff: net/socket_stream/socket_stream.cc

Issue 342052: Implement websocket throttling. (Closed)
Patch Set: Fix tyoshino's comment Created 11 years, 1 month 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 side-by-side diff with in-line comments
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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/socket_stream/socket_stream.cc
diff --git a/net/socket_stream/socket_stream.cc b/net/socket_stream/socket_stream.cc
index 62aad61969b84d522be873af873b38133f0934e2..aa0795c58b916080efcfffa6aca14065eb380c02 100644
--- a/net/socket_stream/socket_stream.cc
+++ b/net/socket_stream/socket_stream.cc
@@ -25,6 +25,7 @@
#include "net/socket/socks5_client_socket.h"
#include "net/socket/socks_client_socket.h"
#include "net/socket/tcp_client_socket.h"
+#include "net/socket_stream/socket_stream_throttle.h"
#include "net/url_request/url_request.h"
static const int kMaxPendingSendAllowed = 32768; // 32 kilobytes.
@@ -55,12 +56,16 @@ SocketStream::SocketStream(const GURL& url, Delegate* delegate)
write_buf_(NULL),
current_write_buf_(NULL),
write_buf_offset_(0),
- write_buf_size_(0) {
+ write_buf_size_(0),
+ throttle_(
+ SocketStreamThrottle::GetSocketStreamThrottleForScheme(
+ url.scheme())) {
DCHECK(MessageLoop::current()) <<
"The current MessageLoop must exist";
DCHECK_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type()) <<
"The current MessageLoop must be TYPE_IO";
DCHECK(delegate_);
+ DCHECK(throttle_);
}
SocketStream::~SocketStream() {
@@ -199,6 +204,7 @@ void SocketStream::Finish(int result) {
if (delegate) {
delegate->OnClose(this);
}
+ throttle_->OnClose(this);
Release();
}
@@ -213,6 +219,10 @@ void SocketStream::SetClientSocketFactory(
factory_ = factory;
}
+void SocketStream::CopyAddrInfo(struct addrinfo* head) {
+ addresses_.Copy(head);
+}
+
int SocketStream::DidEstablishConnection() {
if (!socket_.get() || !socket_->IsConnected()) {
next_state_ = STATE_CLOSE;
@@ -226,24 +236,29 @@ int SocketStream::DidEstablishConnection() {
return OK;
}
-void SocketStream::DidReceiveData(int result) {
+int SocketStream::DidReceiveData(int result) {
DCHECK(read_buf_);
DCHECK_GT(result, 0);
- if (!delegate_)
- return;
- // Notify recevied data to delegate.
- delegate_->OnReceivedData(this, read_buf_->data(), result);
+ int len = result;
+ result = throttle_->OnRead(this, read_buf_->data(), len, &io_callback_);
+ if (delegate_) {
+ // Notify recevied data to delegate.
+ delegate_->OnReceivedData(this, read_buf_->data(), len);
+ }
read_buf_ = NULL;
+ return result;
}
-void SocketStream::DidSendData(int result) {
- current_write_buf_ = NULL;
+int SocketStream::DidSendData(int result) {
DCHECK_GT(result, 0);
- if (!delegate_)
- return;
+ int len = result;
+ result = throttle_->OnWrite(this, current_write_buf_->data(), len,
+ &io_callback_);
+ current_write_buf_ = NULL;
+ if (delegate_)
+ delegate_->OnSentData(this, len);
- delegate_->OnSentData(this, result);
- int remaining_size = write_buf_size_ - write_buf_offset_ - result;
+ int remaining_size = write_buf_size_ - write_buf_offset_ - len;
if (remaining_size == 0) {
if (!pending_write_bufs_.empty()) {
write_buf_size_ = pending_write_bufs_.front()->size();
@@ -255,8 +270,9 @@ void SocketStream::DidSendData(int result) {
}
write_buf_offset_ = 0;
} else {
- write_buf_offset_ += result;
+ write_buf_offset_ += len;
}
+ return result;
}
void SocketStream::OnIOCompleted(int result) {
@@ -268,16 +284,14 @@ void SocketStream::OnReadCompleted(int result) {
// 0 indicates end-of-file, so socket was closed.
next_state_ = STATE_CLOSE;
} else if (result > 0 && read_buf_) {
- DidReceiveData(result);
- result = OK;
+ result = DidReceiveData(result);
}
DoLoop(result);
}
void SocketStream::OnWriteCompleted(int result) {
if (result >= 0 && write_buf_) {
- DidSendData(result);
- result = OK;
+ result = DidSendData(result);
}
DoLoop(result);
}
@@ -407,10 +421,12 @@ int SocketStream::DoResolveHost() {
}
int SocketStream::DoResolveHostComplete(int result) {
- if (result == OK)
+ if (result == OK) {
next_state_ = STATE_TCP_CONNECT;
- else
+ result = throttle_->OnStartOpenConnection(this, &io_callback_);
+ } else {
next_state_ = STATE_CLOSE;
+ }
// TODO(ukai): if error occured, reconsider proxy after error.
return result;
}
@@ -680,8 +696,7 @@ int SocketStream::DoReadWrite(int result) {
read_buf_ = new IOBuffer(kReadBufferSize);
result = socket_->Read(read_buf_, kReadBufferSize, &read_callback_);
if (result > 0) {
- DidReceiveData(result);
- return OK;
+ return DidReceiveData(result);
} else if (result == 0) {
// 0 indicates end-of-file, so socket was closed.
next_state_ = STATE_CLOSE;
@@ -705,8 +720,7 @@ int SocketStream::DoReadWrite(int result) {
current_write_buf_->BytesRemaining(),
&write_callback_);
if (result > 0) {
- DidSendData(result);
- return OK;
+ return DidSendData(result);
}
// If write is not pending, return the result and do next loop (to close
// the connection).
« 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