| Index: net/http_client.h
|
| diff --git a/net/http_client.h b/net/http_client.h
|
| deleted file mode 100644
|
| index 833f1546d94135fcb223c1e209c99b6e0be7b885..0000000000000000000000000000000000000000
|
| --- a/net/http_client.h
|
| +++ /dev/null
|
| @@ -1,349 +0,0 @@
|
| -// Copyright 2007-2009 Google Inc.
|
| -//
|
| -// Licensed under the Apache License, Version 2.0 (the "License");
|
| -// you may not use this file except in compliance with the License.
|
| -// You may obtain a copy of the License at
|
| -//
|
| -// http://www.apache.org/licenses/LICENSE-2.0
|
| -//
|
| -// Unless required by applicable law or agreed to in writing, software
|
| -// distributed under the License is distributed on an "AS IS" BASIS,
|
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -// See the License for the specific language governing permissions and
|
| -// limitations under the License.
|
| -// ========================================================================
|
| -
|
| -//
|
| -// HttpClient provides a wrapper for WinHTTP and some helpers to make it
|
| -// easy to call it from c++.
|
| -
|
| -// Runtime requirements: WinHTTP 5.1 is now an operating-system component of
|
| -// the following systems:
|
| -// - Windows Vista
|
| -// - Windows Server 2003 family
|
| -// - Windows XP SP1
|
| -// - Windows 2000 SP3 (except Datacenter Server)
|
| -//
|
| -// TODO(omaha): fix prototype of several methods to take size_t instead of int
|
| -// TODO(omaha): there are many overloads that do not have to be virtual.
|
| -// TODO(omaha): in the end HttpClient is just a c++ wrapper for WinHttp. Some
|
| -// refactoring may be needed, for example to provide access to
|
| -// the internal session and connection handles. It may make sense
|
| -// to reuse these handles, most likely the session handle.
|
| -// TODO(omaha): the idea of implementing the winhttp interface on top of
|
| -// wininet seems impractical now, as they may be subtle
|
| -// differences in behavior. The fallback on wininet when winhttp
|
| -// is not available could be better done by using the higher
|
| -// level urlmon functions, which perhaps we should do anyway,
|
| -// just in case winhttp is not working for some reason or bug.
|
| -// Since now we are not doing downloads in any of our long lived
|
| -// processes, the handle and memory leaks do not affect us much.
|
| -
|
| -#ifndef OMAHA_NET_HTTP_CLIENT_H__
|
| -#define OMAHA_NET_HTTP_CLIENT_H__
|
| -
|
| -#include <windows.h>
|
| -#include <atlstr.h>
|
| -
|
| -#if !defined(_WININET_)
|
| -#include <winhttp.h> // NOLINT
|
| -
|
| - // The following definitions are missing in winhttp.h
|
| -#define INTERNET_MAX_HOST_NAME_LENGTH 256
|
| -#define INTERNET_MAX_USER_NAME_LENGTH 128
|
| -#define INTERNET_MAX_PASSWORD_LENGTH 128
|
| -#define INTERNET_MAX_PORT_NUMBER_LENGTH 5
|
| -#define INTERNET_MAX_PORT_NUMBER_VALUE 65535
|
| -#define INTERNET_MAX_PATH_LENGTH 2048
|
| -#define INTERNET_MAX_SCHEME_LENGTH 32
|
| -#define INTERNET_MAX_URL_LENGTH (INTERNET_MAX_SCHEME_LENGTH \
|
| - + sizeof("://") \
|
| - + INTERNET_MAX_PATH_LENGTH)
|
| -#endif
|
| -
|
| -// This is a definition we made up for convenience, just to be consistent with
|
| -// the other types of network access.
|
| -#define WINHTTP_ACCESS_TYPE_AUTO_DETECT 2
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "omaha/base/object_factory.h"
|
| -
|
| -namespace omaha {
|
| -
|
| -const TCHAR* const kHttpGetMethod = _T("GET");
|
| -const TCHAR* const kHttpPostMethod = _T("POST");
|
| -const TCHAR* const kHttpContentLengthHeader = _T("Content-Length");
|
| -const TCHAR* const kHttpContentTypeHeader = _T("Content-Type");
|
| -const TCHAR* const kHttpLastModifiedHeader = _T("Last-Modified");
|
| -const TCHAR* const kHttpIfModifiedSinceHeader = _T("If-Modified-Since");
|
| -const TCHAR* const kHttpPostTextContentType =
|
| - _T("application/x-www-form-urlencoded");
|
| -const TCHAR* const kHttpPostRawContentType = _T("application/octet-stream");
|
| -const TCHAR* const kHttpBinaryContentType =_T("binary");
|
| -const TCHAR* const kHttpXmlContentType =_T("application/xml");
|
| -
|
| -class HttpClient {
|
| - public:
|
| - enum HttpStack {WINHTTP, WININET};
|
| -
|
| - // Use registry for network configuration info.
|
| - static const int kAccessTypeDefaultProxy = 0;
|
| - // Unconditional direct connection.
|
| - static const int kAccessTypeNoProxy = 1;
|
| - // Use the specified proxy server.
|
| - static const int kAccessTypeNamedProxy = 3;
|
| -
|
| - // GetFactory and DeleteFactory methods below are not thread safe.
|
| - // The caller must initialize and cleanup the factory before going
|
| - // multithreaded.
|
| - //
|
| - // Gets the singleton instance of the object factory.
|
| - typedef Factory<HttpClient, HttpStack> Factory;
|
| - static Factory& GetFactory();
|
| -
|
| - // Cleans up the object factory.
|
| - static void DeleteFactory();
|
| -
|
| - struct ProxyInfo {
|
| - uint32 access_type;
|
| - const TCHAR* proxy;
|
| - const TCHAR* proxy_bypass;
|
| - };
|
| -
|
| - struct CurrentUserIEProxyConfig {
|
| - bool auto_detect;
|
| - const TCHAR* auto_config_url;
|
| - const TCHAR* proxy;
|
| - const TCHAR* proxy_bypass;
|
| - };
|
| -
|
| - struct AutoProxyOptions {
|
| - uint32 flags;
|
| - uint32 auto_detect_flags;
|
| - const TCHAR* auto_config_url;
|
| - bool auto_logon_if_challenged;
|
| - };
|
| -
|
| - virtual ~HttpClient() {}
|
| -
|
| - // Initializes the use of http functions by loading the corresponding http
|
| - // stack.
|
| - virtual HRESULT Initialize() = 0;
|
| -
|
| - // Adds one or more http request headers to the http request.
|
| - virtual HRESULT AddRequestHeaders(HINTERNET request,
|
| - const TCHAR* headers,
|
| - int length,
|
| - uint32 modifiers) = 0;
|
| -
|
| - // Determines whether WinHTTP is available.
|
| - virtual HRESULT CheckPlatform() = 0;
|
| -
|
| - // Closes an http handle.
|
| - virtual HRESULT Close(HINTERNET handle) = 0;
|
| -
|
| - // Specifies the initial server and port of an http request.
|
| - virtual HRESULT Connect(HINTERNET session_handle,
|
| - const TCHAR* server,
|
| - int port,
|
| - HINTERNET* connection_handle) = 0;
|
| -
|
| - // Breaks urls into component parts.
|
| - virtual HRESULT CrackUrl(const TCHAR* url,
|
| - uint32 flags,
|
| - CString* scheme,
|
| - CString* server,
|
| - int* port,
|
| - CString* url_path,
|
| - CString* extra_info) = 0;
|
| -
|
| - // Builds a url from component parts.
|
| - virtual HRESULT CreateUrl(const TCHAR* scheme,
|
| - const TCHAR* server,
|
| - int port,
|
| - const TCHAR* url_path,
|
| - const TCHAR* extra_info,
|
| - uint32 flags,
|
| - CString* url) = 0;
|
| -
|
| -
|
| - // Finds the url for the proxy auto-configuration (PAC) file.
|
| - // It reports the url of the PAC file but it does not download the file.
|
| - virtual HRESULT DetectAutoProxyConfigUrl(uint32 flags,
|
| - CString* auto_config_url) = 0;
|
| -
|
| - // Gets the proxy configuration from the registry.
|
| - virtual HRESULT GetDefaultProxyConfiguration(ProxyInfo* proxy_info) = 0;
|
| -
|
| - // Gets the Internet Explorer configuration for the current user.
|
| - virtual HRESULT GetIEProxyConfiguration(
|
| - CurrentUserIEProxyConfig* proxy_info) = 0;
|
| -
|
| - // Gets the proxy information for an url. This function implements the
|
| - // web proxy auto-discovery (WPAD) protocol for automatically configuring
|
| - // the proxy settings for an http request. The WPAD protocol downloads a
|
| - // proxy auto-configuration (PAC) file, which is a script that identifies
|
| - // the proxy server to use for a given target url.
|
| - virtual HRESULT GetProxyForUrl(HINTERNET session_handle,
|
| - const TCHAR* url,
|
| - const AutoProxyOptions* auto_proxy_options,
|
| - ProxyInfo* proxy_info) = 0;
|
| -
|
| - // Opens a new http session. The http session contains user specific state
|
| - // such as cookies, proxy, and authentication credentials.
|
| - virtual HRESULT Open(const TCHAR* user_agent,
|
| - uint32 access_type,
|
| - const TCHAR* proxy_name,
|
| - const TCHAR* proxy_bypass,
|
| - DWORD flags,
|
| - HINTERNET* session_handle) = 0;
|
| -
|
| - // Specifies the http request.
|
| - virtual HRESULT OpenRequest(HINTERNET connection_handle,
|
| - const TCHAR* verb,
|
| - const TCHAR* uri,
|
| - const TCHAR* version,
|
| - const TCHAR* referrer,
|
| - const TCHAR** accept_types,
|
| - uint32 flags,
|
| - HINTERNET* request_handle) = 0;
|
| -
|
| - // Returns the authorization schemes that are supported by the server or
|
| - // the proxy server.
|
| - virtual HRESULT QueryAuthSchemes(HINTERNET request_handle,
|
| - uint32* supported_schemes,
|
| - uint32* first_scheme,
|
| - uint32* auth_target) = 0;
|
| -
|
| - // Returns the amount of data, in bytes, available to be read.
|
| - virtual HRESULT QueryDataAvailable(HINTERNET request_handle,
|
| - DWORD* num_bytes) = 0;
|
| -
|
| - // Retrieves header information associated with the request.
|
| - virtual HRESULT QueryHeaders(HINTERNET request_handle,
|
| - uint32 info_level,
|
| - const TCHAR* name,
|
| - void* buffer,
|
| - DWORD* buffer_length,
|
| - DWORD* index) = 0;
|
| -
|
| - // Queries an internet option.
|
| - virtual HRESULT QueryOption(HINTERNET handle,
|
| - uint32 option,
|
| - void* buffer,
|
| - DWORD* buffer_length) = 0;
|
| -
|
| - // Reads response data.
|
| - virtual HRESULT ReadData(HINTERNET request_handle,
|
| - void* buffer,
|
| - DWORD buffer_length,
|
| - DWORD* bytes_read) = 0;
|
| -
|
| - // Waits to receive the response to an HTTP request. When ReceiveResponse
|
| - // completes successfully, the status code and response headers have been
|
| - // received.
|
| - virtual HRESULT ReceiveResponse(HINTERNET request_handle) = 0;
|
| -
|
| - // Sends the request to the server. It also allows to send optional data
|
| - // for POST requests.
|
| - virtual HRESULT SendRequest(HINTERNET request_handle,
|
| - const TCHAR* headers,
|
| - DWORD headers_length,
|
| - const void* optional_data,
|
| - DWORD optional_data_length,
|
| - DWORD content_length,
|
| - DWORD_PTR context) = 0;
|
| -
|
| - // Sets the authentication credentials.
|
| - virtual HRESULT SetCredentials(HINTERNET request_handle,
|
| - uint32 auth_targets,
|
| - uint32 auth_scheme,
|
| - const TCHAR* user_name,
|
| - const TCHAR* password) = 0;
|
| -
|
| - // Sets the proxy configuration in registry.
|
| - virtual HRESULT SetDefaultProxyConfiguration(const ProxyInfo& proxy_info) = 0;
|
| -
|
| - // Sets an internet option, either for the session or the request handle.
|
| - virtual HRESULT SetOption(HINTERNET handle,
|
| - uint32 option,
|
| - const void* buffer,
|
| - DWORD buffer_length) = 0;
|
| -
|
| - typedef void (__stdcall *StatusCallback)(HINTERNET handle,
|
| - uint32 context,
|
| - uint32 status,
|
| - void* status_information,
|
| - size_t status_info_length);
|
| - virtual StatusCallback SetStatusCallback(HINTERNET handle,
|
| - StatusCallback callback,
|
| - uint32 flags) = 0;
|
| -
|
| - // Sets timeout values for this http request.
|
| - virtual HRESULT SetTimeouts(HINTERNET handle,
|
| - int resolve_timeout_ms,
|
| - int connect_timeout_ms,
|
| - int send_timeout_ms,
|
| - int receive_timeout_ms) = 0;
|
| -
|
| - // Writes data to the server.
|
| - virtual HRESULT WriteData(HINTERNET request_handle,
|
| - const void* buffer,
|
| - DWORD bytes_to_write,
|
| - DWORD* bytes_written) = 0;
|
| -
|
| - //
|
| - // Http helpers.
|
| - //
|
| - // Builds one http header entry, with the following format:
|
| - // name: value\r\n
|
| - static CString BuildRequestHeader(const TCHAR* name, const TCHAR* value);
|
| -
|
| - enum StatusCodeClass {
|
| - STATUS_CODE_NOCODE = 0,
|
| - STATUS_CODE_INFORMATIONAL = 100,
|
| - STATUS_CODE_SUCCESSFUL = 200,
|
| - STATUS_CODE_REDIRECTION = 300,
|
| - STATUS_CODE_CLIENT_ERROR = 400,
|
| - STATUS_CODE_SERVER_ERROR = 500
|
| - };
|
| - // Returns the class of a status code, such as 100, 200...
|
| - static StatusCodeClass GetStatusCodeClass(int status_code);
|
| -
|
| - HRESULT QueryHeadersString(HINTERNET request_handle,
|
| - uint32 info_level,
|
| - const TCHAR* name,
|
| - CString* value,
|
| - DWORD* index);
|
| - HRESULT QueryHeadersInt(HINTERNET request_handle,
|
| - uint32 info_level,
|
| - const TCHAR* name,
|
| - int* value,
|
| - DWORD* index);
|
| -
|
| - HRESULT QueryOptionString(HINTERNET handle, uint32 option, CString* value);
|
| - HRESULT QueryOptionInt(HINTERNET handle, uint32 option, int* value);
|
| -
|
| - HRESULT SetOptionString(HINTERNET handle, uint32 option, const TCHAR* value);
|
| - HRESULT SetOptionInt(HINTERNET handle, uint32 option, int value);
|
| -
|
| - protected:
|
| - HttpClient() {}
|
| -
|
| - private:
|
| - static Factory* factory_;
|
| - DISALLOW_EVIL_CONSTRUCTORS(HttpClient);
|
| -};
|
| -
|
| -// Creates an http client, depending on what is available on the platform.
|
| -// WinHttp is preferred over WinInet.
|
| -HttpClient* CreateHttpClient();
|
| -
|
| -const HttpClient::StatusCallback kInvalidStatusCallback =
|
| - reinterpret_cast<HttpClient::StatusCallback>(
|
| - WINHTTP_INVALID_STATUS_CALLBACK);
|
| -
|
| -} // namespace omaha
|
| -
|
| -#endif // OMAHA_NET_HTTP_CLIENT_H__
|
| -
|
|
|