Index: net/spdy/spdy_proxy_client_socket.h |
=================================================================== |
--- net/spdy/spdy_proxy_client_socket.h (revision 0) |
+++ net/spdy/spdy_proxy_client_socket.h (revision 0) |
@@ -0,0 +1,183 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef NET_SPDY_SPDY_PROXY_CLIENT_SOCKET_H_ |
+#define NET_SPDY_SPDY_PROXY_CLIENT_SOCKET_H_ |
+#pragma once |
+ |
+#include <string> |
+#include <list> |
+ |
+#include "base/basictypes.h" |
+#include "base/ref_counted.h" |
+#include "net/base/completion_callback.h" |
+#include "net/base/host_port_pair.h" |
+#include "net/base/net_log.h" |
+#include "net/http/http_auth_controller.h" |
+#include "net/http/http_request_headers.h" |
+#include "net/http/http_request_info.h" |
+#include "net/http/http_response_info.h" |
+#include "net/socket/client_socket.h" |
+#include "net/spdy/spdy_protocol.h" |
+#include "net/spdy/spdy_session.h" |
+#include "net/spdy/spdy_stream.h" |
+ |
+ |
+class GURL; |
+ |
+namespace net { |
+ |
+class AddressList; |
+class ClientSocketHandle; |
+class HttpStream; |
+class IOBuffer; |
+class SpdySession; |
+class SpdyStream; |
+ |
+class SpdyProxyClientSocket : public ClientSocket, public SpdyStream::Delegate { |
+ public: |
+ // Create a socket on top of the |spdy_stream| by sending a SYN_STREAM |
+ // CONNECT frame for |endpoint|. After the SYN_REPLY is received, |
+ // any data read/written to the socket will be transferred in data |
+ // frames. |
+ SpdyProxyClientSocket(SpdyStream* spdy_stream, |
+ const std::string& user_agent, |
+ const HostPortPair& endpoint, |
+ const GURL& url, |
+ const HostPortPair& proxy_server, |
+ HttpAuthCache* auth_cache, |
+ HttpAuthHandlerFactory* auth_handler_factory); |
+ |
+ |
+ // On destruction Disconnect() is called. |
+ virtual ~SpdyProxyClientSocket(); |
+ |
+ const scoped_refptr<HttpAuthController>& auth_controller() { |
+ return auth_; |
+ } |
+ |
+ const HttpResponseInfo* GetConnectResponseInfo() const { |
+ return response_.headers ? &response_ : NULL; |
+ } |
+ |
+ // ClientSocket methods: |
+ |
+ virtual int Connect(CompletionCallback* callback); |
+ virtual void Disconnect(); |
+ virtual bool IsConnected() const; |
+ virtual bool IsConnectedAndIdle() const; |
+ virtual const BoundNetLog& NetLog() const { return net_log_; } |
+ virtual void SetSubresourceSpeculation(); |
+ virtual void SetOmniboxSpeculation(); |
+ virtual bool WasEverUsed() const; |
+ |
+ // Socket methods: |
+ |
+ virtual int Read(IOBuffer* buf, int buf_len, CompletionCallback* callback); |
+ virtual int Write(IOBuffer* buf, int buf_len, CompletionCallback* callback); |
+ |
+ virtual bool SetReceiveBufferSize(int32 size); |
+ virtual bool SetSendBufferSize(int32 size); |
+ |
+ virtual int GetPeerAddress(AddressList* address) const; |
+ |
+ // SpdyStream::Delegate methods: |
+ |
+ // Called when SYN frame has been sent. |
+ // Returns true if no more data to be sent after SYN frame. |
+ virtual bool OnSendHeadersComplete(int status); |
+ |
+ // Called when stream is ready to send data. |
+ // Returns network error code. OK when it successfully sent data. |
+ virtual int OnSendBody(); |
+ |
+ // Called when data has been sent. |status| indicates network error |
+ // or number of bytes has been sent. |
+ // Returns true if no more data to be sent. |
+ virtual bool OnSendBodyComplete(int status); |
+ |
+ // Called when SYN_STREAM or SYN_REPLY received. |status| indicates network |
+ // error. Returns network error code. |
+ virtual int OnResponseReceived(const spdy::SpdyHeaderBlock& response, |
+ base::Time response_time, |
+ int status); |
+ |
+ // Called when data is received. |
+ virtual void OnDataReceived(const char* data, int length); |
+ |
+ // Called when data is sent. |
+ virtual void OnDataSent(int length); |
+ |
+ // Called when SpdyStream is closed. |
+ virtual void OnClose(int status); |
+ |
+ private: |
+ enum State { |
+ STATE_NONE, |
+ STATE_GENERATE_AUTH_TOKEN, |
+ STATE_GENERATE_AUTH_TOKEN_COMPLETE, |
+ STATE_SEND_REQUEST, |
+ STATE_SEND_REQUEST_COMPLETE, |
+ STATE_READ_REPLY_COMPLETE, |
+ STATE_DONE, |
+ }; |
+ |
+ void OnIOComplete(int result); |
+ |
+ int DoLoop(int last_io_result); |
+ int DoGenerateAuthToken(); |
+ int DoGenerateAuthTokenComplete(int result); |
+ int DoSendRequest(); |
+ int DoSendRequestComplete(int result); |
+ int DoReadReplyComplete(int result); |
+ |
+ // Populates |user_buffer_| with as much read data as possible |
+ // and returns the number of bytes read. |
+ int PopulateUserReadBuffer(); |
+ |
+ CompletionCallbackImpl<SpdyProxyClientSocket> io_callback_; |
+ State next_state_; |
+ |
+ // Pointer to the SPDY Stream that this sits on top of. |
+ scoped_refptr<SpdyStream> spdy_stream_; |
+ |
+ // Stores the callback to the layer above, called on completing Read() or |
+ // Connect(). |
+ CompletionCallback* read_callback_; |
+ // Stores the callback to the layer above, called on completing Write(). |
+ CompletionCallback* write_callback_; |
+ |
+ // CONNECT request and response. |
+ HttpRequestInfo request_; |
+ HttpResponseInfo response_; |
+ |
+ // The hostname and port of the endpoint. This is not necessarily the one |
+ // specified by the URL, due to Alternate-Protocol or fixed testing ports. |
+ const HostPortPair endpoint_; |
+ scoped_refptr<HttpAuthController> auth_; |
+ |
+ // We buffer the response body as it arrives asynchronously from the stream. |
+ std::list<scoped_refptr<DrainableIOBuffer> > read_buffer_; |
+ |
+ // User provided buffer for the Read() response. |
+ scoped_refptr<DrainableIOBuffer> user_buffer_; |
+ |
+ // User specified number of bytes to be written. |
+ int write_buffer_len_; |
+ // Number of bytes written which have not been confirmed |
+ int write_bytes_outstanding_; |
+ |
+ // True if read has ever returned zero for eof. |
+ bool eof_has_been_read_; |
+ // True if the transport socket has ever sent data. |
+ bool was_ever_used_; |
+ |
+ const BoundNetLog net_log_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SpdyProxyClientSocket); |
+}; |
+ |
+} // namespace net |
+ |
+#endif // NET_SPDY_SPDY_PROXY_CLIENT_SOCKET_H_ |
Property changes on: net/spdy/spdy_proxy_client_socket.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |