|
|
/*++
Copyright (c) 1998-2002 Microsoft Corporation
Module Name:
HttpIo.c
Abstract:
User-mode interface to HTTP.SYS: Server-side I/O handler.
Author:
Keith Moore (keithmo) 15-Dec-1998
Revision History:
--*/
#include "precomp.h"
//
// Private macros.
//
//
// Private prototypes.
//
//
// Public functions.
//
/***************************************************************************++
Routine Description:
Waits for an incoming HTTP request from HTTP.SYS.
Arguments:
AppPoolHandle - Supplies a handle to a HTTP.SYS application pool as returned from either HttpCreateAppPool() or HttpOpenAppPool().
RequestId - Supplies an opaque identifier to receive a specific request. If this value is HTTP_NULL_ID, then receive any request.
Flags - Currently unused and must be zero.
pRequestBuffer - Supplies a pointer to the request buffer to be filled in by HTTP.SYS.
RequestBufferLength - Supplies the length of pRequestBuffer.
pBytesReturned - Optionally supplies a pointer to a ULONG which will receive the actual length of the data returned in the request buffer if this request completes synchronously (in-line).
pOverlapped - Optionally supplies an OVERLAPPED structure for the request.
Return Value:
ULONG - Completion status.
--***************************************************************************/ ULONG WINAPI HttpReceiveHttpRequest( IN HANDLE AppPoolHandle, IN HTTP_REQUEST_ID RequestId, IN ULONG Flags, OUT PHTTP_REQUEST pRequestBuffer, IN ULONG RequestBufferLength, OUT PULONG pBytesReturned OPTIONAL, IN LPOVERLAPPED pOverlapped OPTIONAL ) { HTTP_RECEIVE_REQUEST_INFO ReceiveInfo;
#if DBG
if (pRequestBuffer) { RtlFillMemory( pRequestBuffer, RequestBufferLength, (UCHAR)'\xc' ); } #endif
ReceiveInfo.RequestId = RequestId; ReceiveInfo.Flags = Flags;
//
// Make the request.
//
return HttpApiDeviceControl( AppPoolHandle, // FileHandle
pOverlapped, // pOverlapped
IOCTL_HTTP_RECEIVE_HTTP_REQUEST, // IoControlCode
&ReceiveInfo, // pInputBuffer
sizeof(ReceiveInfo), // InputBufferLength
pRequestBuffer, // pOutputBuffer
RequestBufferLength, // OutputBufferLength
pBytesReturned // pBytesTransferred
);
} // HttpReceiveHttpRequest
/***************************************************************************++
Routine Description:
Receives entity body for a request already read via ReceiveHttpRequest.
Arguments:
AppPoolHandle - Supplies a handle to a HTTP.SYS application pool as returned from either HttpCreateAppPool() or HttpOpenAppPool().
RequestId - Supplies an opaque identifier to receive a specific request. If this value is HTTP_NULL_ID, then receive any request.
pEntityBodyBuffer - Supplies a pointer to the request buffer to be filled in by HTTP.SYS.
EntityBufferLength - Supplies the length of pEntityBuffer.
pBytesReturned - Optionally supplies a pointer to a ULONG which will receive the actual length of the data returned in the request buffer if this request completes synchronously (in-line).
pOverlapped - Optionally supplies an OVERLAPPED structure for the request.
Return Value:
ULONG - Completion status.
--***************************************************************************/ ULONG WINAPI HttpReceiveRequestEntityBody( IN HANDLE AppPoolHandle, IN HTTP_REQUEST_ID RequestId, IN ULONG Flags, OUT PVOID pEntityBuffer, IN ULONG EntityBufferLength, OUT PULONG pBytesReturned, IN LPOVERLAPPED pOverlapped OPTIONAL ) { HTTP_RECEIVE_REQUEST_INFO ReceiveInfo;
#if DBG
if (pEntityBuffer != NULL) { RtlFillMemory( pEntityBuffer, EntityBufferLength, (UCHAR)'\xc' ); } #endif
ReceiveInfo.RequestId = RequestId; ReceiveInfo.Flags = Flags;
//
// Make the request.
//
return HttpApiDeviceControl( AppPoolHandle, // FileHandle
pOverlapped, // pOverlapped
IOCTL_HTTP_RECEIVE_ENTITY_BODY, // IoControlCode
&ReceiveInfo, // pInputBuffer
sizeof(ReceiveInfo), // InputBufferLength
pEntityBuffer, // pOutputBuffer
EntityBufferLength, // OutputBufferLength
pBytesReturned // pBytesTransferred
);
} // HttpReceiveRequestEntityBody
/***************************************************************************++
Routine Description:
Sends an HTTP response on the specified connection.
Arguments:
AppPoolHandle - Supplies a handle to a HTTP.SYS application pool as returned from either HttpCreateAppPool() or HttpOpenAppPool().
RequestId - Supplies an opaque identifier specifying the request the response is for.
Flags - Supplies zero or more HTTP_SEND_RESPONSE_FLAG_* control flags.
pHttpResponse - Supplies the HTTP response.
pCachePolicy - Supplies caching policy for the response.
pBytesSent - Optionally supplies a pointer to a ULONG which will receive the actual length of the data sent if this request completes synchronously (in-line).
pOverlapped - Optionally supplies an OVERLAPPED structure.
Return Value:
ULONG - Completion status.
--***************************************************************************/ ULONG WINAPI HttpSendHttpResponse( IN HANDLE AppPoolHandle, IN HTTP_REQUEST_ID RequestId, IN ULONG Flags, IN PHTTP_RESPONSE pHttpResponse, IN PHTTP_CACHE_POLICY pCachePolicy OPTIONAL, OUT PULONG pBytesSent OPTIONAL, OUT PHTTP_REQUEST pRequestBuffer OPTIONAL, IN ULONG RequestBufferLength OPTIONAL, IN LPOVERLAPPED pOverlapped OPTIONAL, IN PHTTP_LOG_FIELDS_DATA pLogData OPTIONAL ) { HTTP_SEND_HTTP_RESPONSE_INFO responseInfo;
//
// Build the response structure.
//
RtlZeroMemory(&responseInfo, sizeof(responseInfo));
responseInfo.pHttpResponse = pHttpResponse; responseInfo.EntityChunkCount = pHttpResponse->EntityChunkCount; responseInfo.pEntityChunks = pHttpResponse->pEntityChunks;
if (pCachePolicy != NULL) { responseInfo.CachePolicy = *pCachePolicy; } else { responseInfo.CachePolicy.Policy = HttpCachePolicyNocache; responseInfo.CachePolicy.SecondsToLive = 0; }
responseInfo.RequestId = RequestId; responseInfo.Flags = Flags; responseInfo.pLogData = pLogData; if (pRequestBuffer) { pRequestBuffer->RequestId = HTTP_NULL_ID; }
//
// Make the request.
//
return HttpApiDeviceControl( AppPoolHandle, // FileHandle
pOverlapped, // pOverlapped
IOCTL_HTTP_SEND_HTTP_RESPONSE, // IoControlCode
&responseInfo, // pInputBuffer
sizeof(responseInfo), // InputBufferLength
pRequestBuffer, // pOutputBuffer
RequestBufferLength, // OutputBufferLength
pBytesSent // pBytesTransferred
);
} // HttpSendHttpResponse
/***************************************************************************++
Routine Description:
Sends an HTTP response on the specified connection.
Arguments:
AppPoolHandle - Supplies a handle to a HTTP.SYS application pool as returned from either HttpCreateAppPool() or HttpOpenAppPool().
RequestId - Supplies an opaque identifier specifying the request the response is for.
Flags - Supplies zero or more HTTP_SEND_RESPONSE_FLAG_* control flags.
pBytesSent - Optionally supplies a pointer to a ULONG which will receive the actual length of the data sent if this request completes synchronously (in-line).
pOverlapped - Optionally supplies an OVERLAPPED structure.
Return Value:
ULONG - Completion status.
--***************************************************************************/ ULONG WINAPI HttpSendResponseEntityBody( IN HANDLE AppPoolHandle, IN HTTP_REQUEST_ID RequestId, IN ULONG Flags, IN USHORT EntityChunkCount OPTIONAL, IN PHTTP_DATA_CHUNK pEntityChunks OPTIONAL, OUT PULONG pBytesSent OPTIONAL, OUT PHTTP_REQUEST pRequestBuffer OPTIONAL, IN ULONG RequestBufferLength OPTIONAL, IN LPOVERLAPPED pOverlapped OPTIONAL, IN PHTTP_LOG_FIELDS_DATA pLogData OPTIONAL ) { HTTP_SEND_HTTP_RESPONSE_INFO responseInfo;
//
// Build the response structure.
//
RtlZeroMemory(&responseInfo, sizeof(responseInfo));
responseInfo.EntityChunkCount = EntityChunkCount; responseInfo.pEntityChunks = pEntityChunks; responseInfo.RequestId = RequestId; responseInfo.Flags = Flags; responseInfo.pLogData = pLogData;
if (pRequestBuffer) { pRequestBuffer->RequestId = HTTP_NULL_ID; }
//
// Make the request.
//
return HttpApiDeviceControl( AppPoolHandle, // FileHandle
pOverlapped, // pOverlapped
IOCTL_HTTP_SEND_ENTITY_BODY, // IoControlCode
&responseInfo, // pInputBuffer
sizeof(responseInfo), // InputBufferLength
pRequestBuffer, // pOutputBuffer
RequestBufferLength, // OutputBufferLength
pBytesSent // pBytesTransferred
);
} // HttpSendResponseEntityBody
/***************************************************************************++
Routine Description:
Wait for the client to initiate a disconnect.
Arguments:
AppPoolHandle - Supplies a handle to a HTTP.SYS application pool as returned from either HttpCreateAppPool() or HttpOpenAppPool().
ConnectionId - Supplies an opaque identifier specifying the connection.
pOverlapped - Optionally supplies an OVERLAPPED structure.
Return Value:
ULONG - Completion status.
--***************************************************************************/ ULONG WINAPI HttpWaitForDisconnect( IN HANDLE AppPoolHandle, IN HTTP_CONNECTION_ID ConnectionId, IN LPOVERLAPPED pOverlapped OPTIONAL ) { HTTP_WAIT_FOR_DISCONNECT_INFO waitInfo;
//
// Build the structure.
//
waitInfo.ConnectionId = ConnectionId;
//
// Make the request.
//
return HttpApiDeviceControl( AppPoolHandle, // FileHandle
pOverlapped, // pOverlapped
IOCTL_HTTP_WAIT_FOR_DISCONNECT, // IoControlCode
&waitInfo, // pInputBuffer
sizeof(waitInfo), // InputBufferLength
NULL, // pOutputBuffer
0, // OutputBufferLength
NULL // pBytesTransferred
);
} // HttpWaitForDisconnect
//
// Private functions.
//
|