unit WinHTTPUnit; interface uses Windows; const INTERNET_DEFAULT_PORT = 0; // use the protocol-specific default INTERNET_DEFAULT_HTTP_PORT = 80; // " " HTTP " INTERNET_DEFAULT_HTTPS_PORT = 443; // " " HTTPS " // flags for WinHttpOpen(): WINHTTP_FLAG_ASYNC = $10000000; // this session is asynchronous (where supported) // flags for WinHttpOpenRequest(): WINHTTP_FLAG_SECURE = $00800000; // use SSL if applicable (HTTPS) WINHTTP_FLAG_ESCAPE_PERCENT = $00000004; // if escaping enabled, escape percent as well WINHTTP_FLAG_NULL_CODEPAGE = $00000008; // assume all symbols are ASCII, use fast convertion WINHTTP_FLAG_BYPASS_PROXY_CACHE = $00000100; // add "pragma: no-cache" request header WINHTTP_FLAG_REFRESH = WINHTTP_FLAG_BYPASS_PROXY_CACHE; WINHTTP_FLAG_ESCAPE_DISABLE = $00000040; // disable escaping WINHTTP_FLAG_ESCAPE_DISABLE_QUERY = $00000080; // if escaping enabled escape path part, but do not escape query SECURITY_FLAG_IGNORE_UNKNOWN_CA = $00000100; SECURITY_FLAG_IGNORE_CERT_DATE_INVALID = $00002000; // expired X509 Cert. SECURITY_FLAG_IGNORE_CERT_CN_INVALID = $00001000; // bad common name in X509 Cert. SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE = $00000200; WINHTTP_AUTOPROXY_AUTO_DETECT = $00000001; WINHTTP_AUTOPROXY_CONFIG_URL = $00000002; WINHTTP_AUTOPROXY_RUN_INPROCESS = $00010000; WINHTTP_AUTOPROXY_RUN_OUTPROCESS_ONLY = $00020000; // // Flags for dwAutoDetectFlags // WINHTTP_AUTO_DETECT_TYPE_DHCP = $00000001; WINHTTP_AUTO_DETECT_TYPE_DNS_A = $00000002; // WinHttpOpen dwAccessType values (also for WINHTTP_PROXY_INFO::dwAccessType) WINHTTP_ACCESS_TYPE_DEFAULT_PROXY = 0; WINHTTP_ACCESS_TYPE_NO_PROXY = 1; WINHTTP_ACCESS_TYPE_NAMED_PROXY = 3; // WinHttpOpen prettifiers for optional parameters WINHTTP_NO_PROXY_NAME = nil; WINHTTP_NO_PROXY_BYPASS = nil; // // options manifests for WinHttp{Query|Set}Option // WINHTTP_OPTION_CALLBACK = 1; WINHTTP_OPTION_RESOLVE_TIMEOUT = 2; WINHTTP_OPTION_CONNECT_TIMEOUT = 3; WINHTTP_OPTION_CONNECT_RETRIES = 4; WINHTTP_OPTION_SEND_TIMEOUT = 5; WINHTTP_OPTION_RECEIVE_TIMEOUT = 6; WINHTTP_OPTION_RECEIVE_RESPONSE_TIMEOUT = 7; WINHTTP_OPTION_HANDLE_TYPE = 9; WINHTTP_OPTION_READ_BUFFER_SIZE = 12; WINHTTP_OPTION_WRITE_BUFFER_SIZE = 13; WINHTTP_OPTION_PARENT_HANDLE = 21; WINHTTP_OPTION_EXTENDED_ERROR = 24; WINHTTP_OPTION_SECURITY_FLAGS = 31; WINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT = 32; WINHTTP_OPTION_URL = 34; WINHTTP_OPTION_SECURITY_KEY_BITNESS = 36; WINHTTP_OPTION_PROXY = 38; WINHTTP_OPTION_USER_AGENT = 41; WINHTTP_OPTION_CONTEXT_VALUE = 45; WINHTTP_OPTION_CLIENT_CERT_CONTEXT = 47; WINHTTP_OPTION_REQUEST_PRIORITY = 58; WINHTTP_OPTION_HTTP_VERSION = 59; WINHTTP_OPTION_DISABLE_FEATURE = 63; WINHTTP_OPTION_CODEPAGE = 68; WINHTTP_OPTION_MAX_CONNS_PER_SERVER = 73; WINHTTP_OPTION_MAX_CONNS_PER_1_0_SERVER = 74; WINHTTP_OPTION_AUTOLOGON_POLICY = 77; WINHTTP_OPTION_SERVER_CERT_CONTEXT = 78; WINHTTP_OPTION_ENABLE_FEATURE = 79; WINHTTP_OPTION_WORKER_THREAD_COUNT = 80; WINHTTP_OPTION_PASSPORT_COBRANDING_TEXT = 81; WINHTTP_OPTION_PASSPORT_COBRANDING_URL = 82; WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH = 83; WINHTTP_OPTION_SECURE_PROTOCOLS = 84; WINHTTP_OPTION_ENABLETRACING = 85; WINHTTP_OPTION_PASSPORT_SIGN_OUT = 86; WINHTTP_OPTION_PASSPORT_RETURN_URL = 87; WINHTTP_OPTION_REDIRECT_POLICY = 88; WINHTTP_OPTION_MAX_HTTP_AUTOMATIC_REDIRECTS = 89; WINHTTP_OPTION_MAX_HTTP_STATUS_CONTINUE = 90; WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE = 91; WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE = 92; WINHTTP_FIRST_OPTION = WINHTTP_OPTION_CALLBACK; WINHTTP_LAST_OPTION = WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE; WINHTTP_OPTION_USERNAME = $1000; WINHTTP_OPTION_PASSWORD = $1001; WINHTTP_OPTION_PROXY_USERNAME = $1002; WINHTTP_OPTION_PROXY_PASSWORD = $1003; // // winhttp handle types // WINHTTP_HANDLE_TYPE_SESSION = 1; WINHTTP_HANDLE_TYPE_CONNECT = 2; WINHTTP_HANDLE_TYPE_REQUEST = 3; // // HTTP Response Status Codes: // HTTP_STATUS_CONTINUE = 100; // OK to continue with request HTTP_STATUS_SWITCH_PROTOCOLS = 101; // server has switched protocols in upgrade header HTTP_STATUS_OK = 200; // request completed HTTP_STATUS_CREATED = 201; // object created, reason = new URI HTTP_STATUS_ACCEPTED = 202; // async completion (TBS) HTTP_STATUS_PARTIAL = 203; // partial completion HTTP_STATUS_NO_CONTENT = 204; // no info to return HTTP_STATUS_RESET_CONTENT = 205; // request completed, but clear form HTTP_STATUS_PARTIAL_CONTENT = 206; // partial GET fulfilled HTTP_STATUS_WEBDAV_MULTI_STATUS = 207; // WebDAV Multi-Status HTTP_STATUS_AMBIGUOUS = 300; // server couldn't decide what to return HTTP_STATUS_MOVED = 301; // object permanently moved HTTP_STATUS_REDIRECT = 302; // object temporarily moved HTTP_STATUS_REDIRECT_METHOD = 303; // redirection w/ new access method HTTP_STATUS_NOT_MODIFIED = 304; // if-modified-since was not modified HTTP_STATUS_USE_PROXY = 305; // redirection to proxy, location header specifies proxy to use HTTP_STATUS_REDIRECT_KEEP_VERB = 307; // HTTP/1.1: keep same verb HTTP_STATUS_BAD_REQUEST = 400; // invalid syntax HTTP_STATUS_DENIED = 401; // access denied HTTP_STATUS_PAYMENT_REQ = 402; // payment required HTTP_STATUS_FORBIDDEN = 403; // request forbidden HTTP_STATUS_NOT_FOUND = 404; // object not found HTTP_STATUS_BAD_METHOD = 405; // method is not allowed HTTP_STATUS_NONE_ACCEPTABLE = 406; // no response acceptable to client found HTTP_STATUS_PROXY_AUTH_REQ = 407; // proxy authentication required HTTP_STATUS_REQUEST_TIMEOUT = 408; // server timed out waiting for request HTTP_STATUS_CONFLICT = 409; // user should resubmit with more info HTTP_STATUS_GONE = 410; // the resource is no longer available HTTP_STATUS_LENGTH_REQUIRED = 411; // the server refused to accept request w/o a length HTTP_STATUS_PRECOND_FAILED = 412; // precondition given in request failed HTTP_STATUS_REQUEST_TOO_LARGE = 413; // request entity was too large HTTP_STATUS_URI_TOO_LONG = 414; // request URI too long HTTP_STATUS_UNSUPPORTED_MEDIA = 415; // unsupported media type HTTP_STATUS_RETRY_WITH = 449; // retry after doing the appropriate action. HTTP_STATUS_SERVER_ERROR = 500; // internal server error HTTP_STATUS_NOT_SUPPORTED = 501; // required not supported HTTP_STATUS_BAD_GATEWAY = 502; // error response received from gateway HTTP_STATUS_SERVICE_UNAVAIL = 503; // temporarily overloaded HTTP_STATUS_GATEWAY_TIMEOUT = 504; // timed out waiting for gateway HTTP_STATUS_VERSION_NOT_SUP = 505; // HTTP version not supported HTTP_STATUS_FIRST = HTTP_STATUS_CONTINUE; HTTP_STATUS_LAST = HTTP_STATUS_VERSION_NOT_SUP; type HINTERNET = Pointer; PHINTERNET = ^HINTERNET; LPHINTERNET = PHINTERNET; INTERNET_PORT = Word; PINTERNET_PORT = ^INTERNET_PORT; LPINTERNET_PORT = PINTERNET_PORT; PLPCWSTR = ^LPCWSTR; // // WINHTTP_PROXY_INFO - structure supplied with WINHTTP_OPTION_PROXY to get/ // set proxy information on a WinHttpOpen() handle // PWinHttpProxyInfo = ^WINHTTP_PROXY_INFO; WINHTTP_PROXY_INFO = record dwAccessType: DWORD; // see WINHTTP_ACCESS_* types below lpszProxy: LPWSTR; // proxy server list lpszProxyBypass: LPWSTR; // proxy bypass list end; TWinHttpProxyInfo = WINHTTP_PROXY_INFO; LPWINHTTP_PROXY_INFO = PWinHttpProxyInfo; // WINHTTP_AUTOPROXY_OPTIONS - structure to work with AutoProxy support PWinHttpAutoProxyOptions = ^WINHTTP_AUTOPROXY_OPTIONS; WINHTTP_AUTOPROXY_OPTIONS = record dwFlags:DWORD; dwAutoDetectFlags:DWORD; lpszAutoConfigUrl:LPCWSTR; lpvReserved:Pointer; dwReserved:DWORD; fAutoLogonIfChallenged:BOOL; end; TWinHttpAutoProxyOptions = WINHTTP_AUTOPROXY_OPTIONS; LPWINHTTP_AUTOPROXY_OPTIONS = PWinHttpAutoProxyOptions; PWinHttpCurrentUserIEProxyConfig = ^WINHTTP_CURRENT_USER_IE_PROXY_CONFIG; WINHTTP_CURRENT_USER_IE_PROXY_CONFIG = record fAutoDetect:BOOL; lpszAutoConfigUrl:LPWSTR; lpszProxy:LPWSTR; lpszProxyBypass:LPWSTR; end; TWinHttpCurrentUserIEProxyConfig = WINHTTP_CURRENT_USER_IE_PROXY_CONFIG; LPWINHTTP_CURRENT_USER_IE_PROXY_CONFIG = PWinHttpCurrentUserIEProxyConfig; PWinHttpCheckPlatform = function (): BOOL;stdcall; PWinHttpGetDefaultProxyConfiguration = function (pProxyInfo:LPWINHTTP_AUTOPROXY_OPTIONS):BOOL;stdcall; PWinHttpOpen = function (pwszUserAgent:LPCWSTR; dwAccessType: DWORD; pwszProxyName:LPCWSTR; pwszProxyBypass:LPCWSTR; dwFlags:DWORD):HINTERNET; stdcall; PWinHttpConnect = function (hSession:HINTERNET; pswzServerName:LPCWSTR; nServerPort:INTERNET_PORT; dwReserved:DWORD):HINTERNET;stdcall; PWinHttpCloseHandle = function (hInternet:HINTERNET):BOOL;stdcall; PWinHttpQueryOption = function (hInternet:HINTERNET; dwOption:DWORD; lpBuffer:Pointer; lpdwBufferLength:LPDWORD):BOOL;stdcall; PWinHttpDetectAutoProxyConfigUrl = function (dwAutoDetectFlags:DWORD; ppwszAutoConfigUrl:PLPWSTR):BOOL;stdcall; PWinHttpGetProxyForUrl = function (hSession:HINTERNET; lpcwszUrl:LPCWSTR; pAutoProxyOptions:LPWINHTTP_AUTOPROXY_OPTIONS; pProxyInfo:LPWINHTTP_PROXY_INFO):BOOL;stdcall; PWinHttpGetIEProxyConfigForCurrentUser = function (pProxyConfig:LPWINHTTP_CURRENT_USER_IE_PROXY_CONFIG): BOOL;stdcall; TWinHttpFunctions = record WinHttpCheckPlatform:PWinHttpCheckPlatform; WinHttpGetDefaultProxyConfiguration:PWinHttpGetDefaultProxyConfiguration; WinHttpOpen:PWinHttpOpen; WinHttpConnect:PWinHttpConnect; WinHttpCloseHandle:PWinHttpCloseHandle; WinHttpQueryOption:PWinHttpQueryOption; WinHttpDetectAutoProxyConfigUrl:PWinHttpDetectAutoProxyConfigUrl; WinHttpGetProxyForUrl:PWinHttpGetProxyForUrl; WinHttpGetIEProxyConfigForCurrentUser:PWinHttpGetIEProxyConfigForCurrentUser; end; implementation end.