EXTENSION_CONTROL_BLOCK结构

EXTENSION_CONTROL_BLOCK结构具有如下形式:
typedef struct _EXTENSION_CONTROL_BLOCK
{
  DWORD     cbSize;                             //IN
  DWORD     dwVersion;                          //IN
  HCONN     ConnID;                             //IN
  DWORD     dwHttpStatusCode;                   //OUT
  CHAR      lpszLogData[HSE_LOG_BUFFER_LEN];    //OUT
  LPSTR     lpszMethod;                         //IN
  LPSTR     lpszQueryString;                    //IN
  LPSTR     lpszPathInfo;                       //IN
  LPSTR     lpszPathTranslated;                 //IN
  DWORD     cbTotalBytes;                       //IN
  DWORD     cbAvailable;                        //IN
  LPBYTE    lpbData;                            //IN
  LPSTR     lpszContentType;                    //IN
  BOOL ( WINAPI* GetServerVariable )
       ( HCONN      hConn,
         LPSTR      lpszVariableName,
         LPVOID     lpvBuffer,
         LPDWORD    lpdwSize );
  BOOL ( WINAPI* WriteClient )
       ( HCONN      ConnID,
         LPVOID     Buffer,
         LPDWORD    lpdwBytes,
         DWORD      dwReserved );
  BOOL ( WINAPI* ReadClient )
       ( HCONN      ConnID,
         LPVOID     lpvBuffer,
         LPDWORD    lpdwSize );
  BOOL ( WINAPI* ServerSupportFunction )
       ( HCONN      hConn,
         DWORD      dwHSERRequest,
         LPVOID     lpvBuffer,
         LPDWORD    lpdwSize,
         LPDWORD    lpdwDataType );
} EXTENSION_CONTROL_BLOCK, *LPEXTENSION_CONTROL_BLOCK;
服务器通过EXTENSION_CONTROL_BLOCK.与ISA通讯。
上面对IN和OUT的引用指明该成员是适用于发送到扩展的消息(IN)还是来自扩展的消息(OUT)。

