/*++ Copyright (c) 1998-2002 Microsoft Corporation Module Name: Http.h Abstract: This header corresponds to the HTTP API specification Revision History: --*/ #ifndef __HTTP_H__ #define __HTTP_H__ #pragma once #if _WIN32_WINNT >= 0x0501 // // HTTPAPI is available on // // a) WinXP SP2 and higher // b) Windows 2003 and higher // c) Vista and higher. // #include #include #ifdef __cplusplus extern "C" { #endif // __cplusplus // // Flags for HttpInitialize() and HttpTerminate(). // // // HTTP_INITIALIZE_SERVER - Initializes the HTTP API layer and driver for // applications using server APIs. // // HTTP_INITIALIZE_CONFIG - Initializes the HTTP API layer and driver for // applications using HTTP configuration APIs. // // // Notes - // // 1. These flags can be used in combination. // // 2. HttpTerminate() must be called for each call to HttpInitialize() made // with each flag set when invoking HttpInitialize. For example, one // could make two calls to HttpInitialize() setting HTTP_INITIALIZE_SERVER // the first time and HTTP_INITIALIZE_CONFIG the second time. One call // to HttpTerminate() with both flags set suffices to clean up both // calls to HttpInitialize(). // #define HTTP_INITIALIZE_SERVER 0x00000001 #define HTTP_INITIALIZE_CONFIG 0x00000002 #if _WIN32_WINNT >= 0x0600 // // Following section defines the properties supported by the // server side HTTP API. // typedef enum _HTTP_SERVER_PROPERTY { // // Used for enabling server side authentication. // HttpServerAuthenticationProperty, // // Used for enabling logging. // HttpServerLoggingProperty, // // Used for setting QoS properties. // HttpServerQosProperty, // // Used for configuring timeouts. // HttpServerTimeoutsProperty, // // Used for limiting request queue lengths. // HttpServerQueueLengthProperty, // // Used for manipulating the state. // HttpServerStateProperty, // // Used for modifying the verbosity level of 503 type responses // generated by server side API. // HttpServer503VerbosityProperty, // // Used for manipulating Url Group to Request Queue association. // HttpServerBindingProperty, // // Extended authentication property. // HttpServerExtendedAuthenticationProperty, // // Listening endpoint property. // HttpServerListenEndpointProperty // // Authentication channel binding property // #endif #if _WIN32_WINNT >= _WIN32_WINNT_WIN7 ,HttpServerChannelBindProperty // // IP Protection level policy for a Url Group. // ,HttpServerProtectionLevelProperty #endif #if _WIN32_WINNT >= 0x0600 } HTTP_SERVER_PROPERTY, *PHTTP_SERVER_PROPERTY; #define HTTP_MAX_SERVER_QUEUE_LENGTH 0x7FFFFFFF #define HTTP_MIN_SERVER_QUEUE_LENGTH 1 // // Generic property flags. Each structure defining a property info typically // contain an element of this type. // typedef struct _HTTP_PROPERTY_FLAGS { ULONG Present:1; } HTTP_PROPERTY_FLAGS, *PHTTP_PROPERTY_FLAGS; // // Enabled state. // typedef enum _HTTP_ENABLED_STATE { HttpEnabledStateActive, HttpEnabledStateInactive, } HTTP_ENABLED_STATE, *PHTTP_ENABLED_STATE; typedef struct _HTTP_STATE_INFO { HTTP_PROPERTY_FLAGS Flags; HTTP_ENABLED_STATE State; } HTTP_STATE_INFO, *PHTTP_STATE_INFO; // // Defines the verbosity level for a request queue which will be used // when sending "503 - Service Unavailable" type error responses. Note that // this setting only affects the error responses generated internally // by HTTPAPI. // typedef enum _HTTP_503_RESPONSE_VERBOSITY { // // Instead of sending a 503 response, the connection will be reset. // This is the default behavior. // Http503ResponseVerbosityBasic, // // Will send a 503 w/ a generic reason phrase. // Http503ResponseVerbosityLimited, // // Will send a 503 w/ a detailed reason phrase. // Http503ResponseVerbosityFull } HTTP_503_RESPONSE_VERBOSITY, *PHTTP_503_RESPONSE_VERBOSITY; // // Network QoS related. // typedef enum _HTTP_QOS_SETTING_TYPE { HttpQosSettingTypeBandwidth, HttpQosSettingTypeConnectionLimit, HttpQosSettingTypeFlowRate } HTTP_QOS_SETTING_TYPE, *PHTTP_QOS_SETTING_TYPE; typedef struct _HTTP_QOS_SETTING_INFO { HTTP_QOS_SETTING_TYPE QosType; PVOID QosSetting; } HTTP_QOS_SETTING_INFO, *PHTTP_QOS_SETTING_INFO; typedef struct _HTTP_CONNECTION_LIMIT_INFO { HTTP_PROPERTY_FLAGS Flags; ULONG MaxConnections; } HTTP_CONNECTION_LIMIT_INFO, *PHTTP_CONNECTION_LIMIT_INFO; typedef struct _HTTP_BANDWIDTH_LIMIT_INFO { HTTP_PROPERTY_FLAGS Flags; ULONG MaxBandwidth; } HTTP_BANDWIDTH_LIMIT_INFO, *PHTTP_BANDWIDTH_LIMIT_INFO; typedef struct _HTTP_FLOWRATE_INFO { HTTP_PROPERTY_FLAGS Flags; ULONG MaxBandwidth; ULONG MaxPeakBandwidth; ULONG BurstSize; } HTTP_FLOWRATE_INFO, *PHTTP_FLOWRATE_INFO; // // Bandwidth throttling limit can not be set lower than the following // number. The value is in bytes/sec. // #define HTTP_MIN_ALLOWED_BANDWIDTH_THROTTLING_RATE ((ULONG)1024) // // Distinguished value for bandwidth, connection limits and logging rollover // size indicating "no limit". // #define HTTP_LIMIT_INFINITE ((ULONG)-1) // // Timeout information. // // // For manipulating global timeout settings. // These timers run when connection does not belong to any application. // Value zero is not allowed for driver wide timeout settings. // typedef enum _HTTP_SERVICE_CONFIG_TIMEOUT_KEY { IdleConnectionTimeout = 0, HeaderWaitTimeout } HTTP_SERVICE_CONFIG_TIMEOUT_KEY, *PHTTP_SERVICE_CONFIG_TIMEOUT_KEY; typedef USHORT HTTP_SERVICE_CONFIG_TIMEOUT_PARAM, *PHTTP_SERVICE_CONFIG_TIMEOUT_PARAM; // // To set a timeout value use the set structure. To query/delete use the key // directly. When you query a timeout value the output buffer must be exactly // the sizeof param. // typedef struct _HTTP_SERVICE_CONFIG_TIMEOUT_SET { HTTP_SERVICE_CONFIG_TIMEOUT_KEY KeyDesc; HTTP_SERVICE_CONFIG_TIMEOUT_PARAM ParamDesc; } HTTP_SERVICE_CONFIG_TIMEOUT_SET, *PHTTP_SERVICE_CONFIG_TIMEOUT_SET; // // For manipulating application specific timeout settings. // These timers run when there's a request being processed on a connection // and HTTPAPI has already associated the request with an application. // Setting a timeout value to zero will cause HTTPAPI to revert to default. // typedef struct _HTTP_TIMEOUT_LIMIT_INFO { HTTP_PROPERTY_FLAGS Flags; // // Timeouts configured in seconds. // USHORT EntityBody; USHORT DrainEntityBody; USHORT RequestQueue; // // Following two timeouts are only enforced after first request on // connection is routed to the application. These will not manipulate // the driver wide timeouts. // USHORT IdleConnection; USHORT HeaderWait; // // Timeouts configured in bytes/second. // This timer can be turned off by setting it to MAXULONG. // ULONG MinSendRate; } HTTP_TIMEOUT_LIMIT_INFO, *PHTTP_TIMEOUT_LIMIT_INFO; // // Controls whether IP-based URLs should listen on the specific IP or wildcard. // typedef struct _HTTP_LISTEN_ENDPOINT_INFO { HTTP_PROPERTY_FLAGS Flags; BOOLEAN EnableSharing; } HTTP_LISTEN_ENDPOINT_INFO, *PHTTP_LISTEN_ENDPOINT_INFO; typedef struct _HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS { USHORT DomainNameLength; PWSTR DomainName; USHORT RealmLength; PWSTR Realm; } HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS, *PHTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS; typedef struct _HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS { USHORT RealmLength; PWSTR Realm; } HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS, *PHTTP_SERVER_AUTHENTICATION_BASIC_PARAMS; // // Definitions used for setting server side authentication property. // #define HTTP_AUTH_ENABLE_BASIC (0x00000001) #define HTTP_AUTH_ENABLE_DIGEST (0x00000002) #define HTTP_AUTH_ENABLE_NTLM (0x00000004) #define HTTP_AUTH_ENABLE_NEGOTIATE (0x00000008) #define HTTP_AUTH_ENABLE_KERBEROS (0x00000010) #define HTTP_AUTH_ENABLE_ALL \ (HTTP_AUTH_ENABLE_BASIC |\ HTTP_AUTH_ENABLE_DIGEST |\ HTTP_AUTH_ENABLE_NTLM |\ HTTP_AUTH_ENABLE_NEGOTIATE |\ HTTP_AUTH_ENABLE_KERBEROS) C_ASSERT(HTTP_AUTH_ENABLE_NEGOTIATE > HTTP_AUTH_ENABLE_NTLM); C_ASSERT(HTTP_AUTH_ENABLE_NTLM > HTTP_AUTH_ENABLE_DIGEST); C_ASSERT(HTTP_AUTH_ENABLE_DIGEST > HTTP_AUTH_ENABLE_BASIC); #define HTTP_AUTH_EX_FLAG_ENABLE_KERBEROS_CREDENTIAL_CACHING (0x01) #define HTTP_AUTH_EX_FLAG_CAPTURE_CREDENTIAL (0x02) typedef struct _HTTP_SERVER_AUTHENTICATION_INFO { HTTP_PROPERTY_FLAGS Flags; ULONG AuthSchemes; BOOLEAN ReceiveMutualAuth; BOOLEAN ReceiveContextHandle; BOOLEAN DisableNTLMCredentialCaching; UCHAR ExFlags; HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS DigestParams; HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS BasicParams; } HTTP_SERVER_AUTHENTICATION_INFO, *PHTTP_SERVER_AUTHENTICATION_INFO; #if _WIN32_WINNT >= _WIN32_WINNT_WIN7 // // Definitions for setting authentication channel binding properties // typedef enum _HTTP_SERVICE_BINDING_TYPE { HttpServiceBindingTypeNone = 0, HttpServiceBindingTypeW, HttpServiceBindingTypeA } HTTP_SERVICE_BINDING_TYPE; typedef struct _HTTP_SERVICE_BINDING_BASE { HTTP_SERVICE_BINDING_TYPE Type; } HTTP_SERVICE_BINDING_BASE, *PHTTP_SERVICE_BINDING_BASE; typedef struct _HTTP_SERVICE_BINDING_A { HTTP_SERVICE_BINDING_BASE Base; PCHAR Buffer; ULONG BufferSize; } HTTP_SERVICE_BINDING_A, *PHTTP_SERVICE_BINDING_A; typedef struct _HTTP_SERVICE_BINDING_W { HTTP_SERVICE_BINDING_BASE Base; PWCHAR Buffer; ULONG BufferSize; } HTTP_SERVICE_BINDING_W, *PHTTP_SERVICE_BINDING_W; typedef enum _HTTP_AUTHENTICATION_HARDENING_LEVELS { HttpAuthenticationHardeningLegacy = 0, HttpAuthenticationHardeningMedium, HttpAuthenticationHardeningStrict } HTTP_AUTHENTICATION_HARDENING_LEVELS; // // Channel binding token verification flags. // #define HTTP_CHANNEL_BIND_PROXY 0x1 #define HTTP_CHANNEL_BIND_PROXY_COHOSTING 0x20 // // Service bind verification flags // #define HTTP_CHANNEL_BIND_NO_SERVICE_NAME_CHECK 0x2 #define HTTP_CHANNEL_BIND_DOTLESS_SERVICE 0x4 // // Flags triggering channel bind parameters retrieval // #define HTTP_CHANNEL_BIND_SECURE_CHANNEL_TOKEN 0x8 #define HTTP_CHANNEL_BIND_CLIENT_SERVICE 0x10 // // All valid flags (mask for internal checks) // typedef struct _HTTP_CHANNEL_BIND_INFO { HTTP_AUTHENTICATION_HARDENING_LEVELS Hardening; ULONG Flags; PHTTP_SERVICE_BINDING_BASE * ServiceNames; ULONG NumberOfServiceNames; } HTTP_CHANNEL_BIND_INFO, *PHTTP_CHANNEL_BIND_INFO; typedef struct _HTTP_REQUEST_CHANNEL_BIND_STATUS { PHTTP_SERVICE_BINDING_BASE ServiceName; PUCHAR ChannelToken; ULONG ChannelTokenSize; ULONG Flags; } HTTP_REQUEST_CHANNEL_BIND_STATUS, *PHTTP_REQUEST_CHANNEL_BIND_STATUS; #endif // // Definitions used for setting logging property. // // // The known log fields recognized/supported by HTTPAPI. Following fields // are used for W3C logging. Subset of them are also used for error // logging. // #define HTTP_LOG_FIELD_DATE 0x00000001 #define HTTP_LOG_FIELD_TIME 0x00000002 #define HTTP_LOG_FIELD_CLIENT_IP 0x00000004 #define HTTP_LOG_FIELD_USER_NAME 0x00000008 #define HTTP_LOG_FIELD_SITE_NAME 0x00000010 #define HTTP_LOG_FIELD_COMPUTER_NAME 0x00000020 #define HTTP_LOG_FIELD_SERVER_IP 0x00000040 #define HTTP_LOG_FIELD_METHOD 0x00000080 #define HTTP_LOG_FIELD_URI_STEM 0x00000100 #define HTTP_LOG_FIELD_URI_QUERY 0x00000200 #define HTTP_LOG_FIELD_STATUS 0x00000400 #define HTTP_LOG_FIELD_WIN32_STATUS 0x00000800 #define HTTP_LOG_FIELD_BYTES_SENT 0x00001000 #define HTTP_LOG_FIELD_BYTES_RECV 0x00002000 #define HTTP_LOG_FIELD_TIME_TAKEN 0x00004000 #define HTTP_LOG_FIELD_SERVER_PORT 0x00008000 #define HTTP_LOG_FIELD_USER_AGENT 0x00010000 #define HTTP_LOG_FIELD_COOKIE 0x00020000 #define HTTP_LOG_FIELD_REFERER 0x00040000 #define HTTP_LOG_FIELD_VERSION 0x00080000 #define HTTP_LOG_FIELD_HOST 0x00100000 #define HTTP_LOG_FIELD_SUB_STATUS 0x00200000 // // Fields that are used only for error logging. // #define HTTP_LOG_FIELD_CLIENT_PORT 0x00400000 #define HTTP_LOG_FIELD_URI 0x00800000 #define HTTP_LOG_FIELD_SITE_ID 0x01000000 #define HTTP_LOG_FIELD_REASON 0x02000000 #define HTTP_LOG_FIELD_QUEUE_NAME 0x04000000 // // Defines the logging type. // typedef enum _HTTP_LOGGING_TYPE { HttpLoggingTypeW3C, HttpLoggingTypeIIS, HttpLoggingTypeNCSA, HttpLoggingTypeRaw } HTTP_LOGGING_TYPE, *PHTTP_LOGGING_TYPE; // // Defines the rollover type for log files. // typedef enum _HTTP_LOGGING_ROLLOVER_TYPE { HttpLoggingRolloverSize, HttpLoggingRolloverDaily, HttpLoggingRolloverWeekly, HttpLoggingRolloverMonthly, HttpLoggingRolloverHourly } HTTP_LOGGING_ROLLOVER_TYPE, *PHTTP_LOGGING_ROLLOVER_TYPE; // // Log file rollover size can not be set lower than the following // limit. The value is in bytes. // #define HTTP_MIN_ALLOWED_LOG_FILE_ROLLOVER_SIZE ((ULONG)(1 * 1024 * 1024)) // // Logging option flags. When used in the logging configuration alters // some default logging behaviour. // // HTTP_LOGGING_FLAG_LOCAL_TIME_ROLLOVER - This flag is used to change // the log file rollover to happen by local time based. By default // log file rollovers happen by GMT time. // // HTTP_LOGGING_FLAG_USE_UTF8_CONVERSION - When set the unicode fields // will be converted to UTF8 multibytes when writting to the log // files. When this flag is not present, the local code page // conversion happens. // // HTTP_LOGGING_FLAG_LOG_ERRORS_ONLY - // HTTP_LOGGING_FLAG_LOG_SUCCESS_ONLY - These two flags are used to // to do selective logging. If neither of them are present both // types of requests will be logged. Only one these flags can be // set at a time. They are mutually exclusive. // #define HTTP_LOGGING_FLAG_LOCAL_TIME_ROLLOVER (0x00000001) #define HTTP_LOGGING_FLAG_USE_UTF8_CONVERSION (0x00000002) #define HTTP_LOGGING_FLAG_LOG_ERRORS_ONLY (0x00000004) #define HTTP_LOGGING_FLAG_LOG_SUCCESS_ONLY (0x00000008) // // Configuration structure used for setting the logging property. // typedef struct _HTTP_LOGGING_INFO { // // Specifies whether this property exists or not. // HTTP_PROPERTY_FLAGS Flags; // // Optional logging flags. // ULONG LoggingFlags; // // Optional informatonal software directive string for W3C type logging. Not // used for other types of logging. If nothing is provided here HTTPAPI will // log a default string. Any arbitrary string could be used here to identify // the application. Length cannot be greater than MAX_PATH. Lenght is in // bytes. // PCWSTR SoftwareName; USHORT SoftwareNameLength; // // Log file directory must be a fully qualified path. // Length must be in number of bytes. // USHORT DirectoryNameLength; PCWSTR DirectoryName; // // Specifies the format for the log files. // HTTP_LOGGING_TYPE Format; // // Bitmask value indicates which fields to be logged // if the log format is set to W3C. This must be the 'bitwise or' // of the HTTP_LOG_FIELD_... values. // ULONG Fields; // // Following fields are reserved they must be NULL and zero.. // PVOID pExtFields; USHORT NumOfExtFields; // // Reserved must be zero. // USHORT MaxRecordSize; // // Defines the rollover type for the log files. // HTTP_LOGGING_ROLLOVER_TYPE RolloverType; // // Indicates the maximum size (in bytes) after which // the log files should be rolled over. A value of -1 // (HTTP_LIMIT_INFINITE) indicates an unlimited size. // This value is discarded if rollover type is not set to // HttpLoggingRolloverSize. // ULONG RolloverSize; // // Specifies the security descriptor to be applied to // the log files and the sub-directories. If null we will // inherit the system default. This security descriptor must // be self-relative. // PSECURITY_DESCRIPTOR pSecurityDescriptor; } HTTP_LOGGING_INFO, *PHTTP_LOGGING_INFO; // // Binding information. // typedef struct _HTTP_BINDING_INFO { HTTP_PROPERTY_FLAGS Flags; HANDLE RequestQueueHandle; } HTTP_BINDING_INFO, *PHTTP_BINDING_INFO; #endif #if _WIN32_WINNT >= _WIN32_WINNT_WIN7 // // Defines the protection level types for UrlGroups. // typedef enum _HTTP_PROTECTION_LEVEL_TYPE { // // This option will allow edge (NAT) traversed traffic, i.e. Teredo // for the UrlGroup, unless there is an admin rule that overwrites the // application's intend. // HttpProtectionLevelUnrestricted, // // This setting will ensure that edge (NAT) traversed traffic // will not be allowed. // HttpProtectionLevelEdgeRestricted, // // Below type is not supported by HTTP API. // HttpProtectionLevelRestricted } HTTP_PROTECTION_LEVEL_TYPE, *PHTTP_PROTECTION_LEVEL_TYPE; // // Controls whether the associated UrlGroup Namespace should receive // edge traversed traffic. By default this parameter is unspecified. // typedef struct _HTTP_PROTECTION_LEVEL_INFO { HTTP_PROPERTY_FLAGS Flags; HTTP_PROTECTION_LEVEL_TYPE Level; } HTTP_PROTECTION_LEVEL_INFO, *PHTTP_PROTECTION_LEVEL_INFO; #endif #if _WIN32_WINNT >= 0x0600 // // Definitions for request queue manipulation. // // These flags are used with HttpCreateRequestQueue() API. // // HTTP_CREATE_REQUEST_QUEUE_FLAG_OPEN_EXISTING - To open an existing request // queue. The request queue name must be supplied. // // HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER - Creates the request queue and // marks that the caller process is not willing to do send/receive (HTTP I/O)on // the handle directly. // #define HTTP_CREATE_REQUEST_QUEUE_FLAG_OPEN_EXISTING (0x00000001) #define HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER (0x00000002) #endif // _WIN32_WINNT >= 0x0600 // // Flags for HttpReceiveHttpRequest(). // // HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY - Specifies that the caller would like // any available entity body to be copied along with the protocol headers. // // HTTP_RECEIVE_REQUEST_FLAG_FLUSH_BODY - Specifies that the caller would like // all of the entity bodies to be copied along with the protocol headers. // #define HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY 0x00000001 #define HTTP_RECEIVE_REQUEST_FLAG_FLUSH_BODY 0x00000002 #if _WIN32_WINNT >= 0x0600 // // Flags for HttpReceiveRequestEntityBody(). // // HTTP_RECEIVE_REQUEST_ENTITY_BODY_FLAG_FILL_BUFFER - Specifies that the // caller would like the buffer to get filled up with entity bodies unless // there are no more entity bodies to be copied. // #define HTTP_RECEIVE_REQUEST_ENTITY_BODY_FLAG_FILL_BUFFER 0x00000001 #endif // _WIN32_WINNT >= 0x0600 // // Flags for HttpSendHttpResponse() and HttpSendResponseEntityBody(). // // HTTP_SEND_RESPONSE_FLAG_DISCONNECT - Specifies that the network connection // should be disconnected immediately after sending the response, overriding // the HTTP protocol's persistent connection features, such as // "Connection: keep-alive". // // HTTP_SEND_RESPONSE_FLAG_MORE_DATA - Specifies that additional entity body // data will be sent by the caller. // // HTTP_SEND_RESPONSE_FLAG_BUFFER_DATA - Specifies that a caller wants the // response to complete as soon as possible at the cost of buffering partial // or the entire response. // // HTTP_SEND_RESPONSE_FLAG_ENABLE_NAGLING - Specifies that a caller wants to // enable the TCP nagling algorithm for this particular send. // // HTTP_SEND_RESPONSE_FLAG_PROCESS_RANGES - Specifies that for a range request // a full response content is passed and a caller wants HTTP API to process // ranges properly. // #define HTTP_SEND_RESPONSE_FLAG_DISCONNECT 0x00000001 #define HTTP_SEND_RESPONSE_FLAG_MORE_DATA 0x00000002 #define HTTP_SEND_RESPONSE_FLAG_BUFFER_DATA 0x00000004 #define HTTP_SEND_RESPONSE_FLAG_ENABLE_NAGLING 0x00000008 #define HTTP_SEND_RESPONSE_FLAG_PROCESS_RANGES 0x00000020 // // Flags for HttpFlushResponseCache(). // // HTTP_FLUSH_RESPONSE_FLAG_RECURSIVE - Flushes the specified URL and all // hierarchally-related sub-URLs from the response or fragment cache. // #define HTTP_FLUSH_RESPONSE_FLAG_RECURSIVE 0x00000001 // // Opaque identifiers for various HTTPAPI objects. // typedef ULONGLONG HTTP_OPAQUE_ID, *PHTTP_OPAQUE_ID; typedef HTTP_OPAQUE_ID HTTP_REQUEST_ID, *PHTTP_REQUEST_ID; typedef HTTP_OPAQUE_ID HTTP_CONNECTION_ID, *PHTTP_CONNECTION_ID; typedef HTTP_OPAQUE_ID HTTP_RAW_CONNECTION_ID, *PHTTP_RAW_CONNECTION_ID; #if _WIN32_WINNT >= 0x0600 typedef HTTP_OPAQUE_ID HTTP_URL_GROUP_ID, *PHTTP_URL_GROUP_ID; typedef HTTP_OPAQUE_ID HTTP_SERVER_SESSION_ID, *PHTTP_SERVER_SESSION_ID; #endif // _WIN32_WINNT >= 0x0600 // // Macros for opaque identifier manipulations. // #define HTTP_NULL_ID (0ui64) #define HTTP_IS_NULL_ID(pid) (HTTP_NULL_ID == *(pid)) #define HTTP_SET_NULL_ID(pid) (*(pid) = HTTP_NULL_ID) // // This structure defines a file byte range. // // If the Length field is HTTP_BYTE_RANGE_TO_EOF then the remainder of the // file (everything after StartingOffset) is sent. // #define HTTP_BYTE_RANGE_TO_EOF ((ULONGLONG)-1) typedef struct _HTTP_BYTE_RANGE { ULARGE_INTEGER StartingOffset; ULARGE_INTEGER Length; } HTTP_BYTE_RANGE, *PHTTP_BYTE_RANGE; // // The type for HTTP protocol version numbers. // typedef struct _HTTP_VERSION { USHORT MajorVersion; USHORT MinorVersion; } HTTP_VERSION, *PHTTP_VERSION; // // Some useful macros for HTTP protocol version manipulation. // #define HTTP_VERSION_UNKNOWN { 0, 0 } #define HTTP_VERSION_0_9 { 0, 9 } #define HTTP_VERSION_1_0 { 1, 0 } #define HTTP_VERSION_1_1 { 1, 1 } #define HTTP_SET_VERSION(version, major, minor) \ do { \ (version).MajorVersion = (major); \ (version).MinorVersion = (minor); \ } while (0, 0) #define HTTP_EQUAL_VERSION(version, major, minor) \ ((version).MajorVersion == (major) && \ (version).MinorVersion == (minor)) #define HTTP_GREATER_VERSION(version, major, minor) \ ((version).MajorVersion > (major) || \ ((version).MajorVersion == (major) && \ (version).MinorVersion > (minor))) #define HTTP_LESS_VERSION(version, major, minor) \ ((version).MajorVersion < (major) || \ ((version).MajorVersion == (major) && \ (version).MinorVersion < (minor))) #define HTTP_NOT_EQUAL_VERSION(version, major, minor) \ (!HTTP_EQUAL_VERSION(version, major, minor)) #define HTTP_GREATER_EQUAL_VERSION(version, major, minor) \ (!HTTP_LESS_VERSION(version, major, minor)) #define HTTP_LESS_EQUAL_VERSION(version, major, minor) \ (!HTTP_GREATER_VERSION(version, major, minor)) // // The enum type for HTTP verbs. // typedef enum _HTTP_VERB { HttpVerbUnparsed, HttpVerbUnknown, HttpVerbInvalid, HttpVerbOPTIONS, HttpVerbGET, HttpVerbHEAD, HttpVerbPOST, HttpVerbPUT, HttpVerbDELETE, HttpVerbTRACE, HttpVerbCONNECT, HttpVerbTRACK, // used by Microsoft Cluster Server for a non-logged trace HttpVerbMOVE, HttpVerbCOPY, HttpVerbPROPFIND, HttpVerbPROPPATCH, HttpVerbMKCOL, HttpVerbLOCK, HttpVerbUNLOCK, HttpVerbSEARCH, HttpVerbMaximum } HTTP_VERB, *PHTTP_VERB; // // Symbols for all HTTP/1.1 headers and other tokens. Notice request + // response values overlap. Make sure you know which type of header array // you are indexing. // // These values are used as offsets into arrays and as token values in // HTTP_KNOWN_HEADER arrays in HTTP_REQUEST_HEADERS and HTTP_RESPONSE_HEADERS. // // See RFC 2616, HTTP/1.1, for further explanation of most of these headers. // typedef enum _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] // Request Headers 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_HEADER_ID, *PHTTP_HEADER_ID; // // Structure defining format of a known HTTP header. // Name is from HTTP_HEADER_ID. // typedef struct _HTTP_KNOWN_HEADER { USHORT RawValueLength; // in bytes not including the NUL PCSTR pRawValue; } HTTP_KNOWN_HEADER, *PHTTP_KNOWN_HEADER; // // Structure defining format of an unknown header. // typedef struct _HTTP_UNKNOWN_HEADER { USHORT NameLength; // in bytes not including the NUL USHORT RawValueLength; // in bytes not including the NUL PCSTR pName; // The header name (minus the ':' character) PCSTR pRawValue; // The header value } HTTP_UNKNOWN_HEADER, *PHTTP_UNKNOWN_HEADER; #if _WIN32_WINNT >= 0x0600 // // Log fields data structure is used for logging a request. This structure must // be provided along with an HttpSendHttpResponse or HttpSendResponseEntityBody // call that concludes the send. // // Base structure is for future versioning. typedef enum _HTTP_LOG_DATA_TYPE { HttpLogDataTypeFields = 0 } HTTP_LOG_DATA_TYPE, *PHTTP_LOG_DATA_TYPE; // should we DECLSPEC_ALIGN(4 or 8) == DECLSPEC_POINTERALIGN? typedef struct _HTTP_LOG_DATA { HTTP_LOG_DATA_TYPE Type; } HTTP_LOG_DATA, *PHTTP_LOG_DATA; // Current log fields data structure for of type HttpLogDataTypeFields. typedef struct _HTTP_LOG_FIELDS_DATA { HTTP_LOG_DATA Base; USHORT UserNameLength; USHORT UriStemLength; USHORT ClientIpLength; USHORT ServerNameLength; USHORT ServiceNameLength; USHORT ServerIpLength; USHORT MethodLength; USHORT UriQueryLength; USHORT HostLength; USHORT UserAgentLength; USHORT CookieLength; USHORT ReferrerLength; PWCHAR UserName; PWCHAR UriStem; PCHAR ClientIp; PCHAR ServerName; PCHAR ServiceName; PCHAR ServerIp; PCHAR Method; PCHAR UriQuery; PCHAR Host; PCHAR UserAgent; PCHAR Cookie; PCHAR Referrer; USHORT ServerPort; USHORT ProtocolStatus; ULONG Win32Status; HTTP_VERB MethodNum; USHORT SubStatus; } HTTP_LOG_FIELDS_DATA, *PHTTP_LOG_FIELDS_DATA; #endif // _WIN32_WINNT >= 0x0600 // // This enum defines a data source for a particular chunk of data. // typedef enum _HTTP_DATA_CHUNK_TYPE { HttpDataChunkFromMemory, HttpDataChunkFromFileHandle, HttpDataChunkFromFragmentCache, HttpDataChunkFromFragmentCacheEx, HttpDataChunkMaximum } HTTP_DATA_CHUNK_TYPE, *PHTTP_DATA_CHUNK_TYPE; // // This structure describes an individual data chunk. // typedef struct _HTTP_DATA_CHUNK { // // The type of this data chunk. // HTTP_DATA_CHUNK_TYPE DataChunkType; // // The data chunk structures, one per supported data chunk type. // union { // // From-memory data chunk. // struct { PVOID pBuffer; ULONG BufferLength; } FromMemory; // // From-file handle data chunk. // struct { HTTP_BYTE_RANGE ByteRange; HANDLE FileHandle; } FromFileHandle; // // From-fragment cache data chunk. // struct { USHORT FragmentNameLength; // in bytes not including the NUL PCWSTR pFragmentName; } FromFragmentCache; // // From-fragment cache data chunk that specifies a byte range. // struct { HTTP_BYTE_RANGE ByteRange; PCWSTR pFragmentName; // NULL-terminated string } FromFragmentCacheEx; }; } HTTP_DATA_CHUNK, *PHTTP_DATA_CHUNK; // // HTTP API doesn't support 16 bit applications. // Neither WIN32 nor _WIN64 was defined. // C_ASSERT(TYPE_ALIGNMENT(HTTP_DATA_CHUNK) == sizeof(ULONGLONG)); // // Structure defining format of request headers. // typedef struct _HTTP_REQUEST_HEADERS { // // The array of unknown HTTP headers and the number of // entries in the array. // USHORT UnknownHeaderCount; PHTTP_UNKNOWN_HEADER pUnknownHeaders; // // Trailers - we don't use these currently, reserved for a future release // USHORT TrailerCount; // Reserved, must be 0 PHTTP_UNKNOWN_HEADER pTrailers; // Reserved, must be NULL // // Known headers. // HTTP_KNOWN_HEADER KnownHeaders[HttpHeaderRequestMaximum]; } HTTP_REQUEST_HEADERS, *PHTTP_REQUEST_HEADERS; // // Structure defining format of response headers. // typedef struct _HTTP_RESPONSE_HEADERS { // // The array of unknown HTTP headers and the number of // entries in the array. // USHORT UnknownHeaderCount; PHTTP_UNKNOWN_HEADER pUnknownHeaders; // // Trailers - we don't use these currently, reserved for a future release // USHORT TrailerCount; // Reserved, must be 0 PHTTP_UNKNOWN_HEADER pTrailers; // Reserved, must be NULL // // Known headers. // HTTP_KNOWN_HEADER KnownHeaders[HttpHeaderResponseMaximum]; } HTTP_RESPONSE_HEADERS, *PHTTP_RESPONSE_HEADERS; // // Structure defining format of transport address. Use pLocalAddress->sa_family // to determine whether this is an IPv4 address (AF_INET) or IPv6 (AF_INET6). // // pRemoteAddress->sa_family will be the same as pLocalAddress->sa_family. // // SOCKADDRs are always in network order, not host order. // typedef struct _HTTP_TRANSPORT_ADDRESS { PSOCKADDR pRemoteAddress; PSOCKADDR pLocalAddress; } HTTP_TRANSPORT_ADDRESS, *PHTTP_TRANSPORT_ADDRESS; // // Structure defining format of cooked URL. // typedef struct _HTTP_COOKED_URL { // // Pointers overlap and point into pFullUrl. NULL if not present. // USHORT FullUrlLength; // in bytes not including the NUL USHORT HostLength; // in bytes (no NUL) USHORT AbsPathLength; // in bytes (no NUL) USHORT QueryStringLength; // in bytes (no NUL) PCWSTR pFullUrl; // points to "http://hostname:port/abs/.../path?query" PCWSTR pHost; // points to the first char in the hostname PCWSTR pAbsPath; // Points to the 3rd '/' char PCWSTR pQueryString; // Points to the 1st '?' char or NULL } HTTP_COOKED_URL, *PHTTP_COOKED_URL; // // An opaque context for URL manipulation. // typedef ULONGLONG HTTP_URL_CONTEXT; #if _WIN32_WINNT >= 0x0600 // // Optional flags for URL manipulation functions. // // HTTP_URL_FLAG_REMOVE_ALL : When this flag is used // when removing a Url from a url group, regardless of // the passed URL, all of the Urls from the url group // will be removed. // #define HTTP_URL_FLAG_REMOVE_ALL 0x00000001 // // Request Authentication related. // typedef enum _HTTP_AUTH_STATUS { HttpAuthStatusSuccess, HttpAuthStatusNotAuthenticated, HttpAuthStatusFailure } HTTP_AUTH_STATUS, *PHTTP_AUTH_STATUS; typedef enum _HTTP_REQUEST_AUTH_TYPE { HttpRequestAuthTypeNone = 0, HttpRequestAuthTypeBasic, HttpRequestAuthTypeDigest, HttpRequestAuthTypeNTLM, HttpRequestAuthTypeNegotiate, HttpRequestAuthTypeKerberos } HTTP_REQUEST_AUTH_TYPE, *PHTTP_REQUEST_AUTH_TYPE; #endif // _WIN32_WINNT >= 0x0600 // // SSL Client certificate information. // typedef struct _HTTP_SSL_CLIENT_CERT_INFO { ULONG CertFlags; ULONG CertEncodedSize; PUCHAR pCertEncoded; HANDLE Token; BOOLEAN CertDeniedByMapper; } HTTP_SSL_CLIENT_CERT_INFO, *PHTTP_SSL_CLIENT_CERT_INFO; #if _WIN32_WINNT >= _WIN32_WINNT_WIN7 // // Flag to retrieve secure channel binding with HttpReceiveClientCertificate // #define HTTP_RECEIVE_SECURE_CHANNEL_TOKEN 0x1 #endif // // Data computed during SSL handshake. // typedef struct _HTTP_SSL_INFO { USHORT ServerCertKeySize; USHORT ConnectionKeySize; ULONG ServerCertIssuerSize; ULONG ServerCertSubjectSize; PCSTR pServerCertIssuer; PCSTR pServerCertSubject; PHTTP_SSL_CLIENT_CERT_INFO pClientCertInfo; ULONG SslClientCertNegotiated; } HTTP_SSL_INFO, *PHTTP_SSL_INFO; #if _WIN32_WINNT >= 0x0600 // // Generic request information type. // typedef enum _HTTP_REQUEST_INFO_TYPE { HttpRequestInfoTypeAuth #if _WIN32_WINNT >= _WIN32_WINNT_WIN7 ,HttpRequestInfoTypeChannelBind #endif } HTTP_REQUEST_INFO_TYPE, *PHTTP_REQUEST_INFO_TYPE; typedef struct _HTTP_REQUEST_INFO { HTTP_REQUEST_INFO_TYPE InfoType; ULONG InfoLength; PVOID pInfo; } HTTP_REQUEST_INFO, *PHTTP_REQUEST_INFO; #ifndef __SECSTATUS_DEFINED__ typedef LONG SECURITY_STATUS; #define __SECSTATUS_DEFINED__ #endif // __SECSTATUS_DEFINED__ // // Authentication request info structure // #define HTTP_REQUEST_AUTH_FLAG_TOKEN_FOR_CACHED_CRED (0x00000001) typedef struct _HTTP_REQUEST_AUTH_INFO { HTTP_AUTH_STATUS AuthStatus; SECURITY_STATUS SecStatus; ULONG Flags; HTTP_REQUEST_AUTH_TYPE AuthType; HANDLE AccessToken; ULONG ContextAttributes; // // Optional serialized context. // ULONG PackedContextLength; ULONG PackedContextType; PVOID PackedContext; // // Optional mutual authentication data and its length in bytes. // ULONG MutualAuthDataLength; PCHAR pMutualAuthData; // // For SSPI based schemes the package name is returned. Length does // not include the terminating null and it is in bytes. // USHORT PackageNameLength; PWSTR pPackageName; } HTTP_REQUEST_AUTH_INFO, *PHTTP_REQUEST_AUTH_INFO; #endif // _WIN32_WINNT >= 0x0600 // // The structure of an HTTP request for downlevel OS // typedef struct _HTTP_REQUEST_V1 { // // Request flags (see HTTP_REQUEST_FLAG_* definitions below). // ULONG Flags; // // An opaque request identifier. These values are used by the driver // to correlate outgoing responses with incoming requests. // HTTP_CONNECTION_ID ConnectionId; HTTP_REQUEST_ID RequestId; // // The context associated with the URL prefix. // HTTP_URL_CONTEXT UrlContext; // // The HTTP version number. // HTTP_VERSION Version; // // The request verb. // HTTP_VERB Verb; // // The length of the verb string if the Verb field is HttpVerbUnknown. // USHORT UnknownVerbLength; // in bytes not including the NUL // // The length of the raw (uncooked) URL // USHORT RawUrlLength; // in bytes not including the NUL // // Pointer to the verb string if the Verb field is HttpVerbUnknown. // PCSTR pUnknownVerb; // // Pointer to the raw (uncooked) URL // PCSTR pRawUrl; // // The canonicalized Unicode URL // HTTP_COOKED_URL CookedUrl; // // Local and remote transport addresses for the connection. // HTTP_TRANSPORT_ADDRESS Address; // // The request headers. // HTTP_REQUEST_HEADERS Headers; // // The total number of bytes received from network for this request. // ULONGLONG BytesReceived; // // pEntityChunks is an array of EntityChunkCount HTTP_DATA_CHUNKs. The // entity body is copied only if HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY // was passed to HttpReceiveHttpRequest(). // USHORT EntityChunkCount; PHTTP_DATA_CHUNK pEntityChunks; // // SSL connection information. // HTTP_RAW_CONNECTION_ID RawConnectionId; PHTTP_SSL_INFO pSslInfo; } HTTP_REQUEST_V1, *PHTTP_REQUEST_V1; #if _WIN32_WINNT >= 0x0600 // Vista // // Version 2.0 members are defined here // N.B. One must define V2 elements in two places :( // This is due to the fact that C++ doesn't allow anonymous // structure declarations and one must use structure // inheritance instead. // #ifdef __cplusplus typedef struct _HTTP_REQUEST_V2 : _HTTP_REQUEST_V1 { // // Version 1.0 members are inherited // Version 2.0 members are declared below // // // Additional Request Informations. // USHORT RequestInfoCount; PHTTP_REQUEST_INFO pRequestInfo; } HTTP_REQUEST_V2, *PHTTP_REQUEST_V2; #else // __cplusplus typedef struct _HTTP_REQUEST_V2 { struct _HTTP_REQUEST_V1; // Anonymous structure // // Version 2.0 members are declared below // // // Additional Request Informations. // USHORT RequestInfoCount; PHTTP_REQUEST_INFO pRequestInfo; } HTTP_REQUEST_V2, *PHTTP_REQUEST_V2; #endif // __cplusplus typedef HTTP_REQUEST_V2 HTTP_REQUEST; #else // _WIN32_WINNT >= 0x0600 typedef HTTP_REQUEST_V1 HTTP_REQUEST; #endif // _WIN32_WINNT >= 0x0600 typedef HTTP_REQUEST * PHTTP_REQUEST; // // Values for HTTP_REQUEST::Flags. Zero or more of these may be ORed together. // // HTTP_REQUEST_FLAG_MORE_ENTITY_BODY_EXISTS - there is more entity body // to be read for this request. Otherwise, there is no entity body or // all of the entity body was copied into pEntityChunks. // HTTP_REQUEST_FLAG_IP_ROUTED - This flag indicates that the request has been // routed based on host plus ip or ip binding.This is a hint for the application // to include the local ip while flushing kernel cache entries build for this // request if any. // #define HTTP_REQUEST_FLAG_MORE_ENTITY_BODY_EXISTS 0x00000001 #define HTTP_REQUEST_FLAG_IP_ROUTED 0x00000002 // // This structure describes an HTTP response. // typedef struct _HTTP_RESPONSE_V1 { // // Response flags (see HTTP_RESPONSE_FLAG_* definitions below). // ULONG Flags; // // The raw HTTP protocol version number. // HTTP_VERSION Version; // // The HTTP status code (e.g., 200). // USHORT StatusCode; // // The HTTP reason (e.g., "OK"). This MUST not contain // non-ASCII characters (i.e., all chars must be in range 0x20-0x7E). // USHORT ReasonLength; // in bytes not including the '\0' PCSTR pReason; // // The response headers. // HTTP_RESPONSE_HEADERS Headers; // // pEntityChunks points to an array of EntityChunkCount HTTP_DATA_CHUNKs. // USHORT EntityChunkCount; PHTTP_DATA_CHUNK pEntityChunks; } HTTP_RESPONSE_V1, *PHTTP_RESPONSE_V1; #if _WIN32_WINNT >= 0x0600 // // Values for HTTP_RESPONSE::Flags. // // HTTP_RESPONSE_FLAG_MULTIPLE_ENCODINGS_AVAILABLE - Set this flag if encodings // other than identity form are available for this resource.This flag is ignored // if application has not asked for response to be cached. It's used as a hint // to the Http Server API for content negotiation used when serving from the // the kernel response cache. // #define HTTP_RESPONSE_FLAG_MULTIPLE_ENCODINGS_AVAILABLE 0x00000001 // Vista typedef enum _HTTP_RESPONSE_INFO_TYPE { HttpResponseInfoTypeMultipleKnownHeaders, HttpResponseInfoTypeAuthenticationProperty, HttpResponseInfoTypeQoSProperty #if _WIN32_WINNT >= _WIN32_WINNT_WIN7 ,HttpResponseInfoTypeChannelBind #endif } HTTP_RESPONSE_INFO_TYPE, PHTTP_RESPONSE_INFO_TYPE; typedef struct _HTTP_RESPONSE_INFO { HTTP_RESPONSE_INFO_TYPE Type; ULONG Length; PVOID pInfo; } HTTP_RESPONSE_INFO, *PHTTP_RESPONSE_INFO; #define HTTP_RESPONSE_INFO_FLAGS_PRESERVE_ORDER 0x00000001 // // This structure allows the provision of providing multiple known headers. // typedef struct _HTTP_MULTIPLE_KNOWN_HEADERS { // // Known header id. // HTTP_HEADER_ID HeaderId; ULONG Flags; // // Number of headers of the same category. // USHORT KnownHeaderCount; // // Array of known header structures. // PHTTP_KNOWN_HEADER KnownHeaders; } HTTP_MULTIPLE_KNOWN_HEADERS, *PHTTP_MULTIPLE_KNOWN_HEADERS; // // Version 2.0 members are defined here // N.B. One must define V2 elements in two places :( // This is due to the fact that C++ doesn't allow anonymous // structure declarations and one must use structure // inheritance instead. // #ifdef __cplusplus typedef struct _HTTP_RESPONSE_V2 : _HTTP_RESPONSE_V1 { // // Version 1.0 members are inherited // Version 2.0 members are declared below // USHORT ResponseInfoCount; PHTTP_RESPONSE_INFO pResponseInfo; } HTTP_RESPONSE_V2, *PHTTP_RESPONSE_V2; #else // __cplusplus typedef struct _HTTP_RESPONSE_V2 { struct _HTTP_RESPONSE_V1; // // Version 2.0 members are declared below // USHORT ResponseInfoCount; PHTTP_RESPONSE_INFO pResponseInfo; } HTTP_RESPONSE_V2, *PHTTP_RESPONSE_V2; #endif // __cplusplus typedef HTTP_RESPONSE_V2 HTTP_RESPONSE; #else // _WIN32_WINNT >= 0x0600 typedef HTTP_RESPONSE_V1 HTTP_RESPONSE; #endif // _WIN32_WINNT >= 0x0600 typedef HTTP_RESPONSE *PHTTP_RESPONSE; // // Api Version. This is used to ensure compatibility between applications and // httpapi.dll and http.sys. // // This must not be confused with the HTTP Protocol version. // typedef struct _HTTPAPI_VERSION { USHORT HttpApiMajorVersion; USHORT HttpApiMinorVersion; } HTTPAPI_VERSION, *PHTTPAPI_VERSION; #if _WIN32_WINNT >= 0x0600 // Vista #define HTTPAPI_VERSION_2 { 2, 0 } #endif // _WIN32_WINNT >= 0x0600 #define HTTPAPI_VERSION_1 { 1, 0 } #define HTTPAPI_EQUAL_VERSION(version, major, minor) \ ((version).HttpApiMajorVersion == (major) && \ (version).HttpApiMinorVersion == (minor)) #define HTTPAPI_GREATER_VERSION(version, major, minor) \ ((version).HttpApiMajorVersion > (major) || \ ((version).HttpApiMajorVersion == (major) && \ (version).HttpApiMinorVersion > (minor))) #define HTTPAPI_LESS_VERSION(version, major, minor) \ ((version).HttpApiMajorVersion < (major) || \ ((version).HttpApiMajorVersion == (major) && \ (version).HttpApiMinorVersion < (minor))) #define HTTPAPI_VERSION_GREATER_OR_EQUAL( version, major, minor) \ (!HTTPAPI_LESS_VERSION(version, major, minor)) // // Cache control. // // // This enum defines the available cache policies. // typedef enum _HTTP_CACHE_POLICY_TYPE { HttpCachePolicyNocache, HttpCachePolicyUserInvalidates, HttpCachePolicyTimeToLive, HttpCachePolicyMaximum } HTTP_CACHE_POLICY_TYPE, *PHTTP_CACHE_POLICY_TYPE; // // Only cache unauthorized GETs + HEADs. // typedef struct _HTTP_CACHE_POLICY { HTTP_CACHE_POLICY_TYPE Policy; ULONG SecondsToLive; } HTTP_CACHE_POLICY, *PHTTP_CACHE_POLICY; // // Enum that is used with HttpSetServiceConfiguration(), // HttpQueryServiceConfiguration(), and HttpDeleteServiceConfiguration() APIs. // typedef enum _HTTP_SERVICE_CONFIG_ID { HttpServiceConfigIPListenList, // Set, Query & Delete. HttpServiceConfigSSLCertInfo, // Set, Query & Delete. HttpServiceConfigUrlAclInfo, // Set, Query & Delete. HttpServiceConfigTimeout, // Set, Query & Delete. HttpServiceConfigCache, // Set, Query & Delete. HttpServiceConfigMax } HTTP_SERVICE_CONFIG_ID, *PHTTP_SERVICE_CONFIG_ID; // // Generic Query enum that can be used with HttpQueryServiceConfiguration() // typedef enum _HTTP_SERVICE_CONFIG_QUERY_TYPE { HttpServiceConfigQueryExact, HttpServiceConfigQueryNext, HttpServiceConfigQueryMax } HTTP_SERVICE_CONFIG_QUERY_TYPE, *PHTTP_SERVICE_CONFIG_QUERY_TYPE; // // This data structure is used to define a key of the SSL certificate hash // store. // typedef struct _HTTP_SERVICE_CONFIG_SSL_KEY { PSOCKADDR pIpPort; } HTTP_SERVICE_CONFIG_SSL_KEY, *PHTTP_SERVICE_CONFIG_SSL_KEY; // // This defines a record for the SSL config store. // typedef struct _HTTP_SERVICE_CONFIG_SSL_PARAM { ULONG SslHashLength; // Length of the SSL hash (in bytes) PVOID pSslHash; // Pointer to the SSL hash GUID AppId; // A unique identifier that can be used to // identify the app that has set this parameter PWSTR pSslCertStoreName; // Store name to read the server certificate // from; defaults to "MY". Certificate must be // stored in the LOCAL_MACHINE context. // // The following settings are used only for client certificates // // // DefaultCertCheckMode is a bit flag with the following semantics // 0x1 - Client certificate will not be verified for revocation // 0x2 - Only cached certificate revocation will be used. // 0x4 - Enable use of the DefaultRevocationFreshnessTime setting // 0x10000 - No usage check. DWORD DefaultCertCheckMode; // // DefaultRevocationFreshnessTime (seconds) - How often to check for // an updated Certificate revocation list (CRL). If this value is 0 // then the new CRL is updated only if the previous one expires // DWORD DefaultRevocationFreshnessTime; // // DefaultRevocationUrlRetrievalTimeout (milliseconds) - Timeout on // attempt to retrieve certificate revocation list from the remote URL. // DWORD DefaultRevocationUrlRetrievalTimeout; // // pDefaultSslCtlIdentifier - Restrict the certificate issuers that you // want to trust. Can be a subset of the certificate issuers that are // trusted by the machine. // PWSTR pDefaultSslCtlIdentifier; // // Store name under LOCAL_MACHINE where Ctl identified by // pDefaultSslCtlIdentifier is stored. // PWSTR pDefaultSslCtlStoreName; // // Default Flags - see HTTP_SERVICE_CONFIG_SSL_FLAG* below. // DWORD DefaultFlags; } HTTP_SERVICE_CONFIG_SSL_PARAM, *PHTTP_SERVICE_CONFIG_SSL_PARAM; #define HTTP_SERVICE_CONFIG_SSL_FLAG_USE_DS_MAPPER 0x00000001 #define HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT 0x00000002 #if _WIN32_WINNT < 0x0600 #define HTTP_SERVICE_CONFIG_SSL_FLAG_NO_RAW_FILTER 0x00000004 #endif // _WIN32_WINNT < 0x0600 // // This data structure is used by HttpSetServiceConfiguration() for the // config ID HttpServiceConfigSSLCertInfo. It's used to add a new record // to the SSL store. // typedef struct _HTTP_SERVICE_CONFIG_SSL_SET { HTTP_SERVICE_CONFIG_SSL_KEY KeyDesc; HTTP_SERVICE_CONFIG_SSL_PARAM ParamDesc; } HTTP_SERVICE_CONFIG_SSL_SET, *PHTTP_SERVICE_CONFIG_SSL_SET; // // This data structure is used by HttpQueryServiceConfiguration() for the // config ID HttpServiceConfigSSLCertInfo. It's used to query a particular // record from the SSL store. // // If QueryType is HttpServiceConfigQueryExact, then one particular record of // the type HTTP_SERVICE_CONFIG_SSL_SET is returned. If the QueryType is // HttpServiceConfigQueryNext, then the next instance of // HTTP_SERVICE_CONFIG_SSL_SET is returned. In such cases, the dwToken field // represents the cursor. For the first item, dwToken has to be 0. // For subsequent items, dwToken has to be incremented by 1, // until ERROR_NO_MORE_ITEMS is returned. // typedef struct _HTTP_SERVICE_CONFIG_SSL_QUERY { HTTP_SERVICE_CONFIG_QUERY_TYPE QueryDesc; HTTP_SERVICE_CONFIG_SSL_KEY KeyDesc; DWORD dwToken; } HTTP_SERVICE_CONFIG_SSL_QUERY, *PHTTP_SERVICE_CONFIG_SSL_QUERY; // // Set/Delete IP Listen-Only List record // // Used as a parameter to both HttpSetServiceConfiguration() and // HttpDeleteServiceConfiguration() functions. // typedef struct _HTTP_SERVICE_CONFIG_IP_LISTEN_PARAM { USHORT AddrLength; PSOCKADDR pAddress; } HTTP_SERVICE_CONFIG_IP_LISTEN_PARAM, *PHTTP_SERVICE_CONFIG_IP_LISTEN_PARAM; // // Query IP Listen-Only List record. // // Parameter to HttpQueryServiceConfiguration() for the config ID // HttpServiceConfigIPListenList. On successful return, AddrList // contains an array of AddrCount elements. Caller must provide a // large enough buffer to hold all elements in one call. // // Caller may determine the type of each returned element by examining // AddrList[i].ss_family. If it's AF_INET, use ((PSOCKADDR_IN) &AddrList[i]); // otherwise, for AF_INET6, use ((PSOCKADDR_IN6) &AddrList[i]) // to select the appropriate address type. // typedef struct _HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY { ULONG AddrCount; SOCKADDR_STORAGE AddrList[ANYSIZE_ARRAY]; } HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY, *PHTTP_SERVICE_CONFIG_IP_LISTEN_QUERY; // // URL ACL // // typedef struct _HTTP_SERVICE_CONFIG_URLACL_KEY { PWSTR pUrlPrefix; } HTTP_SERVICE_CONFIG_URLACL_KEY, *PHTTP_SERVICE_CONFIG_URLACL_KEY; // // This defines a record for the SSL config store. // typedef struct _HTTP_SERVICE_CONFIG_URLACL_PARAM { PWSTR pStringSecurityDescriptor; } HTTP_SERVICE_CONFIG_URLACL_PARAM, *PHTTP_SERVICE_CONFIG_URLACL_PARAM; // // This data structure is used by HttpSetServiceConfiguration for the config ID // HttpServiceConfigUrlAclInfo. It is used to add a new record to the URL ACL // store. // typedef struct _HTTP_SERVICE_CONFIG_URLACL_SET { HTTP_SERVICE_CONFIG_URLACL_KEY KeyDesc; HTTP_SERVICE_CONFIG_URLACL_PARAM ParamDesc; } HTTP_SERVICE_CONFIG_URLACL_SET, *PHTTP_SERVICE_CONFIG_URLACL_SET; // // This data structure is used by HttpQueryServiceConfiguration() for the // config ID HttpServiceConfigUrlAclInfo. It's used to query a particular // record from the URL ACL store. // // If QueryType is HttpServiceConfigQueryExact, then one particular record of // the type HTTP_SERVICE_CONFIG_URLACL_SET is returned. If the QueryType is // HttpServiceConfigQueryNext, then the next instance of // HTTP_SERVICE_CONFIG_URLACL_SET is returned. In such cases, the dwToken field // represents the cursor. For the first item, dwToken has to be 0. // For subsequent items, dwToken has to be incremented by 1, // until ERROR_NO_MORE_ITEMS is returned. // typedef struct _HTTP_SERVICE_CONFIG_URLACL_QUERY { HTTP_SERVICE_CONFIG_QUERY_TYPE QueryDesc; HTTP_SERVICE_CONFIG_URLACL_KEY KeyDesc; DWORD dwToken; } HTTP_SERVICE_CONFIG_URLACL_QUERY, *PHTTP_SERVICE_CONFIG_URLACL_QUERY; // // Cache Paramemers // // // For manipulating global cache parameters. // The parameters that can be changed or queued are per-uri cache size // and cached range chunk size. // typedef enum _HTTP_SERVICE_CONFIG_CACHE_KEY { MaxCacheResponseSize = 0, CacheRangeChunkSize } HTTP_SERVICE_CONFIG_CACHE_KEY, *PHTTP_SERVICE_CONFIG_CACHE_KEY; typedef ULONG HTTP_SERVICE_CONFIG_CACHE_PARAM, *PHTTP_SERVICE_CONFIG_CACHE_PARAM; // // To set a cache parameter value use the set structure. To query use the key // directly. When you query a parameter value the output buffer must be exactly // the sizeof param. // typedef struct { HTTP_SERVICE_CONFIG_CACHE_KEY KeyDesc; HTTP_SERVICE_CONFIG_CACHE_PARAM ParamDesc; } HTTP_SERVICE_CONFIG_CACHE_SET, *PHTTP_SERVICE_CONFIG_CACHE_SET; // // Define our API linkage. // #if !defined(HTTPAPI_LINKAGE) #define HTTPAPI_LINKAGE DECLSPEC_IMPORT #endif // !HTTPAPI_LINKAGE // // Initialize/Terminate APIs. // // NOTE: MUST be called once before all other APIs HTTPAPI_LINKAGE ULONG WINAPI HttpInitialize( IN HTTPAPI_VERSION Version, IN ULONG Flags, __reserved IN OUT PVOID pReserved ); // NOTE: MUST be called after final API call returns. HTTPAPI_LINKAGE ULONG WINAPI HttpTerminate( IN ULONG Flags, __reserved IN OUT PVOID pReserved ); // // HTTP Request Queue manipulation APIs. // // This API is maintained for backward competibility for the first // version of the HTTPAPI and should not be used. Instead the new // HttpCreateRequestQueue() API must be used. // // Use CloseHandle() to release the handles returned by // HttpCreateHttpHandle() API. // HTTPAPI_LINKAGE ULONG WINAPI HttpCreateHttpHandle( OUT PHANDLE pReqQueueHandle, __reserved IN ULONG Reserved ); #if _WIN32_WINNT >= 0x0600 // // Extended Request Queue manipulation APIs. // // Use HttpCloseRequestQueue() API to close the handles // created by the HttpCreateRequestQueue API. // HTTPAPI_LINKAGE ULONG WINAPI HttpCreateRequestQueue( IN HTTPAPI_VERSION Version, IN PCWSTR pName OPTIONAL, IN PSECURITY_ATTRIBUTES pSecurityAttributes OPTIONAL, IN ULONG Flags OPTIONAL, OUT PHANDLE pReqQueueHandle ); HTTPAPI_LINKAGE ULONG WINAPI HttpCloseRequestQueue( IN HANDLE ReqQueueHandle ); HTTPAPI_LINKAGE ULONG WINAPI HttpSetRequestQueueProperty( IN HANDLE Handle, IN HTTP_SERVER_PROPERTY Property, __in_bcount(PropertyInformationLength) IN PVOID pPropertyInformation, IN ULONG PropertyInformationLength, __reserved IN ULONG Reserved, __reserved IN PVOID pReserved ); HTTPAPI_LINKAGE ULONG WINAPI HttpQueryRequestQueueProperty( IN HANDLE Handle, IN HTTP_SERVER_PROPERTY Property, __out_bcount_part(PropertyInformationLength, *pReturnLength) OUT PVOID pPropertyInformation, IN ULONG PropertyInformationLength, __reserved IN ULONG Reserved, __out_opt OUT PULONG pReturnLength OPTIONAL, __reserved IN PVOID pReserved ); HTTPAPI_LINKAGE ULONG WINAPI HttpShutdownRequestQueue( IN HANDLE ReqQueueHandle ); #endif // _WIN32_WINNT >= 0x0600 // // SSL APIs. // HTTPAPI_LINKAGE ULONG WINAPI HttpReceiveClientCertificate( IN HANDLE ReqQueueHandle, IN HTTP_CONNECTION_ID ConnectionId, IN ULONG Flags, __out_bcount_part(SslClientCertInfoSize, *pBytesReceived) OUT PHTTP_SSL_CLIENT_CERT_INFO pSslClientCertInfo, IN ULONG SslClientCertInfoSize, __out_opt OUT PULONG pBytesReceived OPTIONAL, IN LPOVERLAPPED pOverlapped OPTIONAL ); #if _WIN32_WINNT >= 0x0600 // // Server Session APIs. // HTTPAPI_LINKAGE ULONG WINAPI HttpCreateServerSession( IN HTTPAPI_VERSION Version, OUT PHTTP_SERVER_SESSION_ID pServerSessionId, __reserved IN ULONG Reserved ); HTTPAPI_LINKAGE ULONG WINAPI HttpCloseServerSession( IN HTTP_SERVER_SESSION_ID ServerSessionId ); HTTPAPI_LINKAGE ULONG WINAPI HttpQueryServerSessionProperty( IN HTTP_SERVER_SESSION_ID ServerSessionId, IN HTTP_SERVER_PROPERTY Property, __out_bcount_part(PropertyInformationLength, *pReturnLength) OUT PVOID pPropertyInformation, IN ULONG PropertyInformationLength, __out_opt OUT PULONG pReturnLength OPTIONAL ); HTTPAPI_LINKAGE ULONG WINAPI HttpSetServerSessionProperty( IN HTTP_SERVER_SESSION_ID ServerSessionId, IN HTTP_SERVER_PROPERTY Property, __in_bcount(PropertyInformationLength) IN PVOID pPropertyInformation, IN ULONG PropertyInformationLength ); #endif // _WIN32_WINNT >= 0x0600 // // Url Configuration APIs. Can only be used for V1 request queues. // HTTPAPI_LINKAGE ULONG WINAPI HttpAddUrl( IN HANDLE ReqQueueHandle, IN PCWSTR pFullyQualifiedUrl, __reserved IN PVOID pReserved ); HTTPAPI_LINKAGE ULONG WINAPI HttpRemoveUrl( IN HANDLE ReqQueueHandle, IN PCWSTR pFullyQualifiedUrl ); #if _WIN32_WINNT >= 0x0600 // // Url Group APIs. // HTTPAPI_LINKAGE ULONG WINAPI HttpCreateUrlGroup( IN HTTP_SERVER_SESSION_ID ServerSessionId, OUT PHTTP_URL_GROUP_ID pUrlGroupId, __reserved IN ULONG Reserved ); HTTPAPI_LINKAGE ULONG WINAPI HttpCloseUrlGroup( IN HTTP_URL_GROUP_ID UrlGroupId ); HTTPAPI_LINKAGE ULONG WINAPI HttpAddUrlToUrlGroup( IN HTTP_URL_GROUP_ID UrlGroupId, IN PCWSTR pFullyQualifiedUrl, IN HTTP_URL_CONTEXT UrlContext OPTIONAL, __reserved IN ULONG Reserved ); HTTPAPI_LINKAGE ULONG WINAPI HttpRemoveUrlFromUrlGroup( IN HTTP_URL_GROUP_ID UrlGroupId, IN PCWSTR pFullyQualifiedUrl, IN ULONG Flags ); HTTPAPI_LINKAGE ULONG WINAPI HttpSetUrlGroupProperty( IN HTTP_URL_GROUP_ID UrlGroupId, IN HTTP_SERVER_PROPERTY Property, __in_bcount(PropertyInformationLength) IN PVOID pPropertyInformation, IN ULONG PropertyInformationLength ); HTTPAPI_LINKAGE ULONG WINAPI HttpQueryUrlGroupProperty( IN HTTP_URL_GROUP_ID UrlGroupId, IN HTTP_SERVER_PROPERTY Property, __out_bcount_part(PropertyInformationLength, *pReturnLength) OUT PVOID pPropertyInformation, IN ULONG PropertyInformationLength, __out_opt OUT PULONG pReturnLength OPTIONAL ); #endif // _WIN32_WINNT >= 0x0600 // // HTTP Server I/O APIs. // HTTPAPI_LINKAGE ULONG WINAPI HttpReceiveHttpRequest( IN HANDLE ReqQueueHandle, IN HTTP_REQUEST_ID RequestId, IN ULONG Flags, __out_bcount_part(RequestBufferLength, *pBytesReceived) OUT PHTTP_REQUEST pRequestBuffer, IN ULONG RequestBufferLength, __out_opt OUT PULONG pBytesReceived OPTIONAL, IN LPOVERLAPPED pOverlapped OPTIONAL ); HTTPAPI_LINKAGE ULONG WINAPI HttpReceiveRequestEntityBody( IN HANDLE ReqQueueHandle, IN HTTP_REQUEST_ID RequestId, IN ULONG Flags, __out_bcount_part(BufferLength, *pBytesReceived) OUT PVOID pBuffer, IN ULONG BufferLength, __out_opt OUT PULONG pBytesReceived OPTIONAL, IN LPOVERLAPPED pOverlapped OPTIONAL ); #if _WIN32_WINNT >= 0x0600 HTTPAPI_LINKAGE ULONG WINAPI HttpSendHttpResponse( IN HANDLE ReqQueueHandle, IN HTTP_REQUEST_ID RequestId, IN ULONG Flags, IN PHTTP_RESPONSE pHttpResponse, IN PHTTP_CACHE_POLICY pCachePolicy OPTIONAL, OUT PULONG pBytesSent OPTIONAL, OUT PVOID pReserved1 OPTIONAL, // must be NULL IN ULONG Reserved2 OPTIONAL, // must be 0 IN LPOVERLAPPED pOverlapped OPTIONAL, IN PHTTP_LOG_DATA pLogData OPTIONAL ); #else // _WIN32_WINNT >= 0x0600 HTTPAPI_LINKAGE ULONG WINAPI HttpSendHttpResponse( IN HANDLE ReqQueueHandle, IN HTTP_REQUEST_ID RequestId, IN ULONG Flags, IN PHTTP_RESPONSE pHttpResponse, IN PVOID pReserved1 OPTIONAL, // must be NULL OUT PULONG pBytesSent OPTIONAL, OUT PVOID pReserved2 OPTIONAL, // must be NULL IN ULONG Reserved3 OPTIONAL, // must be 0 IN LPOVERLAPPED pOverlapped OPTIONAL, IN PVOID pReserved4 OPTIONAL // must be NULL ); #endif // _WIN32_WINNT >= 0x0600 #if _WIN32_WINNT >= 0x0600 HTTPAPI_LINKAGE ULONG WINAPI HttpSendResponseEntityBody( IN HANDLE ReqQueueHandle, IN HTTP_REQUEST_ID RequestId, IN ULONG Flags, IN USHORT EntityChunkCount OPTIONAL, __in_ecount_opt(EntityChunkCount) IN PHTTP_DATA_CHUNK pEntityChunks OPTIONAL, OUT PULONG pBytesSent OPTIONAL, OUT PVOID pReserved1 OPTIONAL, // must be NULL IN ULONG Reserved2 OPTIONAL, // must be 0 IN LPOVERLAPPED pOverlapped OPTIONAL, IN PHTTP_LOG_DATA pLogData OPTIONAL ); #else // _WIN32_WINNT >= 0x0600 HTTPAPI_LINKAGE ULONG WINAPI HttpSendResponseEntityBody( IN HANDLE ReqQueueHandle, IN HTTP_REQUEST_ID RequestId, IN ULONG Flags, IN USHORT EntityChunkCount OPTIONAL, __in_ecount_opt(EntityChunkCount) IN PHTTP_DATA_CHUNK pEntityChunks OPTIONAL, OUT PULONG pBytesSent OPTIONAL, OUT PVOID pReserved1 OPTIONAL, // must be NULL IN ULONG Reserved2 OPTIONAL, // must be 0 IN LPOVERLAPPED pOverlapped OPTIONAL, IN PVOID pReserved3 OPTIONAL // must be NULL ); #endif // _WIN32_WINNT >= 0x0600 HTTPAPI_LINKAGE ULONG WINAPI HttpWaitForDisconnect( IN HANDLE ReqQueueHandle, IN HTTP_CONNECTION_ID ConnectionId, IN LPOVERLAPPED pOverlapped OPTIONAL ); #if _WIN32_WINNT >= 0x0600 HTTPAPI_LINKAGE ULONG WINAPI HttpWaitForDisconnectEx( IN HANDLE ReqQueueHandle, IN HTTP_CONNECTION_ID ConnectionId, __reserved IN ULONG Reserved OPTIONAL, IN LPOVERLAPPED pOverlapped OPTIONAL ); HTTPAPI_LINKAGE ULONG WINAPI HttpCancelHttpRequest( IN HANDLE ReqQueueHandle, IN HTTP_REQUEST_ID RequestId, IN LPOVERLAPPED pOverlapped OPTIONAL ); HTTPAPI_LINKAGE ULONG WINAPI HttpWaitForDemandStart( IN HANDLE ReqQueueHandle, IN LPOVERLAPPED pOverlapped OPTIONAL ); #endif // _WIN32_WINNT >= 0x0600 // // Cache manipulation APIs. // HTTPAPI_LINKAGE ULONG WINAPI HttpFlushResponseCache( IN HANDLE ReqQueueHandle, IN PCWSTR pUrlPrefix, IN ULONG Flags, IN LPOVERLAPPED pOverlapped OPTIONAL ); HTTPAPI_LINKAGE ULONG WINAPI HttpAddFragmentToCache( IN HANDLE ReqQueueHandle, IN PCWSTR pUrlPrefix, IN PHTTP_DATA_CHUNK pDataChunk, IN PHTTP_CACHE_POLICY pCachePolicy, IN LPOVERLAPPED pOverlapped OPTIONAL ); HTTPAPI_LINKAGE ULONG WINAPI HttpReadFragmentFromCache( IN HANDLE ReqQueueHandle, IN PCWSTR pUrlPrefix, IN PHTTP_BYTE_RANGE pByteRange OPTIONAL, __out_bcount_part(BufferLength, *pBytesRead) OUT PVOID pBuffer, IN ULONG BufferLength, OUT PULONG pBytesRead OPTIONAL, IN LPOVERLAPPED pOverlapped OPTIONAL ); // // Server configuration APIs // HTTPAPI_LINKAGE ULONG WINAPI HttpSetServiceConfiguration( __reserved IN HANDLE ServiceHandle, IN HTTP_SERVICE_CONFIG_ID ConfigId, __in_bcount(ConfigInformationLength) IN PVOID pConfigInformation, IN ULONG ConfigInformationLength, __reserved IN LPOVERLAPPED pOverlapped ); HTTPAPI_LINKAGE ULONG WINAPI HttpDeleteServiceConfiguration( __reserved IN HANDLE ServiceHandle, IN HTTP_SERVICE_CONFIG_ID ConfigId, __in_bcount(ConfigInformationLength) IN PVOID pConfigInformation, IN ULONG ConfigInformationLength, __reserved IN LPOVERLAPPED pOverlapped ); HTTPAPI_LINKAGE ULONG WINAPI HttpQueryServiceConfiguration( __reserved IN HANDLE ServiceHandle, IN HTTP_SERVICE_CONFIG_ID ConfigId, __in_bcount_opt(InputConfigInformationLength) IN PVOID pInputConfigInformation OPTIONAL, IN ULONG InputConfigInformationLength OPTIONAL, __out_bcount_part_opt(OutputConfigInformationLength, *pReturnLength) OUT PVOID pOutputConfigInformation OPTIONAL, IN ULONG OutputConfigInformationLength OPTIONAL, __out_opt OUT PULONG pReturnLength OPTIONAL, __reserved IN LPOVERLAPPED pOverlapped ); #ifdef __cplusplus } // extern "C" #endif // __cplusplus #endif // _WIN32_WINNT >= 0x0501 #endif // __HTTP_H__