|
|
/*++
Copyright (c) 1998-2002 Microsoft Corporation
Module Name:
ucparse.h
Abstract:
Contains definitions for ucparse.c .
Author:
Rajesh Sundaram (rajeshsu) 15-Feb-2002.
Revision History:
--*/
#ifndef _UCPARSE_H_
#define _UCPARSE_H_
/***************************************************************************++
Macros related to client URI parsing and canonicalization.
--***************************************************************************/ //
// Char Types: Used to determine the next state, given the current state
// and the current char type
//
#define CHAR_END_OF_STRING 0 // 0
#define CHAR_FORWARD_SLASH (HTTP_CHAR_SLASH >>HTTP_CHAR_SHIFT) // Must be 1
#define CHAR_DOT (HTTP_CHAR_DOT >>HTTP_CHAR_SHIFT) // Must be 2
#define CHAR_QUEST_HASH (HTTP_CHAR_QM_HASH>>HTTP_CHAR_SHIFT) // Must be 3
#define CHAR_PATH_CHAR 4 // valid URI path chars
#define CHAR_INVALID_CHAR 5 // invalid URI chars
#define CHAR_EXTENDED_CHAR CHAR_PATH_CHAR // chars >= 0x80
#define CHAR_TOTAL_TYPES 6
//
// Total states in the canonicalizer state machine
//
#define TOTAL_STATES 8
//
// Actions performed during state transitions
//
#define ACT_ERROR 0 // Error in the URI
#define ACT_EMIT_CHAR 1 // Emit the current char
#define ACT_EMIT_DOT_CHAR 2 // Emit a '.' and the current char
#define ACT_EMIT_DOT_DOT_CHAR 3 // Emit a '..' and the current char
#define ACT_BACKUP 4 // Backup to a previous '/'
#define ACT_NONE 5 // Do nothing
#define ACT_BACKUP_EMIT_CHAR 6 // Backup to '/' and emit the current char
#define ACT_PANIC 7 // Internal error; bug in the code
//
// The following table serves two purposes:
// (1) help determine the next state based on the current state and
// the current char type
// (2) Determine the action that needs to be performed
//
// The first 4 bits denote the action and last 4 bits denote the next state.
// e.g. if the current state = 0,
// the current char = '/' (type = CHAR_FORWARD_SLASH = 1)
// then, the next state = NextStateTable[0][CHAR_FORWARD_SLASH]&0xf => 1
// the action = NextStateTable[0][CHAR_FORWARD_SLASH]>>4 => 1
// Hence, the next state is 1 and action is 1 (i.e. ACT_EMIT_CHAR).
//
// NOTE: Junk columns are added to make the column count a power of 2.
#define INIT_TRANSITION_TABLE \
{ \ /*State EOS / . (?/#) (P/E) I Junk Junk */ \ /* 0 */ {0x07, 0x11, 0x07, 0x07, 0x07, 0x07, 0x77, 0x77}, \ /* 1 */ {0x56, 0x51, 0x53, 0x12, 0x14, 0x07, 0x77, 0x77}, \ /* 2 */ {0x56, 0x12, 0x12, 0x12, 0x12, 0x07, 0x77, 0x77}, \ /* 3 */ {0x56, 0x51, 0x55, 0x12, 0x24, 0x07, 0x77, 0x77}, \ /* 4 */ {0x56, 0x11, 0x14, 0x12, 0x14, 0x07, 0x77, 0x77}, \ /* 5 */ {0x46, 0x41, 0x34, 0x62, 0x34, 0x07, 0x77, 0x77}, \ /* 6 */ {0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77}, \ /* 7 */ {0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77}, \ }
#define UC_COPY_HEADER_NAME_SP(pBuffer, i) \
do { \ PHEADER_MAP_ENTRY _pEntry; \ _pEntry = &(g_RequestHeaderMapTable[g_RequestHeaderMap[i]]); \ \ RtlCopyMemory( \ (pBuffer), \ _pEntry->MixedCaseHeader, \ _pEntry->HeaderLength \ ); \ \ (pBuffer) += _pEntry->HeaderLength; \ *(pBuffer)++ = SP; \ \ } while (0, 0)
// 1 for SP char.
#define UC_HEADER_NAME_SP_LENGTH(id) \
(g_RequestHeaderMapTable[g_RequestHeaderMap[id]].HeaderLength + 1)
ULONG UcComputeRequestHeaderSize( IN PUC_PROCESS_SERVER_INFORMATION pServInfo, IN PHTTP_REQUEST pHttpRequest, IN BOOLEAN bChunked, IN BOOLEAN bContentLengthHeader, IN PUC_HTTP_AUTH pAuth, IN PUC_HTTP_AUTH pProxyAuth, IN PBOOLEAN bPreAuth, IN PBOOLEAN bProxyPreAuth );
NTSTATUS UcGenerateRequestHeaders( IN PHTTP_REQUEST pRequest, IN PUC_HTTP_REQUEST pKeRequest, IN BOOLEAN bChunked, IN ULONGLONG ContentLength );
NTSTATUS UcGenerateContentLength( IN ULONGLONG ContentLength, IN PUCHAR pBuffer, IN ULONG BufferLen, OUT PULONG BytesWritten );
ULONG UcComputeConnectVerbHeaderSize( IN PUC_PROCESS_SERVER_INFORMATION pServInfo, IN PUC_HTTP_AUTH pProxyAuthInfo );
NTSTATUS UcGenerateConnectVerbHeader( IN PUC_HTTP_REQUEST pRequest, IN PUC_HTTP_REQUEST pHeadRequest, IN PUC_HTTP_AUTH pProxyAuthInfo );
NTSTATUS UnescapeW( IN PCWSTR pWChar, OUT PWCHAR pOutWChar );
__inline BOOLEAN UcCheckDisconnectInfo( IN PHTTP_VERSION pVersion, IN PHTTP_KNOWN_HEADER pKnownHeaders );
NTSTATUS UcCanonicalizeURI( IN LPCWSTR pInUri, IN USHORT InUriLen, IN PUCHAR pOutUri, IN OUT PUSHORT pOutUriLen, IN BOOLEAN bEncode );
//
// Response parser functions
//
NTSTATUS UcFindHeaderNameEnd( IN PUCHAR pHttpRequest, IN ULONG HttpRequestLength, OUT PULONG HeaderNameLength );
NTSTATUS UcFindHeaderValueEnd( IN PUCHAR pHeader, IN ULONG HeaderValueLength, IN PUCHAR *ppFoldingHeader, IN PULONG pBytesTaken );
NTSTATUS UcpLookupHeader( IN PUC_HTTP_REQUEST pRequest, IN PUCHAR pHttpRequest, IN ULONG HttpRequestLength, IN PHEADER_MAP_ENTRY pHeaderMap, IN ULONG HeaderMapCount, OUT ULONG * pBytesTaken );
NTSTATUS UcParseHeader( IN PUC_HTTP_REQUEST pRequest, IN PUCHAR pHttpRequest, IN ULONG HttpRequestLength, OUT ULONG * pBytesTaken );
NTSTATUS UcParseWWWAuthenticateHeader( IN PCSTR pAuthHeader, IN ULONG AuthHeaderLength, OUT PHTTP_AUTH_PARSED_PARAMS pAuthSchemeParams );
LONG UcpFindAttribValuePair( PCSTR *ppHeader, ULONG *pHeaderLength, PCSTR *Attrib, ULONG *AttribLen, PCSTR *Value, ULONG *ValueLen );
NTSTATUS UcpParseAuthParams( PHTTP_AUTH_SCHEME pAuthScheme, PHTTP_AUTH_PARSED_PARAMS pAuthParsedParams, PCSTR *ppHeader, ULONG *pHeaderLength );
NTSTATUS UcpParseAuthBlob( PHTTP_AUTH_SCHEME pAuthScheme, PHTTP_AUTH_PARSED_PARAMS pAuthParsedParams, PCSTR *ppHeader, ULONG *pHeaderLength );
NTSTATUS UcSingleHeaderHandler( IN PUC_HTTP_REQUEST pRequest, IN PUCHAR pHeader, IN ULONG HeaderLength, IN HTTP_HEADER_ID HeaderID );
NTSTATUS UcMultipleHeaderHandler( IN PUC_HTTP_REQUEST pRequest, IN PUCHAR pHeader, IN ULONG HeaderLength, IN HTTP_HEADER_ID HeaderID );
NTSTATUS UcAuthenticateHeaderHandler( IN PUC_HTTP_REQUEST pRequest, IN PUCHAR pHeader, IN ULONG HeaderLength, IN HTTP_HEADER_ID HeaderID );
NTSTATUS UcContentLengthHeaderHandler( IN PUC_HTTP_REQUEST pRequest, IN PUCHAR pHeader, IN ULONG HeaderLength, IN HTTP_HEADER_ID HeaderID );
NTSTATUS UcTransferEncodingHeaderHandler( IN PUC_HTTP_REQUEST pRequest, IN PUCHAR pHeader, IN ULONG HeaderLength, IN HTTP_HEADER_ID HeaderID );
NTSTATUS UcConnectionHeaderHandler( IN PUC_HTTP_REQUEST pRequest, IN PUCHAR pHeader, IN ULONG HeaderLength, IN HTTP_HEADER_ID HeaderID );
NTSTATUS UcContentTypeHeaderHandler( IN PUC_HTTP_REQUEST pRequest, IN PUCHAR pHeader, IN ULONG HeaderLength, IN HTTP_HEADER_ID HeaderID );
#endif // _UCPARSE_H_
|