| // Copyright (c) 2013 Google Inc. 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_HTTP_HTTP_TRANSACTION_SHELL_H_ |
| #define NET_HTTP_HTTP_TRANSACTION_SHELL_H_ |
| |
| #include "base/basictypes.h" |
| #include "base/message_loop.h" |
| #include "base/string_number_conversions.h" |
| #include "net/http/http_network_session.h" // net::HttpNetworkSession::Params |
| #include "net/http/http_transaction.h" |
| #include "net/http/shell/http_stream_shell.h" |
| #include "net/proxy/proxy_service.h" |
| |
| namespace net { |
| |
| // Represents a single HTTP transaction (i.e., a single request/response pair). |
| // HTTP redirects are not followed and authentication challenges are not |
| // answered. Cookies are assumed to be managed by the caller. |
| class NET_EXPORT_PRIVATE HttpTransactionShell : public HttpTransaction { |
| friend class HttpTransactionShellTest; // Unittests class needs to access |
| // member variables. |
| public: |
| HttpTransactionShell(const net::HttpNetworkSession::Params* params, |
| HttpStreamShell* stream); |
| virtual ~HttpTransactionShell() {} |
| |
| // HttpTransaction methods: |
| |
| // Starts the HTTP transaction (i.e., sends the HTTP request). |
| virtual int Start(const HttpRequestInfo* request_info, |
| const CompletionCallback& callback, |
| const BoundNetLog& net_log) OVERRIDE; |
| |
| // Restarts the HTTP transaction, ignoring the last error. |
| virtual int RestartIgnoringLastError( |
| const CompletionCallback& callback) OVERRIDE; |
| |
| // Restarts the HTTP transaction with a client certificate. |
| virtual int RestartWithCertificate(X509Certificate* client_cert, |
| const CompletionCallback& callback) OVERRIDE; |
| |
| // Restarts the HTTP transaction with authentication credentials. |
| virtual int RestartWithAuth(const AuthCredentials& credentials, |
| const CompletionCallback& callback) OVERRIDE; |
| |
| // Returns true if auth is ready to be continued. |
| virtual bool IsReadyToRestartForAuth() OVERRIDE; |
| |
| // Once response info is available for the transaction, response data may be |
| // read by calling this method. |
| virtual int Read(IOBuffer* buf, int buf_len, |
| const CompletionCallback& callback) OVERRIDE; |
| |
| // Stops further caching of this request by the HTTP cache, if there is any. |
| virtual void StopCaching() OVERRIDE; |
| |
| // Called to tell the transaction that we have successfully reached the end |
| // of the stream. |
| virtual void DoneReading() OVERRIDE; |
| |
| // Returns the response info for this transaction or NULL if the response |
| // info is not available. |
| virtual const HttpResponseInfo* GetResponseInfo() const OVERRIDE; |
| |
| // Returns the load state for this transaction. |
| virtual LoadState GetLoadState() const OVERRIDE; |
| |
| // Returns the upload progress in bytes. If there is no upload data, |
| // zero will be returned. This does not include the request headers. |
| virtual UploadProgress GetUploadProgress() const OVERRIDE; |
| |
| // Access internal member variables |
| scoped_refptr<IOBuffer>& GetReadBuffer() { return read_buf_; } |
| |
| protected: |
| enum State { |
| STATE_CREATED, |
| STATE_STREAM_INITIALIZED, |
| STATE_REQUEST_SENT, |
| STATE_RESPONSE_HEADERS_RECEIVED, |
| STATE_DONE_READING, |
| STATE_FAILED, |
| }; |
| |
| // Callback functions. |
| void OnResolveProxyComplete(int result); |
| void OnInitStreamComplete(int result); |
| void OnInitUploadComplete(int result); |
| void OnSendRequestComplete(int result); |
| void OnReadResponseHeadersComplete(int result); |
| void OnReadResponseBodyComplete(int result); |
| |
| int ResolveProxy(); |
| void BuildRequestHeaders(); |
| void SetFailed(int result); |
| void CloseStream(); |
| void DoCallback(int result); |
| |
| // Stream object |
| scoped_ptr<HttpStreamShell> stream_; |
| |
| State state_; |
| // The result_ variable is used to keep the latest result. The return type |
| // of callback functions is void so we can not use return value to pass |
| // the result. |
| int result_; |
| |
| bool pending_callback_; |
| CompletionCallback resolve_proxy_callback_; |
| CompletionCallback init_stream_callback_; |
| CompletionCallback init_upload_callback_; |
| CompletionCallback send_request_callback_; |
| CompletionCallback read_response_headers_callback_; |
| CompletionCallback read_response_body_callback_; |
| CompletionCallback callback_; // callback function from caller |
| // Data buffer used to read from stream. |
| scoped_refptr<IOBuffer> read_buf_; |
| int read_buf_len_; |
| |
| BoundNetLog net_log_; |
| |
| // Http data |
| const net::HttpNetworkSession::Params* params_; |
| const HttpRequestInfo* request_; |
| HttpRequestHeaders request_headers_; |
| HttpResponseInfo response_; |
| |
| // Proxy info |
| ProxyInfo proxy_info_; |
| |
| // For checking that we're on the correct thread |
| scoped_refptr<base::MessageLoopProxy> current_message_loop_; |
| }; |
| |
| } // namespace net |
| |
| #endif // NET_HTTP_HTTP_TRANSACTION_SHELL_H_ |