| /* | |
| * Copyright 2008 Hans Leidekker for CodeWeavers | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |
| */ | |
| #ifndef _WINE_WINHTTP_PRIVATE_H_ | |
| #define _WINE_WINHTTP_PRIVATE_H_ | |
| #ifndef __WINE_CONFIG_H | |
| # error You must include config.h to use this header | |
| #endif | |
| #include "wine/list.h" | |
| #include "wine/unicode.h" | |
| #include <sys/types.h> | |
| #ifdef HAVE_SYS_SOCKET_H | |
| # include <sys/socket.h> | |
| #endif | |
| #ifdef HAVE_NETINET_IN_H | |
| # include <netinet/in.h> | |
| #endif | |
| #ifdef HAVE_NETDB_H | |
| # include <netdb.h> | |
| #endif | |
| #if defined(__MINGW32__) || defined (_MSC_VER) | |
| # include <ws2tcpip.h> | |
| #else | |
| # define closesocket close | |
| # define ioctlsocket ioctl | |
| #endif | |
| #include "ole2.h" | |
| #include "sspi.h" | |
| static const WCHAR getW[] = {'G','E','T',0}; | |
| static const WCHAR postW[] = {'P','O','S','T',0}; | |
| static const WCHAR headW[] = {'H','E','A','D',0}; | |
| static const WCHAR slashW[] = {'/',0}; | |
| static const WCHAR http1_0[] = {'H','T','T','P','/','1','.','0',0}; | |
| static const WCHAR http1_1[] = {'H','T','T','P','/','1','.','1',0}; | |
| static const WCHAR chunkedW[] = {'c','h','u','n','k','e','d',0}; | |
| typedef struct _object_header_t object_header_t; | |
| typedef struct | |
| { | |
| void (*destroy)( object_header_t * ); | |
| BOOL (*query_option)( object_header_t *, DWORD, void *, DWORD * ); | |
| BOOL (*set_option)( object_header_t *, DWORD, void *, DWORD ); | |
| } object_vtbl_t; | |
| struct _object_header_t | |
| { | |
| DWORD type; | |
| HINTERNET handle; | |
| const object_vtbl_t *vtbl; | |
| DWORD flags; | |
| DWORD disable_flags; | |
| DWORD logon_policy; | |
| DWORD redirect_policy; | |
| DWORD error; | |
| DWORD_PTR context; | |
| LONG refs; | |
| WINHTTP_STATUS_CALLBACK callback; | |
| DWORD notify_mask; | |
| struct list entry; | |
| struct list children; | |
| }; | |
| typedef struct | |
| { | |
| struct list entry; | |
| WCHAR *name; | |
| struct list cookies; | |
| } domain_t; | |
| typedef struct | |
| { | |
| struct list entry; | |
| WCHAR *name; | |
| WCHAR *value; | |
| WCHAR *path; | |
| } cookie_t; | |
| typedef struct { | |
| struct list entry; | |
| LONG ref; | |
| WCHAR *hostname; | |
| INTERNET_PORT port; | |
| BOOL secure; | |
| struct list connections; | |
| } hostdata_t; | |
| typedef struct | |
| { | |
| object_header_t hdr; | |
| LPWSTR agent; | |
| DWORD access; | |
| int resolve_timeout; | |
| int connect_timeout; | |
| int send_timeout; | |
| int recv_timeout; | |
| LPWSTR proxy_server; | |
| LPWSTR proxy_bypass; | |
| LPWSTR proxy_username; | |
| LPWSTR proxy_password; | |
| struct list cookie_cache; | |
| HANDLE unload_event; | |
| CredHandle cred_handle; | |
| BOOL cred_handle_initialized; | |
| DWORD secure_protocols; | |
| } session_t; | |
| typedef struct | |
| { | |
| object_header_t hdr; | |
| session_t *session; | |
| LPWSTR hostname; /* final destination of the request */ | |
| LPWSTR servername; /* name of the server we directly connect to */ | |
| LPWSTR username; | |
| LPWSTR password; | |
| INTERNET_PORT hostport; | |
| INTERNET_PORT serverport; | |
| struct sockaddr_storage sockaddr; | |
| BOOL resolved; | |
| } connect_t; | |
| typedef struct | |
| { | |
| struct list entry; | |
| int socket; | |
| struct sockaddr_storage sockaddr; | |
| BOOL secure; /* SSL active on connection? */ | |
| hostdata_t *host; | |
| ULONGLONG keep_until; | |
| CtxtHandle ssl_ctx; | |
| SecPkgContext_StreamSizes ssl_sizes; | |
| char *ssl_buf; | |
| char *extra_buf; | |
| size_t extra_len; | |
| char *peek_msg; | |
| char *peek_msg_mem; | |
| size_t peek_len; | |
| } netconn_t; | |
| typedef struct | |
| { | |
| LPWSTR field; | |
| LPWSTR value; | |
| BOOL is_request; /* part of request headers? */ | |
| } header_t; | |
| enum auth_target | |
| { | |
| TARGET_INVALID = -1, | |
| TARGET_SERVER, | |
| TARGET_PROXY, | |
| TARGET_MAX | |
| }; | |
| enum auth_scheme | |
| { | |
| SCHEME_INVALID = -1, | |
| SCHEME_BASIC, | |
| SCHEME_NTLM, | |
| SCHEME_PASSPORT, | |
| SCHEME_DIGEST, | |
| SCHEME_NEGOTIATE, | |
| SCHEME_MAX | |
| }; | |
| struct authinfo | |
| { | |
| enum auth_scheme scheme; | |
| CredHandle cred; | |
| CtxtHandle ctx; | |
| TimeStamp exp; | |
| ULONG attr; | |
| ULONG max_token; | |
| char *data; | |
| unsigned int data_len; | |
| BOOL finished; /* finished authenticating */ | |
| }; | |
| typedef struct | |
| { | |
| object_header_t hdr; | |
| connect_t *connect; | |
| LPWSTR verb; | |
| LPWSTR path; | |
| LPWSTR version; | |
| LPWSTR raw_headers; | |
| void *optional; | |
| DWORD optional_len; | |
| netconn_t *netconn; | |
| DWORD security_flags; | |
| int resolve_timeout; | |
| int connect_timeout; | |
| int send_timeout; | |
| int recv_timeout; | |
| LPWSTR status_text; | |
| DWORD content_length; /* total number of bytes to be read */ | |
| DWORD content_read; /* bytes read so far */ | |
| BOOL read_chunked; /* are we reading in chunked mode? */ | |
| BOOL read_chunked_eof; /* end of stream in chunked mode */ | |
| BOOL read_chunked_size; /* chunk size remaining */ | |
| DWORD read_pos; /* current read position in read_buf */ | |
| DWORD read_size; /* valid data size in read_buf */ | |
| char read_buf[8192]; /* buffer for already read but not returned data */ | |
| header_t *headers; | |
| DWORD num_headers; | |
| WCHAR **accept_types; | |
| DWORD num_accept_types; | |
| struct authinfo *authinfo; | |
| struct authinfo *proxy_authinfo; | |
| HANDLE task_wait; | |
| HANDLE task_cancel; | |
| HANDLE task_thread; | |
| struct list task_queue; | |
| CRITICAL_SECTION task_cs; | |
| struct | |
| { | |
| WCHAR *username; | |
| WCHAR *password; | |
| } creds[TARGET_MAX][SCHEME_MAX]; | |
| } request_t; | |
| typedef struct _task_header_t task_header_t; | |
| struct _task_header_t | |
| { | |
| struct list entry; | |
| request_t *request; | |
| void (*proc)( task_header_t * ); | |
| }; | |
| typedef struct | |
| { | |
| task_header_t hdr; | |
| LPWSTR headers; | |
| DWORD headers_len; | |
| LPVOID optional; | |
| DWORD optional_len; | |
| DWORD total_len; | |
| DWORD_PTR context; | |
| } send_request_t; | |
| typedef struct | |
| { | |
| task_header_t hdr; | |
| } receive_response_t; | |
| typedef struct | |
| { | |
| task_header_t hdr; | |
| LPDWORD available; | |
| } query_data_t; | |
| typedef struct | |
| { | |
| task_header_t hdr; | |
| LPVOID buffer; | |
| DWORD to_read; | |
| LPDWORD read; | |
| } read_data_t; | |
| typedef struct | |
| { | |
| task_header_t hdr; | |
| LPCVOID buffer; | |
| DWORD to_write; | |
| LPDWORD written; | |
| } write_data_t; | |
| object_header_t *addref_object( object_header_t * ) DECLSPEC_HIDDEN; | |
| object_header_t *grab_object( HINTERNET ) DECLSPEC_HIDDEN; | |
| void release_object( object_header_t * ) DECLSPEC_HIDDEN; | |
| HINTERNET alloc_handle( object_header_t * ) DECLSPEC_HIDDEN; | |
| BOOL free_handle( HINTERNET ) DECLSPEC_HIDDEN; | |
| void set_last_error( DWORD ) DECLSPEC_HIDDEN; | |
| DWORD get_last_error( void ) DECLSPEC_HIDDEN; | |
| void send_callback( object_header_t *, DWORD, LPVOID, DWORD ) DECLSPEC_HIDDEN; | |
| void close_connection( request_t * ) DECLSPEC_HIDDEN; | |
| BOOL netconn_close( netconn_t * ) DECLSPEC_HIDDEN; | |
| netconn_t *netconn_create( hostdata_t *, const struct sockaddr_storage *, int ) DECLSPEC_HIDDEN; | |
| void netconn_unload( void ) DECLSPEC_HIDDEN; | |
| ULONG netconn_query_data_available( netconn_t * ) DECLSPEC_HIDDEN; | |
| BOOL netconn_recv( netconn_t *, void *, size_t, int, int * ) DECLSPEC_HIDDEN; | |
| BOOL netconn_resolve( WCHAR *, INTERNET_PORT, struct sockaddr_storage *, int ) DECLSPEC_HIDDEN; | |
| BOOL netconn_secure_connect( netconn_t *, WCHAR *, DWORD, CredHandle * ) DECLSPEC_HIDDEN; | |
| BOOL netconn_send( netconn_t *, const void *, size_t, int * ) DECLSPEC_HIDDEN; | |
| DWORD netconn_set_timeout( netconn_t *, BOOL, int ) DECLSPEC_HIDDEN; | |
| BOOL netconn_is_alive( netconn_t * ) DECLSPEC_HIDDEN; | |
| const void *netconn_get_certificate( netconn_t * ) DECLSPEC_HIDDEN; | |
| int netconn_get_cipher_strength( netconn_t * ) DECLSPEC_HIDDEN; | |
| BOOL set_cookies( request_t *, const WCHAR * ) DECLSPEC_HIDDEN; | |
| BOOL add_cookie_headers( request_t * ) DECLSPEC_HIDDEN; | |
| BOOL add_request_headers( request_t *, LPCWSTR, DWORD, DWORD ) DECLSPEC_HIDDEN; | |
| void delete_domain( domain_t * ) DECLSPEC_HIDDEN; | |
| BOOL set_server_for_hostname( connect_t *, LPCWSTR, INTERNET_PORT ) DECLSPEC_HIDDEN; | |
| void destroy_authinfo( struct authinfo * ) DECLSPEC_HIDDEN; | |
| void release_host( hostdata_t *host ) DECLSPEC_HIDDEN; | |
| extern HRESULT WinHttpRequest_create( void ** ) DECLSPEC_HIDDEN; | |
| void release_typelib( void ) DECLSPEC_HIDDEN; | |
| static inline void* __WINE_ALLOC_SIZE(1) heap_alloc( SIZE_T size ) | |
| { | |
| return HeapAlloc( GetProcessHeap(), 0, size ); | |
| } | |
| static inline void* __WINE_ALLOC_SIZE(1) heap_alloc_zero( SIZE_T size ) | |
| { | |
| return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size ); | |
| } | |
| static inline void* __WINE_ALLOC_SIZE(2) heap_realloc( LPVOID mem, SIZE_T size ) | |
| { | |
| return HeapReAlloc( GetProcessHeap(), 0, mem, size ); | |
| } | |
| static inline void* __WINE_ALLOC_SIZE(2) heap_realloc_zero( LPVOID mem, SIZE_T size ) | |
| { | |
| return HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, mem, size ); | |
| } | |
| static inline BOOL heap_free( LPVOID mem ) | |
| { | |
| return HeapFree( GetProcessHeap(), 0, mem ); | |
| } | |
| static inline WCHAR *strdupW( const WCHAR *src ) | |
| { | |
| WCHAR *dst; | |
| if (!src) return NULL; | |
| dst = heap_alloc( (strlenW( src ) + 1) * sizeof(WCHAR) ); | |
| if (dst) strcpyW( dst, src ); | |
| return dst; | |
| } | |
| static inline WCHAR *strdupAW( const char *src ) | |
| { | |
| WCHAR *dst = NULL; | |
| if (src) | |
| { | |
| DWORD len = MultiByteToWideChar( CP_ACP, 0, src, -1, NULL, 0 ); | |
| if ((dst = heap_alloc( len * sizeof(WCHAR) ))) | |
| MultiByteToWideChar( CP_ACP, 0, src, -1, dst, len ); | |
| } | |
| return dst; | |
| } | |
| static inline char *strdupWA( const WCHAR *src ) | |
| { | |
| char *dst = NULL; | |
| if (src) | |
| { | |
| int len = WideCharToMultiByte( CP_ACP, 0, src, -1, NULL, 0, NULL, NULL ); | |
| if ((dst = heap_alloc( len ))) | |
| WideCharToMultiByte( CP_ACP, 0, src, -1, dst, len, NULL, NULL ); | |
| } | |
| return dst; | |
| } | |
| static inline char *strdupWA_sized( const WCHAR *src, DWORD size ) | |
| { | |
| char *dst = NULL; | |
| if (src) | |
| { | |
| int len = WideCharToMultiByte( CP_ACP, 0, src, size, NULL, 0, NULL, NULL ) + 1; | |
| if ((dst = heap_alloc( len ))) | |
| { | |
| WideCharToMultiByte( CP_ACP, 0, src, len, dst, size, NULL, NULL ); | |
| dst[len - 1] = 0; | |
| } | |
| } | |
| return dst; | |
| } | |
| extern HINSTANCE winhttp_instance DECLSPEC_HIDDEN; | |
| #endif /* _WINE_WINHTTP_PRIVATE_H_ */ |