summaryrefslogtreecommitdiffstats
path: root/net/socket_stream
diff options
context:
space:
mode:
authorukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-30 02:15:17 +0000
committerukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-30 02:15:17 +0000
commit18d5736f37580046f8703bb13af9041ae8a68ba5 (patch)
tree383ea24e44f58696c3cf2871f44846f5a973f473 /net/socket_stream
parentff42ee3f10b3f741ae52313f6f4ae73597b4e13c (diff)
downloadchromium_src-18d5736f37580046f8703bb13af9041ae8a68ba5.zip
chromium_src-18d5736f37580046f8703bb13af9041ae8a68ba5.tar.gz
chromium_src-18d5736f37580046f8703bb13af9041ae8a68ba5.tar.bz2
Reverting 30551.
Review URL: http://codereview.chromium.org/342050 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@30552 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/socket_stream')
-rw-r--r--net/socket_stream/socket_stream.cc66
-rw-r--r--net/socket_stream/socket_stream.h17
2 files changed, 35 insertions, 48 deletions
diff --git a/net/socket_stream/socket_stream.cc b/net/socket_stream/socket_stream.cc
index 45c3c4a..1dcf1f8 100644
--- a/net/socket_stream/socket_stream.cc
+++ b/net/socket_stream/socket_stream.cc
@@ -143,7 +143,6 @@ void SocketStream::Close() {
return;
if (socket_->IsConnected())
socket_->Disconnect();
- next_state_ = STATE_NONE;
// Close asynchronously, so that delegate won't be called
// back before returning Close().
MessageLoop::current()->PostTask(
@@ -183,22 +182,18 @@ void SocketStream::DetachDelegate() {
Close();
}
-void SocketStream::Finish(int result) {
+void SocketStream::Finish() {
DCHECK(MessageLoop::current()) <<
"The current MessageLoop must exist";
DCHECK_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type()) <<
"The current MessageLoop must be TYPE_IO";
- DCHECK_LT(result, 0);
DLOG(INFO) << "Finish";
- if (delegate_)
- delegate_->OnError(this, result);
-
Delegate* delegate = delegate_;
delegate_ = NULL;
if (delegate) {
delegate->OnClose(this);
+ Release();
}
- Release();
}
void SocketStream::SetHostResolver(HostResolver* host_resolver) {
@@ -212,16 +207,17 @@ void SocketStream::SetClientSocketFactory(
factory_ = factory;
}
-int SocketStream::DidEstablishConnection() {
+void SocketStream::DidEstablishConnection() {
if (!socket_.get() || !socket_->IsConnected()) {
- return ERR_CONNECTION_FAILED;
+ Finish();
+ return;
}
next_state_ = STATE_READ_WRITE;
if (delegate_)
delegate_->OnConnected(this, max_pending_send_allowed_);
- return OK;
+ return;
}
void SocketStream::DidReceiveData(int result) {
@@ -259,9 +255,11 @@ void SocketStream::DidSendData(int result) {
void SocketStream::OnIOCompleted(int result) {
DoLoop(result);
+ // TODO(ukai): notify error.
}
void SocketStream::OnReadCompleted(int result) {
+ // TODO(ukai): notify error.
if (result == 0) {
// 0 indicates end-of-file, so socket was closed.
next_state_ = STATE_NONE;
@@ -281,17 +279,16 @@ void SocketStream::OnWriteCompleted(int result) {
DoLoop(result);
}
-void SocketStream::DoLoop(int result) {
+int SocketStream::DoLoop(int result) {
+ if (next_state_ == STATE_NONE) {
+ Finish();
+ return ERR_CONNECTION_CLOSED;
+ }
+
do {
State state = next_state_;
next_state_ = STATE_NONE;
switch (state) {
- case STATE_NONE:
- DCHECK_LE(result, OK);
- if (result == OK)
- result = ERR_CONNECTION_CLOSED;
- Finish(result);
- return;
case STATE_RESOLVE_PROXY:
DCHECK_EQ(OK, result);
result = DoResolveProxy();
@@ -349,7 +346,12 @@ void SocketStream::DoLoop(int result) {
result = ERR_UNEXPECTED;
break;
}
- } while (result != ERR_IO_PENDING);
+ } while (result != ERR_IO_PENDING && next_state_ != STATE_NONE);
+
+ if (result != ERR_IO_PENDING)
+ Finish();
+
+ return result;
}
int SocketStream::DoResolveProxy() {
@@ -366,8 +368,6 @@ int SocketStream::DoResolveProxyComplete(int result) {
pac_request_ = NULL;
if (result != OK) {
LOG(ERROR) << "Failed to resolve proxy: " << result;
- if (delegate_)
- delegate_->OnError(this, result);
proxy_info_.UseDirect();
}
@@ -428,9 +428,9 @@ int SocketStream::DoTcpConnectComplete(int result) {
else if (is_secure()) {
next_state_ = STATE_SSL_CONNECT;
} else {
- result = DidEstablishConnection();
+ DidEstablishConnection();
}
- return result;
+ return OK;
}
int SocketStream::DoWriteTunnelHeaders() {
@@ -532,8 +532,8 @@ int SocketStream::DoReadTunnelHeadersComplete(int result) {
if (result == 0) {
// 0 indicates end-of-file, so socket was closed.
- DCHECK_EQ(next_state_, STATE_NONE);
- return ERR_CONNECTION_CLOSED;
+ Finish();
+ return result;
}
tunnel_response_headers_len_ += result;
@@ -542,10 +542,8 @@ int SocketStream::DoReadTunnelHeadersComplete(int result) {
int eoh = HttpUtil::LocateEndOfHeaders(
tunnel_response_headers_->headers(), tunnel_response_headers_len_, 0);
if (eoh == -1) {
- if (tunnel_response_headers_len_ >= kMaxTunnelResponseHeadersSize) {
- DCHECK_EQ(next_state_, STATE_NONE);
+ if (tunnel_response_headers_len_ >= kMaxTunnelResponseHeadersSize)
return ERR_RESPONSE_HEADERS_TOO_BIG;
- }
next_state_ = STATE_READ_TUNNEL_HEADERS;
return OK;
@@ -556,7 +554,6 @@ int SocketStream::DoReadTunnelHeadersComplete(int result) {
HttpUtil::AssembleRawHeaders(tunnel_response_headers_->headers(), eoh));
if (headers->GetParsedHttpVersion() < HttpVersion(1, 0)) {
// Require the "HTTP/1.x" status line.
- DCHECK_EQ(next_state_, STATE_NONE);
return ERR_TUNNEL_CONNECTION_FAILED;
}
switch (headers->response_code()) {
@@ -565,11 +562,7 @@ int SocketStream::DoReadTunnelHeadersComplete(int result) {
DCHECK_EQ(eoh, tunnel_response_headers_len_);
next_state_ = STATE_SSL_CONNECT;
} else {
- result = DidEstablishConnection();
- if (result < 0) {
- DCHECK_EQ(next_state_, STATE_NONE);
- return result;
- }
+ DidEstablishConnection();
if ((eoh < tunnel_response_headers_len_) && delegate_)
delegate_->OnReceivedData(
this, tunnel_response_headers_->headers() + eoh,
@@ -590,7 +583,6 @@ int SocketStream::DoReadTunnelHeadersComplete(int result) {
MessageLoop::current()->PostTask(
FROM_HERE,
NewRunnableMethod(this, &SocketStream::DoAuthRequired));
- next_state_ = STATE_AUTH_REQUIRED;
return ERR_IO_PENDING;
}
default:
@@ -641,15 +633,17 @@ int SocketStream::DoSSLConnectComplete(int result) {
result = HandleCertificateError(result);
if (result == OK)
- result = DidEstablishConnection();
+ DidEstablishConnection();
return result;
}
int SocketStream::DoReadWrite(int result) {
if (result < OK) {
+ Finish();
return result;
}
if (!socket_.get() || !socket_->IsConnected()) {
+ Finish();
return ERR_CONNECTION_CLOSED;
}
@@ -664,6 +658,7 @@ int SocketStream::DoReadWrite(int result) {
return OK;
} else if (result == 0) {
// 0 indicates end-of-file, so socket was closed.
+ Finish();
return ERR_CONNECTION_CLOSED;
}
// If read is pending, try write as well.
@@ -751,7 +746,6 @@ void SocketStream::DoAuthRequired() {
}
void SocketStream::DoRestartWithAuth() {
- DCHECK_EQ(next_state_, STATE_AUTH_REQUIRED);
auth_cache_.Add(ProxyAuthOrigin(), auth_handler_,
auth_identity_.username, auth_identity_.password,
std::string());
diff --git a/net/socket_stream/socket_stream.h b/net/socket_stream/socket_stream.h
index b9961f4..c1aaf6e 100644
--- a/net/socket_stream/socket_stream.h
+++ b/net/socket_stream/socket_stream.h
@@ -79,11 +79,6 @@ class SocketStream : public base::RefCountedThreadSafe<SocketStream> {
// By default, no credential is available and close the connection.
socket->Close();
}
-
- // Called when an error occured.
- // This is only for error reporting to the delegate.
- // |error| is net::Error.
- virtual void OnError(const SocketStream* socket, int error) {}
};
SocketStream(const GURL& url, Delegate* delegate);
@@ -176,8 +171,7 @@ class SocketStream : public base::RefCountedThreadSafe<SocketStream> {
STATE_SOCKS_CONNECT_COMPLETE,
STATE_SSL_CONNECT,
STATE_SSL_CONNECT_COMPLETE,
- STATE_READ_WRITE,
- STATE_AUTH_REQUIRED,
+ STATE_READ_WRITE
};
enum ProxyMode {
@@ -190,12 +184,11 @@ class SocketStream : public base::RefCountedThreadSafe<SocketStream> {
friend class base::RefCountedThreadSafe<SocketStream>;
~SocketStream();
- // Finishes the job.
- // Calls OnError and OnClose of delegate, and no more
+ // Finish the job. Once finished, calls OnClose of delegate, and no more
// notifications will be sent to delegate.
- void Finish(int result);
+ void Finish();
- int DidEstablishConnection();
+ void DidEstablishConnection();
void DidReceiveData(int result);
void DidSendData(int result);
@@ -203,7 +196,7 @@ class SocketStream : public base::RefCountedThreadSafe<SocketStream> {
void OnReadCompleted(int result);
void OnWriteCompleted(int result);
- void DoLoop(int result);
+ int DoLoop(int result);
int DoResolveProxy();
int DoResolveProxyComplete(int result);