DELPHI如何封装http.sys
DELPHI如何封装http.sys
http.sys是windows操作系统内核级实现的支持高并发的http通讯协议,是为了https而开发。
思路:windows操作系统将HTTP.SYS通讯协议封装在httpapi.dll动态库里面。任何开发语言通过加载此动态库,即可调用它里面的函数。当然DELPHI也不例外。
封装非常简单,下面贴出tms sparkle如何封装http.sys的代码:
unit Sparkle.HttpSys.Api; {$I Sparkle.Inc} {$SCOPEDENUMS OFF} interface {$IFDEF MSWINDOWS} uses Winapi.Windows, Winapi.WinSock, System.SysUtils; {$MinEnumSize 4} {$Align 8} const HTTP_INITIALIZE_SERVER = $00000001; HTTP_INITIALIZE_CONFIG = $00000002; type HTTP_SERVER_PROPERTY = ( HttpServerAuthenticationProperty, HttpServerLoggingProperty, HttpServerQosProperty, HttpServerTimeoutsProperty, HttpServerQueueLengthProperty, HttpServerStateProperty, HttpServer503VerbosityProperty, HttpServerBindingProperty, HttpServerExtendedAuthenticationProperty, HttpServerListenEndpointProperty, HttpServerChannelBindProperty, HttpServerProtectionLevelProperty ); const HTTP_MAX_SERVER_QUEUE_LENGTH = $7FFFFFFF; HTTP_MIN_SERVER_QUEUE_LENGTH = 1; type HTTP_PROPERTY_FLAGS = ULONG; PHTTP_PROPERTY_FLAGS = ^HTTP_PROPERTY_FLAGS; const HTTP_PROPERTY_FLAG_NONE = $00000000; HTTP_PROPERTY_FLAG_PRESENT = $00000001; type HTTP_ENABLED_STATE = ( HttpEnabledStateActive, HttpEnabledStateInactive ); HTTP_STATE_INFO = record Flags: HTTP_PROPERTY_FLAGS; State: HTTP_ENABLED_STATE; end; PHTTP_STATE_INFO = ^HTTP_STATE_INFO; HTTP_503_RESPONSE_VERBOSITY = ( Http503ResponseVerbosityBasic, Http503ResponseVerbosityLimited, Http503ResponseVerbosityFull ); HTTP_QOS_SETTING_TYPE = ( HttpQosSettingTypeBandwidth, HttpQosSettingTypeConnectionLimit, HttpQosSettingTypeFlowRate ); HTTP_QOS_SETTING_INFO = record QosType: HTTP_QOS_SETTING_TYPE; QosSetting: PVOID; end; PHTTP_QOS_SETTING_INFO = ^HTTP_QOS_SETTING_INFO; HTTP_CONNECTION_LIMIT_INFO = record Flags: HTTP_PROPERTY_FLAGS; MaxConnections: ULONG; end; PHTTP_CONNECTION_LIMIT_INFO = ^HTTP_CONNECTION_LIMIT_INFO; HTTP_BANDWIDTH_LIMIT_INFO = record Flags: HTTP_PROPERTY_FLAGS; MaxBandwidth: ULONG; end; PHTTP_BANDWIDTH_LIMIT_INFO = ^HTTP_BANDWIDTH_LIMIT_INFO; HTTP_FLOWRATE_INFO = record Flags: HTTP_PROPERTY_FLAGS; MaxBandwidth: ULONG; MaxPeakBandwidth: ULONG; BurstSize: ULONG; end; PHTTP_FLOWRATE_INFO = ^HTTP_FLOWRATE_INFO; const HTTP_MIN_ALLOWED_BANDWIDTH_THROTTLING_RATE = ULONG(1024); HTTP_LIMIT_INFINITE = ULONG(-1); type HTTP_SERVICE_CONFIG_TIMEOUT_KEY = ( IdleConnectionTimeout = 0, HeaderWaitTimeout ); HTTP_SERVICE_CONFIG_TIMEOUT_PARAM = USHORT; PHTTP_SERVICE_CONFIG_TIMEOUT_PARAM = ^HTTP_SERVICE_CONFIG_TIMEOUT_PARAM; HTTP_SERVICE_CONFIG_TIMEOUT_SET = record KeyDesc: HTTP_SERVICE_CONFIG_TIMEOUT_KEY; ParamDesc: HTTP_SERVICE_CONFIG_TIMEOUT_PARAM; end; PHTTP_SERVICE_CONFIG_TIMEOUT_SET = ^HTTP_SERVICE_CONFIG_TIMEOUT_SET; HTTP_TIMEOUT_LIMIT_INFO = record Flags: HTTP_PROPERTY_FLAGS; EntityBody: USHORT; DrainEntityBody: USHORT; RequestQueue: USHORT; IdleConnection: USHORT; HeaderWait: USHORT; MinSendRate: ULONG; end; PHTTP_TIMEOUT_LIMIT_INFO = ^HTTP_TIMEOUT_LIMIT_INFO; HTTP_LISTEN_ENDPOINT_INFO = record Flags: HTTP_PROPERTY_FLAGS; EnableSharing: Boolean; end; PHTTP_LISTEN_ENDPOINT_INFO = ^HTTP_LISTEN_ENDPOINT_INFO; HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS = record DomainNameLength: USHORT; DomainName: PWideChar; RealmLength: USHORT; Realm: PWideChar; end; PHTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS = ^HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS; HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS = record RealmLength: USHORT; Realm: PWideChar; end; PHTTP_SERVER_AUTHENTICATION_BASIC_PARAMS = ^HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS; const HTTP_AUTH_ENABLE_BASIC = $00000001; HTTP_AUTH_ENABLE_DIGEST = $00000002; HTTP_AUTH_ENABLE_NTLM = $00000004; HTTP_AUTH_ENABLE_NEGOTIATE = $00000008; HTTP_AUTH_ENABLE_KERBEROS = $00000010; HTTP_AUTH_ENABLE_ALL = $0000001F; HTTP_AUTH_EX_FLAG_ENABLE_KERBEROS_CREDENTIAL_CACHING = $01; HTTP_AUTH_EX_FLAG_CAPTURE_CREDENTIAL = $02; type HTTP_SERVER_AUTHENTICATION_INFO = record Flags: HTTP_PROPERTY_FLAGS; AuthSchemes: ULONG; ReceiveMutualAuth: BOOLEAN; ReceiveContextHandle: BOOLEAN; DisableNTLMCredentialCaching: BOOLEAN; ExFlags: UCHAR; DigestParams: HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS; BasicParams: HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS; end; PHTTP_SERVER_AUTHENTICATION_INFO = ^HTTP_SERVER_AUTHENTICATION_INFO; HTTP_SERVICE_BINDING_TYPE = ( HttpServiceBindingTypeNone = 0, HttpServiceBindingTypeW, HttpServiceBindingTypeA ); HTTP_SERVICE_BINDING_BASE = record _Type: HTTP_SERVICE_BINDING_TYPE; end; PHTTP_SERVICE_BINDING_BASE = ^HTTP_SERVICE_BINDING_BASE; PPHTTP_SERVICE_BINDING_BASE = ^PHTTP_SERVICE_BINDING_BASE; HTTP_SERVICE_BINDING_A = record Base: HTTP_SERVICE_BINDING_BASE; Buffer: PAnsiChar; BufferSize: ULONG; end; PHTTP_SERVICE_BINDING_A = ^HTTP_SERVICE_BINDING_A; HTTP_SERVICE_BINDING_W = record Base: HTTP_SERVICE_BINDING_BASE; Buffer: PWCHAR; BufferSize: ULONG; end; PHTTP_SERVICE_BINDING_W = ^HTTP_SERVICE_BINDING_W; HTTP_AUTHENTICATION_HARDENING_LEVELS = ( HttpAuthenticationHardeningLegacy = 0, HttpAuthenticationHardeningMedium, HttpAuthenticationHardeningStrict ); const HTTP_CHANNEL_BIND_PROXY = $1; HTTP_CHANNEL_BIND_PROXY_COHOSTING = $20; HTTP_CHANNEL_BIND_NO_SERVICE_NAME_CHECK = $2; HTTP_CHANNEL_BIND_DOTLESS_SERVICE = $4; HTTP_CHANNEL_BIND_SECURE_CHANNEL_TOKEN = $8; HTTP_CHANNEL_BIND_CLIENT_SERVICE = $10; type HTTP_CHANNEL_BIND_INFO = record Hardening: HTTP_AUTHENTICATION_HARDENING_LEVELS; Flags: ULONG; ServiceNames: PPHTTP_SERVICE_BINDING_BASE; NumberOfServiceNames: ULONG; end; PHTTP_CHANNEL_BIND_INFO = ^HTTP_CHANNEL_BIND_INFO; HTTP_REQUEST_CHANNEL_BIND_STATUS = record ServiceName: PHTTP_SERVICE_BINDING_BASE; ChannelToken: PUCHAR; ChannelTokenSize: ULONG; Flags: ULONG; end; PHTTP_REQUEST_CHANNEL_BIND_STATUS = ^HTTP_REQUEST_CHANNEL_BIND_STATUS; const HTTP_LOG_FIELD_DATE = $00000001; HTTP_LOG_FIELD_TIME = $00000002; HTTP_LOG_FIELD_CLIENT_IP = $00000004; HTTP_LOG_FIELD_USER_NAME = $00000008; HTTP_LOG_FIELD_SITE_NAME = $00000010; HTTP_LOG_FIELD_COMPUTER_NAME = $00000020; HTTP_LOG_FIELD_SERVER_IP = $00000040; HTTP_LOG_FIELD_METHOD = $00000080; HTTP_LOG_FIELD_URI_STEM = $00000100; HTTP_LOG_FIELD_URI_QUERY = $00000200; HTTP_LOG_FIELD_STATUS = $00000400; HTTP_LOG_FIELD_WIN32_STATUS = $00000800; HTTP_LOG_FIELD_BYTES_SENT = $00001000; HTTP_LOG_FIELD_BYTES_RECV = $00002000; HTTP_LOG_FIELD_TIME_TAKEN = $00004000; HTTP_LOG_FIELD_SERVER_PORT = $00008000; HTTP_LOG_FIELD_USER_AGENT = $00010000; HTTP_LOG_FIELD_COOKIE = $00020000; HTTP_LOG_FIELD_REFERER = $00040000; HTTP_LOG_FIELD_VERSION = $00080000; HTTP_LOG_FIELD_HOST = $00100000; HTTP_LOG_FIELD_SUB_STATUS = $00200000; HTTP_LOG_FIELD_CLIENT_PORT = $00400000; HTTP_LOG_FIELD_URI = $00800000; HTTP_LOG_FIELD_SITE_ID = $01000000; HTTP_LOG_FIELD_REASON = $02000000; HTTP_LOG_FIELD_QUEUE_NAME = $04000000; type HTTP_LOGGING_TYPE = ( HttpLoggingTypeW3C, HttpLoggingTypeIIS, HttpLoggingTypeNCSA, HttpLoggingTypeRaw ); HTTP_LOGGING_ROLLOVER_TYPE = ( HttpLoggingRolloverSize, HttpLoggingRolloverDaily, HttpLoggingRolloverWeekly, HttpLoggingRolloverMonthly, HttpLoggingRolloverHourly ); const HTTP_MIN_ALLOWED_LOG_FILE_ROLLOVER_SIZE = ULONG(1* 1024* 1024); HTTP_LOGGING_FLAG_LOCAL_TIME_ROLLOVER = $00000001; HTTP_LOGGING_FLAG_USE_UTF8_CONVERSION = $00000002; HTTP_LOGGING_FLAG_LOG_ERRORS_ONLY = $00000004; HTTP_LOGGING_FLAG_LOG_SUCCESS_ONLY = $00000008; type HTTP_LOGGING_INFO = record Flags: HTTP_PROPERTY_FLAGS; LoggingFlags: ULONG; SoftwareName: PWideChar; SoftwareNameLength: USHORT; DirectoryNameLength: USHORT; DirectoryName: PWideChar; Format: HTTP_LOGGING_TYPE; Fields: ULONG; pExtFields: PVOID; NumOfExtFields: USHORT; MaxRecordSize: USHORT; RolloverType: HTTP_LOGGING_ROLLOVER_TYPE; RolloverSize: ULONG; pSecurityDescriptor: PSECURITY_DESCRIPTOR; end; PHTTP_LOGGING_INFO = ^HTTP_LOGGING_INFO; HTTP_BINDING_INFO = record Flags: HTTP_PROPERTY_FLAGS; RequestQueueHandle: THandle; end; PHTTP_BINDING_INFO = ^HTTP_BINDING_INFO; HTTP_PROTECTION_LEVEL_TYPE = ( HttpProtectionLevelUnrestricted, HttpProtectionLevelEdgeRestricted, HttpProtectionLevelRestricted ); HTTP_PROTECTION_LEVEL_INFO = record Flags: HTTP_PROPERTY_FLAGS; Level: HTTP_PROTECTION_LEVEL_TYPE; end; PHTTP_PROTECTION_LEVEL_INFO = ^HTTP_PROTECTION_LEVEL_INFO; const HTTP_CREATE_REQUEST_QUEUE_FLAG_OPEN_EXISTING = $00000001; HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER = $00000002; HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY = $00000001; HTTP_RECEIVE_REQUEST_FLAG_FLUSH_BODY = $00000002; HTTP_RECEIVE_REQUEST_ENTITY_BODY_FLAG_FILL_BUFFER = $00000001; HTTP_SEND_RESPONSE_FLAG_DISCONNECT = $00000001; HTTP_SEND_RESPONSE_FLAG_MORE_DATA = $00000002; HTTP_SEND_RESPONSE_FLAG_BUFFER_DATA = $00000004; HTTP_SEND_RESPONSE_FLAG_ENABLE_NAGLING = $00000008; HTTP_SEND_RESPONSE_FLAG_PROCESS_RANGES = $00000020; HTTP_FLUSH_RESPONSE_FLAG_RECURSIVE = $00000001; type HTTP_OPAQUE_ID = ULONGLONG; PHTTP_OPAQUE_ID = ^HTTP_OPAQUE_ID; HTTP_REQUEST_ID = HTTP_OPAQUE_ID; PHTTP_REQUEST_ID = ^HTTP_REQUEST_ID; HTTP_CONNECTION_ID = HTTP_OPAQUE_ID; PHTTP_CONNECTION_ID = ^HTTP_CONNECTION_ID; HTTP_RAW_CONNECTION_ID = HTTP_OPAQUE_ID; PHTTP_RAW_CONNECTION_ID = ^HTTP_RAW_CONNECTION_ID; HTTP_URL_GROUP_ID = HTTP_OPAQUE_ID; PHTTP_URL_GROUP_ID = ^HTTP_URL_GROUP_ID; HTTP_SERVER_SESSION_ID = HTTP_OPAQUE_ID; PHTTP_SERVER_SESSION_ID = ^HTTP_SERVER_SESSION_ID; const HTTP_NULL_ID = ULONG(0); HTTP_BYTE_RANGE_TO_EOF = ULONGLONG(-1); type HTTP_BYTE_RANGE = record StartingOffset: ULARGE_INTEGER; Length: ULARGE_INTEGER; end; PHTTP_BYTE_RANGE = ^HTTP_BYTE_RANGE; HTTP_VERSION = record MajorVersion: USHORT; MinorVersion: USHORT; end; PHTTP_VERSION = ^HTTP_VERSION; const HTTP_VERSION_UNKNOWN: HTTP_VERSION = (MajorVersion: 0; MinorVersion: 0); HTTP_VERSION_0_9: HTTP_VERSION = (MajorVersion: 0; MinorVersion: 9); HTTP_VERSION_1_0: HTTP_VERSION = (MajorVersion: 1; MinorVersion: 0); HTTP_VERSION_1_1: HTTP_VERSION = (MajorVersion: 1; MinorVersion: 1); type HTTP_VERB = ( HttpVerbUnparsed, HttpVerbUnknown, HttpVerbInvalid, HttpVerbOPTIONS, HttpVerbGET, HttpVerbHEAD, HttpVerbPOST, HttpVerbPUT, HttpVerbDELETE, HttpVerbTRACE, HttpVerbCONNECT, HttpVerbTRACK, HttpVerbMOVE, HttpVerbCOPY, HttpVerbPROPFIND, HttpVerbPROPPATCH, HttpVerbMKCOL, HttpVerbLOCK, HttpVerbUNLOCK, HttpVerbSEARCH, HttpVerbMaximum ); HTTP_HEADER_ID = ( HttpHeaderCacheControl = 0, // general-header [section 4.5] HttpHeaderConnection = 1, // general-header [section 4.5] HttpHeaderDate = 2, // general-header [section 4.5] HttpHeaderKeepAlive = 3, // general-header [not in rfc] HttpHeaderPragma = 4, // general-header [section 4.5] HttpHeaderTrailer = 5, // general-header [section 4.5] HttpHeaderTransferEncoding = 6, // general-header [section 4.5] HttpHeaderUpgrade = 7, // general-header [section 4.5] HttpHeaderVia = 8, // general-header [section 4.5] HttpHeaderWarning = 9, // general-header [section 4.5] HttpHeaderAllow = 10, // entity-header [section 7.1] HttpHeaderContentLength = 11, // entity-header [section 7.1] HttpHeaderContentType = 12, // entity-header [section 7.1] HttpHeaderContentEncoding = 13, // entity-header [section 7.1] HttpHeaderContentLanguage = 14, // entity-header [section 7.1] HttpHeaderContentLocation = 15, // entity-header [section 7.1] HttpHeaderContentMd5 = 16, // entity-header [section 7.1] HttpHeaderContentRange = 17, // entity-header [section 7.1] HttpHeaderExpires = 18, // entity-header [section 7.1] HttpHeaderLastModified = 19, // entity-header [section 7.1] HttpHeaderAccept = 20, // request-header [section 5.3] HttpHeaderAcceptCharset = 21, // request-header [section 5.3] HttpHeaderAcceptEncoding = 22, // request-header [section 5.3] HttpHeaderAcceptLanguage = 23, // request-header [section 5.3] HttpHeaderAuthorization = 24, // request-header [section 5.3] HttpHeaderCookie = 25, // request-header [not in rfc] HttpHeaderExpect = 26, // request-header [section 5.3] HttpHeaderFrom = 27, // request-header [section 5.3] HttpHeaderHost = 28, // request-header [section 5.3] HttpHeaderIfMatch = 29, // request-header [section 5.3] HttpHeaderIfModifiedSince = 30, // request-header [section 5.3] HttpHeaderIfNoneMatch = 31, // request-header [section 5.3] HttpHeaderIfRange = 32, // request-header [section 5.3] HttpHeaderIfUnmodifiedSince = 33, // request-header [section 5.3] HttpHeaderMaxForwards = 34, // request-header [section 5.3] HttpHeaderProxyAuthorization = 35, // request-header [section 5.3] HttpHeaderReferer = 36, // request-header [section 5.3] HttpHeaderRange = 37, // request-header [section 5.3] HttpHeaderTe = 38, // request-header [section 5.3] HttpHeaderTranslate = 39, // request-header [webDAV, not in rfc 2518] HttpHeaderUserAgent = 40, // request-header [section 5.3] HttpHeaderRequestMaximum = 41, // Response Headers HttpHeaderAcceptRanges = 20, // response-header [section 6.2] HttpHeaderAge = 21, // response-header [section 6.2] HttpHeaderEtag = 22, // response-header [section 6.2] HttpHeaderLocation = 23, // response-header [section 6.2] HttpHeaderProxyAuthenticate = 24, // response-header [section 6.2] HttpHeaderRetryAfter = 25, // response-header [section 6.2] HttpHeaderServer = 26, // response-header [section 6.2] HttpHeaderSetCookie = 27, // response-header [not in rfc] HttpHeaderVary = 28, // response-header [section 6.2] HttpHeaderWwwAuthenticate = 29, // response-header [section 6.2] HttpHeaderResponseMaximum = 30, HttpHeaderMaximum = 41 ); HTTP_KNOWN_HEADER = record RawValueLength: USHORT; pRawValue: PAnsiChar; end; PHTTP_KNOWN_HEADER = ^HTTP_KNOWN_HEADER; HTTP_UNKNOWN_HEADER = record NameLength: USHORT; RawValueLength: USHORT; pName: PAnsiChar; pRawValue: PAnsiChar; end; PHTTP_UNKNOWN_HEADER = ^HTTP_UNKNOWN_HEADER; HTTP_LOG_DATA_TYPE = ( HttpLogDataTypeFields ); HTTP_LOG_DATA = record _Type: HTTP_LOG_DATA_TYPE; end; PHTTP_LOG_DATA = ^HTTP_LOG_DATA; HTTP_LOG_FIELDS_DATA = record Base: HTTP_LOG_DATA; UserNameLength: USHORT; UriStemLength: USHORT; ClientIpLength: USHORT; ServerNameLength: USHORT; ServiceNameLength: USHORT; ServerIpLength: USHORT; MethodLength: USHORT; UriQueryLength: USHORT; HostLength: USHORT; UserAgentLength: USHORT; CookieLength: USHORT; ReferrerLength: USHORT; UserName: PWCHAR; UriStem: PWCHAR; ClientIp: PAnsiChar; ServerName: PAnsiChar; ServiceName: PAnsiChar; ServerIp: PAnsiChar; Method: PAnsiChar; UriQuery: PAnsiChar; Host: PAnsiChar; UserAgent: PAnsiChar; Cookie: PAnsiChar; Referrer: PAnsiChar; ServerPort: USHORT; ProtocolStatus: USHORT; Win32Status: ULONG; MethodNum: HTTP_VERB; SubStatus: USHORT; end; PHTTP_LOG_FIELDS_DATA = ^HTTP_LOG_FIELDS_DATA; HTTP_DATA_CHUNK_TYPE = ( HttpDataChunkFromMemory, HttpDataChunkFromFileHandle, HttpDataChunkFromFragmentCache, HttpDataChunkFromFragmentCacheEx, HttpDataChunkMaximum ); HTTP_DATA_CHUNK = record DataChunkType: HTTP_DATA_CHUNK_TYPE; case HTTP_DATA_CHUNK_TYPE of HttpDataChunkFromMemory: ( pBuffer: PVOID; BufferLength: ULONG; ); HttpDataChunkFromFileHandle: ( ByteRange: HTTP_BYTE_RANGE; FileHandle: THandle; ); HttpDataChunkFromFragmentCache: ( FragmentNameLength: USHORT; pFragmentName: PWideChar; ); HttpDataChunkFromFragmentCacheEx: ( ByteRangeEx: HTTP_BYTE_RANGE; pFragmentNameEx: PWideChar; ); end; PHTTP_DATA_CHUNK = ^HTTP_DATA_CHUNK; HTTP_REQUEST_HEADERS = record UnknownHeaderCount: USHORT; pUnknownHeaders: PHTTP_UNKNOWN_HEADER; TrailerCount: USHORT; pTrailers: PHTTP_UNKNOWN_HEADER; KnownHeaders: array[Low(HTTP_HEADER_ID)..Pred(HttpHeaderRequestMaximum)] of HTTP_KNOWN_HEADER; end; PHTTP_REQUEST_HEADERS = ^HTTP_REQUEST_HEADERS; HTTP_RESPONSE_HEADERS = record UnknownHeaderCount: USHORT; pUnknownHeaders: PHTTP_UNKNOWN_HEADER; TrailerCount: USHORT; pTrailers: PHTTP_UNKNOWN_HEADER; KnownHeaders: Array[Low(HTTP_HEADER_ID)..Pred(HttpHeaderResponseMaximum)] of HTTP_KNOWN_HEADER; end; PHTTP_RESPONSE_HEADERS = ^HTTP_RESPONSE_HEADERS; HTTP_TRANSPORT_ADDRESS = record pRemoteAddress: PSOCKADDR; pLocalAddress: PSOCKADDR; end; PHTTP_TRANSPORT_ADDRESS = ^HTTP_TRANSPORT_ADDRESS; HTTP_COOKED_URL = record FullUrlLength: USHORT; HostLength: USHORT; AbsPathLength: USHORT; QueryStringLength: USHORT; pFullUrl: PWideChar; pHost: PWideChar; pAbsPath: PWideChar; pQueryString: PWideChar; end; PHTTP_COOKED_URL = ^HTTP_COOKED_URL; HTTP_URL_CONTEXT = ULONGLONG; const HTTP_URL_FLAG_REMOVE_ALL = $00000001; type HTTP_AUTH_STATUS = ( HttpAuthStatusSuccess, HttpAuthStatusNotAuthenticated, HttpAuthStatusFailure ); HTTP_REQUEST_AUTH_TYPE = ( HttpRequestAuthTypeNone = 0, HttpRequestAuthTypeBasic, HttpRequestAuthTypeDigest, HttpRequestAuthTypeNTLM, HttpRequestAuthTypeNegotiate, HttpRequestAuthTypeKerberos ); HTTP_SSL_CLIENT_CERT_INFO = record CertFlags: ULONG; CertEncodedSize: ULONG; pCertEncoded: PUCHAR; Token: THandle; CertDeniedByMapper: BOOLEAN; end; PHTTP_SSL_CLIENT_CERT_INFO = ^HTTP_SSL_CLIENT_CERT_INFO; const HTTP_RECEIVE_SECURE_CHANNEL_TOKEN = $1; type HTTP_SSL_INFO = record ServerCertKeySize: USHORT; ConnectionKeySize: USHORT; ServerCertIssuerSize: ULONG; ServerCertSubjectSize: ULONG; pServerCertIssuer: PAnsiChar; pServerCertSubject: PAnsiChar; pClientCertInfo: PHTTP_SSL_CLIENT_CERT_INFO; SslClientCertNegotiated: ULONG; end; PHTTP_SSL_INFO = ^HTTP_SSL_INFO; HTTP_REQUEST_INFO_TYPE = ( HttpRequestInfoTypeAuth, HttpRequestInfoTypeChannelBind ); HTTP_REQUEST_INFO = record InfoType: HTTP_REQUEST_INFO_TYPE; InfoLength: ULONG; pInfo: PVOID; end; PHTTP_REQUEST_INFO = ^HTTP_REQUEST_INFO; SECURITY_STATUS = LongInt; const HTTP_REQUEST_AUTH_FLAG_TOKEN_FOR_CACHED_CRED = $00000001; type HTTP_REQUEST_AUTH_INFO = record AuthStatus: HTTP_AUTH_STATUS; SecStatus: SECURITY_STATUS; Flags: ULONG; AuthType: HTTP_REQUEST_AUTH_TYPE; AccessToken: THandle; ContextAttributes: ULONG; PackedContextLength: ULONG; PackedContextType: ULONG; PackedContext: PVOID; MutualAuthDataLength: ULONG; pMutualAuthData: PChar; PackageNameLength: USHORT; pPackageName: PWideChar; end; PHTTP_REQUEST_AUTH_INFO = ^HTTP_REQUEST_AUTH_INFO; HTTP_REQUEST_V2 = record Flags: ULONG; ConnectionId: HTTP_CONNECTION_ID; RequestId: HTTP_REQUEST_ID; UrlContext: HTTP_URL_CONTEXT; Version: HTTP_VERSION; Verb: HTTP_VERB; UnknownVerbLength: USHORT; RawUrlLength: USHORT; pUnknownVerb: PAnsiChar; pRawUrl: PAnsiChar; CookedUrl: HTTP_COOKED_URL; Address: HTTP_TRANSPORT_ADDRESS; Headers: HTTP_REQUEST_HEADERS; BytesReceived: ULONGLONG; EntityChunkCount: USHORT; pEntityChunks: PHTTP_DATA_CHUNK; RawConnectionId: HTTP_RAW_CONNECTION_ID; pSslInfo: PHTTP_SSL_INFO; Dummy1: DWORD; RequestInfoCount: USHORT; pRequestInfo: PHTTP_REQUEST_INFO; end; PHTTP_REQUEST_V2 = ^HTTP_REQUEST_V2; HTTP_REQUEST = HTTP_REQUEST_V2; PHTTP_REQUEST = ^HTTP_REQUEST; const HTTP_REQUEST_FLAG_MORE_ENTITY_BODY_EXISTS = $00000001; HTTP_REQUEST_FLAG_IP_ROUTED = $00000002; const HTTP_RESPONSE_FLAG_MULTIPLE_ENCODINGS_AVAILABLE = $00000001; type HTTP_RESPONSE_INFO_TYPE = ( HttpResponseInfoTypeMultipleKnownHeaders, HttpResponseInfoTypeAuthenticationProperty, HttpResponseInfoTypeQoSProperty, HttpResponseInfoTypeChannelBind ); HTTP_RESPONSE_INFO = record _Type: HTTP_RESPONSE_INFO_TYPE; Length: ULONG; pInfo: PVOID; end; PHTTP_RESPONSE_INFO = ^HTTP_RESPONSE_INFO; const HTTP_RESPONSE_INFO_FLAGS_PRESERVE_ORDER = $00000001; type HTTP_MULTIPLE_KNOWN_HEADERS = record HeaderId: HTTP_HEADER_ID; Flags: ULONG; KnownHeaderCount: USHORT; KnownHeaders: PHTTP_KNOWN_HEADER; end; PHTTP_MULTIPLE_KNOWN_HEADERS = ^HTTP_MULTIPLE_KNOWN_HEADERS; HTTP_RESPONSE_V2 = record Flags: ULONG; Version: HTTP_VERSION; StatusCode: USHORT; ReasonLength: USHORT; pReason: PAnsiChar; Headers: HTTP_RESPONSE_HEADERS; EntityChunkCount: USHORT; pEntityChunks: PHTTP_DATA_CHUNK; ResponseInfoCount: USHORT; pResponseInfo: PHTTP_RESPONSE_INFO; end; PHTTP_RESPONSE_V2 = ^HTTP_RESPONSE_V2; HTTP_RESPONSE = HTTP_RESPONSE_V2; PHTTP_RESPONSE = ^HTTP_RESPONSE; HTTPAPI_VERSION = record HttpApiMajorVersion: USHORT; HttpApiMinorVersion: USHORT; end; PHTTPAPI_VERSION = ^HTTPAPI_VERSION; const HTTPAPI_VERSION_1: HTTPAPI_VERSION = (HttpApiMajorVersion: 1; HttpApiMinorVersion: 0); HTTPAPI_VERSION_2: HTTPAPI_VERSION = (HttpApiMajorVersion: 2; HttpApiMinorVersion: 0); type HTTP_CACHE_POLICY_TYPE = ( HttpCachePolicyNocache, HttpCachePolicyUserInvalidates, HttpCachePolicyTimeToLive, HttpCachePolicyMaximum ); HTTP_CACHE_POLICY = record Policy: HTTP_CACHE_POLICY_TYPE; SecondsToLive: ULONG; end; PHTTP_CACHE_POLICY = ^HTTP_CACHE_POLICY; HTTP_SERVICE_CONFIG_ID = ( HttpServiceConfigIPListenList, HttpServiceConfigSSLCertInfo, HttpServiceConfigUrlAclInfo, HttpServiceConfigTimeout, HttpServiceConfigCache, HttpServiceConfigMax ); HTTP_SERVICE_CONFIG_QUERY_TYPE = ( HttpServiceConfigQueryExact, HttpServiceConfigQueryNext, HttpServiceConfigQueryMax ); HTTP_SERVICE_CONFIG_SSL_KEY = record pIpPort: PSOCKADDR; end; PHTTP_SERVICE_CONFIG_SSL_KEY = ^HTTP_SERVICE_CONFIG_SSL_KEY; HTTP_SERVICE_CONFIG_SSL_PARAM = record SslHashLength: ULONG; pSslHash: PVOID; AppId: TGUID; pSslCertStoreName: PWideChar; DefaultCertCheckMode: LongInt; DefaultRevocationFreshnessTime: LongInt; DefaultRevocationUrlRetrievalTimeout: LongInt; pDefaultSslCtlIdentifier: PWideChar; pDefaultSslCtlStoreName: PWideChar; DefaultFlags: LongInt; end; PHTTP_SERVICE_CONFIG_SSL_PARAM = ^HTTP_SERVICE_CONFIG_SSL_PARAM; const HTTP_SERVICE_CONFIG_SSL_FLAG_USE_DS_MAPPER = $00000001; HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT = $00000002; HTTP_SERVICE_CONFIG_SSL_FLAG_NO_RAW_FILTER = $00000004; type HTTP_SERVICE_CONFIG_SSL_SET = record KeyDesc: HTTP_SERVICE_CONFIG_SSL_KEY; ParamDesc: HTTP_SERVICE_CONFIG_SSL_PARAM; end; PHTTP_SERVICE_CONFIG_SSL_SET = ^HTTP_SERVICE_CONFIG_SSL_SET; HTTP_SERVICE_CONFIG_SSL_QUERY = record QueryDesc: HTTP_SERVICE_CONFIG_QUERY_TYPE; KeyDesc: HTTP_SERVICE_CONFIG_SSL_KEY; dwToken: LongInt; end {_HTTP_SERVICE_CONFIG_SSL_QUERY}; PHTTP_SERVICE_CONFIG_SSL_QUERY = ^HTTP_SERVICE_CONFIG_SSL_QUERY; HTTP_SERVICE_CONFIG_IP_LISTEN_PARAM = record AddrLength: USHORT; pAddress: PSOCKADDR; end; PHTTP_SERVICE_CONFIG_IP_LISTEN_PARAM = ^HTTP_SERVICE_CONFIG_IP_LISTEN_PARAM; // HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY = record // AddrCount: ULONG; // AddrList: Array[0..0] of SOCKADDR_STORAGE; // end; // PHTTP_SERVICE_CONFIG_IP_LISTEN_QUERY = ^HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY; HTTP_SERVICE_CONFIG_URLACL_KEY = record pUrlPrefix: PWideChar; end; PHTTP_SERVICE_CONFIG_URLACL_KEY = ^HTTP_SERVICE_CONFIG_URLACL_KEY; HTTP_SERVICE_CONFIG_URLACL_PARAM = record pStringSecurityDescriptor: PWideChar; end; PHTTP_SERVICE_CONFIG_URLACL_PARAM = ^HTTP_SERVICE_CONFIG_URLACL_PARAM; HTTP_SERVICE_CONFIG_URLACL_SET = record KeyDesc: HTTP_SERVICE_CONFIG_URLACL_KEY; ParamDesc: HTTP_SERVICE_CONFIG_URLACL_PARAM; end; PHTTP_SERVICE_CONFIG_URLACL_SET = ^HTTP_SERVICE_CONFIG_URLACL_SET; HTTP_SERVICE_CONFIG_URLACL_QUERY = record QueryDesc: HTTP_SERVICE_CONFIG_QUERY_TYPE; KeyDesc: HTTP_SERVICE_CONFIG_URLACL_KEY; dwToken: LongInt; end; PHTTP_SERVICE_CONFIG_URLACL_QUERY = ^HTTP_SERVICE_CONFIG_URLACL_QUERY; HTTP_SERVICE_CONFIG_CACHE_KEY = ( MaxCacheResponseSize = 0, CacheRangeChunkSize ); HTTP_SERVICE_CONFIG_CACHE_PARAM = ULONG; PHTTP_SERVICE_CONFIG_CACHE_PARAM = ^HTTP_SERVICE_CONFIG_CACHE_PARAM; HTTP_SERVICE_CONFIG_CACHE_SET = record KeyDesc: HTTP_SERVICE_CONFIG_CACHE_KEY; ParamDesc: HTTP_SERVICE_CONFIG_CACHE_PARAM; end {HTTP_SERVICE_CONFIG_CACHE_SET}; PHTTP_SERVICE_CONFIG_CACHE_SET = ^HTTP_SERVICE_CONFIG_CACHE_SET; // Specific Types (not present in original http.h) const HttpVerbNames: array[HTTP_VERB] of string = ( '', //HttpVerbUnparsed, '', //HttpVerbUnknown, '', //HttpVerbInvalid, 'OPTIONS', //HttpVerbOPTIONS, 'GET', //HttpVerbGET, 'HEAD', //HttpVerbHEAD, 'POST', //HttpVerbPOST, 'PUT', //HttpVerbPUT, 'DELETE', //HttpVerbDELETE, 'TRACE', //HttpVerbTRACE, 'CONNECT', //HttpVerbCONNECT, 'TRACK', //HttpVerbTRACK, 'MOVE', //HttpVerbMOVE, 'COPY', //HttpVerbCOPY, 'PROPFIND', //HttpVerbPROPFIND, 'PROPPATCH', //HttpVerbPROPPATCH, 'MKCOL', //HttpVerbMKCOL, 'LOCK', //HttpVerbLOCK, 'UNLOCK', //HttpVerbUNLOCK, 'SEARCH', //HttpVerbSEARCH, '' //HttpVerbMaximum ); HttpRequestHeaderNames: array[HTTP_HEADER_ID] of string = ( 'cache-control', //HttpHeaderCacheControl 'connection', //HttpHeaderConnection 'date', //HttpHeaderDate 'keep-alive', //HttpHeaderKeepAlive 'pragma', //HttpHeaderPragma 'trailer', //HttpHeaderTrailer 'transfer-encoding', //HttpHeaderTransferEncoding 'upgrade', //HttpHeaderUpgrade 'via', //HttpHeaderVia 'warning', //HttpHeaderWarning 'allow', //HttpHeaderAllow 'content-length', //HttpHeaderContentLength 'content-type', //HttpHeaderContentType 'content-encoding', //HttpHeaderContentEncoding 'content-language', //HttpHeaderContentLanguage 'content-location', //HttpHeaderContentLocation 'content-md5', //HttpHeaderContentMd5 'content-range', //HttpHeaderContentRange 'expires', //HttpHeaderExpires 'last-modified', //HttpHeaderLastModified 'accept', //HttpHeaderAccept 'accept-charset', //HttpHeaderAcceptCharset 'accept-encoding', //HttpHeaderAcceptEncoding 'accept-language', //HttpHeaderAcceptLanguage 'authorization', //HttpHeaderAuthorization 'cookie', //HttpHeaderCookie 'expect', //HttpHeaderExpect 'from', //HttpHeaderFrom 'host', //HttpHeaderHost 'if-match', //HttpHeaderIfMatch 'if-modified-since', //HttpHeaderIfModifiedSince 'if-none-match', //HttpHeaderIfNoneMatch 'if-range', //HttpHeaderIfRange 'if-unmodified-since', //HttpHeaderIfUnmodifiedSince 'max-forwards', //HttpHeaderMaxForwards 'proxy-authorization', //HttpHeaderProxyAuthorization 'referer', //HttpHeaderReferer 'range', //HttpHeaderRange 'te', //HttpHeaderTe 'translate', //HttpHeaderTranslate 'user-agent', //HttpHeaderUserAgent '' //HttpHeaderRequestMaximum ); HttpResponseHeaderNames: array[HTTP_HEADER_ID] of string = ( 'cache-control', //HttpHeaderCacheControl 'connection', //HttpHeaderConnection 'date', //HttpHeaderDate 'keep-alive', //HttpHeaderKeepAlive 'pragma', //HttpHeaderPragma 'trailer', //HttpHeaderTrailer 'transfer-encoding', //HttpHeaderTransferEncoding 'upgrade', //HttpHeaderUpgrade 'via', //HttpHeaderVia 'warning', //HttpHeaderWarning 'allow', //HttpHeaderAllow 'content-length', //HttpHeaderContentLength 'content-type', //HttpHeaderContentType 'content-encoding', //HttpHeaderContentEncoding 'content-language', //HttpHeaderContentLanguage 'content-location', //HttpHeaderContentLocation 'content-md5', //HttpHeaderContentMd5 'content-range', //HttpHeaderContentRange 'expires', //HttpHeaderExpires 'last-modified', //HttpHeaderLastModified 'accept-ranges', //HttpHeaderAcceptRanges 'age', //HttpHeaderAge 'etag', //HttpHeaderEtag 'location', //HttpHeaderLocation 'proxy-authenticate', //HttpHeaderProxyAuthenticate 'retry-after', //HttpHeaderRetryAfter 'server', //HttpHeaderServer 'set-cookie', //HttpHeaderSetCookie 'vary', //HttpHeaderVary 'www-authenticate', //HttpHeaderWwwAuthenticate '', '', '', '', '', '', '', '', '', '', '', '' //HttpHeaderMaximum ); var HttpInitialize: function(Version: HTTPAPI_VERSION; Flags: ULONG; pReserved: PVOID = nil): HRESULT; stdcall; HttpTerminate: function(Flags: ULONG; pReserved: PVOID = nil): HRESULT; stdcall; HttpCreateHttpHandle: function(var pReqQueueHandle: THandle; Reserved: ULONG = 0): HRESULT; stdcall; HttpCreateRequestQueue: function(Version: HTTPAPI_VERSION; pName: PWideChar; pSecurityAttributes: PSecurityAttributes; Flags: ULONG; var pReqQueueHandle: THandle): HRESULT; stdcall; HttpCloseRequestQueue: function(ReqQueueHandle: THandle): HRESULT; stdcall; HttpSetRequestQueueProperty: function(Handle: THandle; Property_: HTTP_SERVER_PROPERTY; pPropertyInformation: PVOID; PropertyInformationLength: ULONG; Reserved: ULONG = 0; pReserved: PVOID = nil): HRESULT; stdcall; HttpQueryRequestQueueProperty: function(Handle: THandle; Property_: HTTP_SERVER_PROPERTY; pPropertyInformation: PVOID; PropertyInformationLength: ULONG; Reserved: ULONG; var pReturnLength: ULONG; pReserved: PVOID = nil): HRESULT; stdcall; HttpShutdownRequestQueue: function(ReqQueueHandle: THandle): HRESULT; stdcall; HttpReceiveClientCertificate: function(ReqQueueHandle: THandle; ConnectionId: HTTP_CONNECTION_ID; Flags: ULONG; var pSslClientCertInfo: HTTP_SSL_CLIENT_CERT_INFO; SslClientCertInfoSize: ULONG; var pBytesReceived: ULONG; pOverlapped: POverlapped): HRESULT; stdcall; HttpCreateServerSession: function(Version: HTTPAPI_VERSION; var pServerSessionId: HTTP_SERVER_SESSION_ID; Reserved: ULONG = 0): HRESULT; stdcall; HttpCloseServerSession: function(ServerSessionId: HTTP_SERVER_SESSION_ID): HRESULT; stdcall; // HttpQueryServerSessionProperty: function(ServerSessionId: HTTP_SERVER_SESSION_ID; Property_: HTTP_SERVER_PROPERTY; // pPropertyInformation: PVOID; PropertyInformationLength: ULONG; pReturnLength: PULONG): HRESULT; stdcall; HttpSetServerSessionProperty: function(ServerSessionId: HTTP_SERVER_SESSION_ID; AProperty: HTTP_SERVER_PROPERTY; pPropertyInformation: PVOID; PropertyInformationLength: ULONG): HRESULT; stdcall; HttpAddUrl: function(ReqQueueHandle: THandle; pFullyQualifiedUrl: PWideChar; pReserved: PVOID = nil): HRESULT; stdcall; HttpRemoveUrl: function(ReqQueueHandle: THandle; pFullyQualifiedUrl: PWideChar): HRESULT; stdcall; HttpCreateUrlGroup: function(ServerSessionId: HTTP_SERVER_SESSION_ID; var pUrlGroupId: HTTP_URL_GROUP_ID; Reserved: ULONG = 0): HRESULT; stdcall; HttpCloseUrlGroup: function(UrlGroupId: HTTP_URL_GROUP_ID): HRESULT; stdcall; HttpAddUrlToUrlGroup: function(UrlGroupId: HTTP_URL_GROUP_ID; pFullyQualifiedUrl: PWideChar; UrlContext: HTTP_URL_CONTEXT; Reserved: ULONG = 0): HRESULT; stdcall; HttpRemoveUrlFromUrlGroup: function(UrlGroupId: HTTP_URL_GROUP_ID; pFullyQualifiedUrl: PWideChar; Flags: ULONG): HRESULT; stdcall; HttpSetUrlGroupProperty: function(UrlGroupId: HTTP_URL_GROUP_ID; Property_: HTTP_SERVER_PROPERTY; pPropertyInformation: PVOID; PropertyInformationLength: ULONG): HRESULT; stdcall; // HttpQueryUrlGroupProperty: function(UrlGroupId: HTTP_URL_GROUP_ID; var AProperty: HTTP_SERVER_PROPERTY; // pPropertyInformation: PVOID; PropertyInformationLength: ULONG; pReturnLength: PULONG = nil): HRESULT; stdcall; HttpReceiveHttpRequest: function(ReqQueueHandle: THandle; RequestId: HTTP_REQUEST_ID; Flags: ULONG; RequestBuffer: PHTTP_REQUEST; RequestBufferLength: ULONG; var pBytesReceived: ULONG; pOverlapped: POverlapped): HRESULT; stdcall; HttpReceiveRequestEntityBody: function(ReqQueueHandle: THandle; RequestId: HTTP_REQUEST_ID; Flags: ULONG; pBuffer: PVOID; BufferLength: ULONG; var pBytesReceived: ULONG; pOverlapped: POverlapped): HRESULT; stdcall; HttpSendHttpResponse: function(ReqQueueHandle: THandle; RequestId: HTTP_REQUEST_ID; Flags: ULONG; pHttpResponse: PHTTP_RESPONSE; pCachePolicy: PHTTP_CACHE_POLICY; var pBytesSend: ULONG; pReserved1: PVOID = nil; Reserved2: ULONG = 0; pOverlapped: POverlapped = nil; pLogData: PHTTP_LOG_DATA = nil): HRESULT; stdcall; HttpSendResponseEntityBody: function(ReqQueueHandle: THandle; RequestId: HTTP_REQUEST_ID; Flags: ULONG; EntityChunkCount: USHORT; pEntityChunks: PHTTP_DATA_CHUNK; var pBytesSent: ULONG; pReserved1: PVOID = nil; Reserved2: ULONG = 0; pOverlapped: POverlapped = nil; pLogData: PHTTP_LOG_DATA = nil): HRESULT; stdcall; HttpWaitForDisconnect: function(ReqQueueHandle: THandle; ConnectionId: HTTP_CONNECTION_ID; pOverlapped: POverlapped): HRESULT; stdcall; HttpCancelHttpRequest: function(ReqQueueHandle: THandle; RequestId: HTTP_REQUEST_ID; pOverlapped: POverlapped): HRESULT; stdcall; HttpWaitForDemandStart: function(ReqQueueHandle: THandle; pOverlapped: POverlapped): HRESULT; stdcall; HttpFlushResponseCache: function(ReqQueueHandle: THandle; pUrlPrefix: PWideChar; Flags: ULONG; pOverlapped: POverlapped): HRESULT; stdcall; HttpAddFragmentToCache: function(ReqQueueHandle: THandle; pUrlPrefix: PWideChar; pDataChunk: PHTTP_DATA_CHUNK; pCachePolicy: PHTTP_CACHE_POLICY; pOverlapped: POverlapped): HRESULT; stdcall; HttpReadFragmentFromCache: function(ReqQueueHandle: THandle; pUrlPrefix: PWideChar; pByteRange: PHTTP_BYTE_RANGE; pBuffer: PVOID; BufferLength: ULONG; var pBytesRead: ULONG; pOverlapped: POverlapped): HRESULT; stdcall; HttpSetServiceConfiguration: function(ServiceHandle: THandle; ConfigId: HTTP_SERVICE_CONFIG_ID; pConfigInformation: PVOID; ConfigInformationLength: ULONG; pOverlapped: POverlapped): HRESULT; stdcall; HttpDeleteServiceConfiguration: function(ServiceHandle: THandle; ConfigId: HTTP_SERVICE_CONFIG_ID; pConfigInformation: PVOID; ConfigInformationLength: ULONG; pOverlapped: POverlapped): HRESULT; stdcall; HttpQueryServiceConfiguration: function(ServiceHandle: THandle; ConfigId: HTTP_SERVICE_CONFIG_ID; pInputConfigInformation: PVOID; InputConfigInformationLength: ULONG; pOutputConfigInformation: PVOID; OutputConfigInformationLength: ULONG; var pReturnLength: Cardinal; pOverlapped: POverlapped): HRESULT; stdcall; type EHttpApiException = class(Exception); function LoadHttpApiLibrary: boolean; procedure HttpCheck(HttpResult: HRESULT); {$ENDIF} implementation {$IFDEF MSWINDOWS} const HttpApiDllName = 'httpapi.dll'; var LibraryHandle: THandle; procedure HttpCheck(HttpResult: HRESULT); begin if HttpResult <> NO_ERROR then raise EHttpApiException.Create('HTTP Server API Error.' + sLineBreak + SysErrorMessage(HttpResult)); end; function LoadHttpApiLibrary: boolean; function LoadProc(ProcName: string): Pointer; begin Result := GetProcAddress(LibraryHandle, PChar(ProcName)); Assert(Assigned(Result), HttpApiDllName + ' - Could not find method: ' + ProcName); end; begin if LibraryHandle <> 0 then Exit(True); Result := False; LibraryHandle := SafeLoadLibrary(PChar(HttpApiDllName)); if (LibraryHandle <> 0) then begin Result := True; HttpInitialize := LoadProc('HttpInitialize'); HttpTerminate := LoadProc('HttpTerminate'); HttpCreateHttpHandle := LoadProc('HttpCreateHttpHandle'); HttpCreateRequestQueue := LoadProc('HttpCreateRequestQueue'); HttpCloseRequestQueue := LoadProc('HttpCloseRequestQueue'); HttpSetRequestQueueProperty := LoadProc('HttpSetRequestQueueProperty'); HttpQueryRequestQueueProperty := LoadProc('HttpQueryRequestQueueProperty'); HttpShutdownRequestQueue := LoadProc('HttpShutdownRequestQueue'); HttpReceiveClientCertificate := LoadProc('HttpReceiveClientCertificate'); HttpCreateServerSession := LoadProc('HttpCreateServerSession'); HttpCloseServerSession := LoadProc('HttpCloseServerSession'); HttpSetServerSessionProperty := LoadProc('HttpSetServerSessionProperty'); HttpAddUrl := LoadProc('HttpAddUrl'); HttpRemoveUrl := LoadProc('HttpRemoveUrl'); HttpCreateUrlGroup := LoadProc('HttpCreateUrlGroup'); HttpCloseUrlGroup := LoadProc('HttpCloseUrlGroup'); HttpAddUrlToUrlGroup := LoadProc('HttpAddUrlToUrlGroup'); HttpRemoveUrlFromUrlGroup := LoadProc('HttpRemoveUrlFromUrlGroup'); HttpSetUrlGroupProperty := LoadProc('HttpSetUrlGroupProperty'); HttpReceiveHttpRequest := LoadProc('HttpReceiveHttpRequest'); HttpReceiveRequestEntityBody := LoadProc('HttpReceiveRequestEntityBody'); HttpSendHttpResponse := LoadProc('HttpSendHttpResponse'); HttpSendResponseEntityBody := LoadProc('HttpSendResponseEntityBody'); HttpWaitForDisconnect := LoadProc('HttpWaitForDisconnect'); HttpCancelHttpRequest := LoadProc('HttpCancelHttpRequest'); HttpWaitForDemandStart := LoadProc('HttpWaitForDemandStart'); HttpFlushResponseCache := LoadProc('HttpFlushResponseCache'); HttpAddFragmentToCache := LoadProc('HttpAddFragmentToCache'); HttpReadFragmentFromCache := LoadProc('HttpReadFragmentFromCache'); HttpSetServiceConfiguration := LoadProc('HttpSetServiceConfiguration'); HttpDeleteServiceConfiguration := LoadProc('HttpDeleteServiceConfiguration'); HttpQueryServiceConfiguration := LoadProc('HttpQueryServiceConfiguration'); end; end; Initialization LibraryHandle := 0; finalization if LibraryHandle <> 0 then FreeLibrary(LibraryHandle); {$IFDEF WIN32} {$if sizeof(HTTP_REQUEST_V2) <> 472} {$message error 'HTTP_REQUEST sizeof error.'} {$ifend} {$if sizeof(HTTP_RESPONSE_V2) <> 288} {$message error 'HTTP_RESPONSE sizeof error.'} {$ifend} {$if sizeof(HTTP_COOKED_URL) <> 24} {$message error 'HTTP_COOKED_URL sizeof error.'} {$ifend} {$if sizeof(HTTP_DATA_CHUNK) <> 32} {$message error 'HTTP_DATA_CHUNK sizeof error.'} {$ifend} {$if sizeof(HTTP_REQUEST_HEADERS) <> 344} {$message error 'HTTP_REQUEST_HEADERS sizeof error.'} {$ifend} {$if sizeof(HTTP_RESPONSE_HEADERS) <> 256} {$message error 'HTTP_RESPONSE_HEADERS sizeof error.'} {$ifend} {$if sizeof(HTTP_SSL_INFO) <> 28} {$message error 'HTTP_SSL_INFO sizeof error.'} {$ifend} {$ENDIF} {$ENDIF} end.
附上编译开关文件sparkle.inc的源码:
{$R-} {.$DEFINE DEBUGLOG} {$SCOPEDENUMS ON} {$IFDEF NEXTGEN} {$ZEROBASEDSTRINGS OFF} {$ENDIF} // Small test for internal build process {$IFNDEF DEBUG} {$IFNDEF RELEASE} {$MESSAGE Fatal 'Invalid build config.'} {$ENDIF} {$ENDIF} {$IF CompilerVersion >= 24.0} {$LEGACYIFEND ON} {$DEFINE DELPHIXE3_LVL} {$IFEND} {$IF CompilerVersion >= 22} {$DEFINE DELPHIXE_LVL} {$IFEND} {$IF CompilerVersion >= 23} {$DEFINE DELPHIXE2_LVL} {$IFEND} {$IF CompilerVersion >= 25} {$DEFINE DELPHIXE4_LVL} {$IFEND} {$IF CompilerVersion >= 26} {$DEFINE DELPHIXE5_LVL} {$IFDEF DEBUG} {$D1} //limited debug info. {$ENDIF} {$IFEND} {$IF CompilerVersion >= 27} {$DEFINE DELPHIXE6_LVL} {$IFEND} {$IF CompilerVersion >= 31} {$DEFINE DELPHIBERLIN_LVL} {$IFEND} {$IF CompilerVersion >= 32} {$DEFINE DELPHITOKYO_LVL} {$IFEND}
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/13097893.html