成员:
EXTENSION_CONTROL_BLOCK结构包括如下的域:
cbSize结构的大小。
dwVersionHTTP_FILTER_REVISION的版本信息。HIWORD中包含了主版本号,LOWORD中包含了次版本号。
ConnID由HTTP服务器分配的唯一数字。它不能被修改。
dwHttpStatusCode当完成请求时当前事务的状态。可能是下列值之一:
·HTTP_STATUS_BAD_REQUEST
·HTTP_STATUS_AUTH_REQUIRED
·HTTP_STATUS_FORBIDDEN
·HTTP_STATUS_NOT_FOUND
·HTTP_STATUS_SERVER_ERROR
·HTTP_STATUS_NOT_IMPLEMENTED
lpszLogData大小为HSE_LOG_BUFFER_LEN的缓冲区。包含了当前事务的与ISA相关的以null结尾的登记信息字符串,这个登记信息将被输入到HTTP服务器日志。出于管理的目的,为HTTP服务器和ISA事务维护一个日志文件会非常有用。
lpszMethod生成请求的方法。与CGI变量REQUEST_METHOD等价。
lpszQueryString包含查询信息的以null结尾的字符串。与CGI变量QUERY_STRING等价。
lpszPathInfo以null结尾的字符串,包含了客户给出的附加路径信息。与CGI变量PATH_INFO等价。
lpszPathTranslated以null结尾的字符串,包含了转换路径。与CGI变量PATH_TRANSLATED等价。
cbTotalBytes要从客户端接收的字节总数。与CGI变量CONTENT_LENGTH等价。如果这个值为0xffffffff,则有4G或更多的数据。在这种情况下,必须调用CHttpServerContext::ReadClient直到没有更多的数据。
cbAvailablelpbData所指向的缓冲区的可能容量。如果cbTotalBytes与cbAvailable相同,变量lpbData指向的缓冲区将包含了客户发出的所有数据。否则cbTotalBytes将包含接收到的数据的总字节数。ISA将需要适用回调函数CHttpServerContext::ReadClient来读出数据的剩余部分(从偏移为cbAvailable的位置开始)。
lpbData指向一个大小为cbAvailable的缓冲区,其中包含了客户发出的数据。
lpszContentType以null结尾的字符串,包含了客户发出数据的内容的类型。与CGI变量CONTENT_TYPE等价。
GetServerVariable这个函数将与HTTP连接或服务器本身有关的信息(包括CGI变量)拷贝到一个缓冲区中。GetServerVariable接收如下的参数:
·hConn连接的句柄。
·lpszVariableName以null结尾的字符串,指明被要求的是哪个变量。变量的名字为:
变量名描述
ALL_HTTP所有还没有被解析为一个上面的变量之一的HTTP头。这些变量的形式为:HTTP_<起始域名>
AUTH_PASS当客户提供密码时,这将获得与REMOTE_USER对应的密码。它是一个以null结尾的字符串
AUTH_TYPE包含了使用的鉴定的类型。例如,如果使用了Basic鉴定,该字符串为“Basic”。对于WindowsNT Challenge-response,这个字符串为“NTLM”。其它鉴定模式将具有别的字符串。因为可以在Internet服务器中加入新的鉴定类型,所以要列出所以可能的字符串是不现实的。如果该字符串为空,则没有使用鉴定
CONTENT_LENGTH脚本能够期望从客户接收的字节数
CONTENT_TYPE在POST请求的主体部分提供的有关内容类型的信息
GATEWAY_INTERFACE服务器支持的CGI规格的修订版。当前的版本为CGI/1.1
HTTP_ACCEPT特殊情形的HTTP头。Accept的值:连结的域,通过“,”隔开。例如,如果下面的几行代码是HTTP头的一部分:
accept:*/*;q=0.1
accept:text/html
accept:image/jpeg
那么HTTP_ACCEPT变量将具有以下值:
*/*;q=0.1,text/html,image/jpeg
PATH_INFO附加的路径信息,与客户给定的相同。这个构成了URL中在脚本名之后,而在查询字符串(如果有)之前的部分
PATH_TRANSLATED这是PATH_INFO的值,但是还把一些虚拟路径名扩展到了目录信息中。
QUERY_STRING在引用该脚本的URL中?后面的信息
REMOTE_ADDR客户的IP地址
REMOTE_HOST客户的主机名字
REMOTE_USER这里包括了客户提供,经服务器鉴定的用户名
REQUEST_METHODHTTP的请求方法
SCRIPT_NAME要指向的脚本程序的名字
SERVER_NAME服务器的主机名(或IP地址),与在引用自己的URL中出现的一样
SERVER_PORT接收到请求的TCP/IP端口
SERVER_PROTOCOL与请求相关的信息获取协议的名字和版本。通常是HTTP/1.0
SERVER_SOFTWARECGI程序运行的Web服务器的名字和版本
lpvBuffer指向缓冲区的指针,该缓冲区用于接收请求的信息。
lpdwSize指向一个DWORD值的指针,该值指明了缓冲区可以容纳的字节数。如果成功地结束,DWORD中包含了传送到缓冲区内的字节数目(包括结束符null)。
WriteClient从指定的缓冲区向客户发送信息。WriteClient具有如下参数:
·ConnIDHTTP服务器分配的唯一的连接数。
·Buffer指向要写入数据的缓冲区的指针。
·lpdwBytes指向要写入的数据的指针。
·dwReserved为将来的用途保留。
ReadClient将Web客户的HTTP请求中的信息读入调用者提供的缓冲区。ReadClient具有如下参数:
·ConnIDHTTP服务器分配的唯一的连接数。
·lpvBuffer指向接收要求的信息的缓冲区的指针。
·lpdwSize指向DWORD值的指针,该值指明缓冲区能够获得的字节数。*lpdwSize中包含了实际传送到缓冲区的字节数。
ServerSupportFunction向ISA提供一些通用目的函数,例如与HTTP服务器实现相关的函数。
ServerSupportFunction具有如下参数:
·hConn连接句柄。
·dwHSERRequestHTTP服务器扩展值。可能的取值和相关参数的列表参见 CHttpServerContext::ServerSupportFunction。
·lpvBuffer与HSE_REQ_SEND_RESPONSE_HEADER一起使用的时候,它指向一个以null结尾的字符串(例如,“401 Acess Denied”)。如果这个缓冲区为空,这个函数将发出缺省的响应“200 OK”。与HSE_REQ_DONE_WITH_SESSION一起使用的时候,它指向一个DWORD值,指明了请求的状态代码。
·lpdwSize与HSE_REQ_SEND_RESPONSE_HEADER一起使用的时候,它指向ldwDataType缓冲区的大小。
·lpdwDataType以nll为结尾的字符串,指向将与头一起发送的可选的头或数据。如果为NULL,这个头将以一组“\r\n”结束。

注释:
服务器用后缀.EXE和.BAT将文件标识为CGI(通用网关接口)可执行程序。另外,服务器能用DLL后缀将文件标识为要执行的脚本。
当服务器载入DLL时,它在入口点CHttpServer::GetExtensionVersion调用DLL,以获得HTTP_FILTER_REVISION的版本号,以及服务器管理者的简短文本描述。对于每个客户请求,都要调用CHttpServer::GetExtensionVersion入口点。
扩展将接收共同需要的信息,如查询字符串,路径信息,方法名和转换路径。

请参阅:
CHttpServerContext::ReadClient, CHttpServer::GetExtensionVersion, CHttpServer::HttpExtensionProc