HTTP组件监听器接口继承于IHttpListenerT和相应的TCP组件监听器接口。IHttpListenerT的HTTP事件可以理解为TCP组件监听器OnReceive事件的分解。HTTP事件返回值的类型为EnHttpParseResult:

**HPR_OK :解析成功,继续执行
HPR_SKIP_BODY :跳过当前请求BODY,完成本次请求
(仅用于 OnHeadersComplete 事件)
HPR_UPGRADE :升级协议,完成本次请求,并且不再进行后续HTTP解析
(仅用于 OnHeadersComplete 事件)
HPR_ERROR :解析错误,终止解析,断开连接**
* * * * *
**开始解析事件:**
~~~
EnHttpParseResult OnMessageBegin(pSender, dwConnID)
pSender -- 事件源对象
dwConnID -- 连接ID
~~~
**请求行解析完成事件(仅用于HTTP服务端):**
~~~
EnHttpParseResult OnRequestLine(pSender, dwConnID, lpszMethod, lpszUrl)
pSender -- 事件源对象
dwConnID -- 连接ID
lpszMethod -- 请求方法名
lpszUrl -- 请求行中的URL域
~~~
**状态行解析完成事件(仅用于HTTP客户端):**
~~~
EnHttpParseResult OnStatusLine(pSender, dwConnID, usStatusCode, lpszDesc)
pSender -- 事件源对象
dwConnID -- 连接ID
usStatusCode -- HTTP状态码
lpszDesc -- 状态描述
~~~
**请求头事件:**
~~~
EnHttpParseResult OnHeader(pSender, dwConnID, lpszName, lpszValue)
pSender -- 事件源对象
dwConnID -- 连接ID
lpszName -- 请求头名称
lpszValue -- 请求头值
~~~
**请求头完成事件:**
~~~
EnHttpParseResult OnHeadersComplete(pSender, dwConnID)
pSender -- 事件源对象
dwConnID -- 连接ID
~~~
**BODY报文事件:**
~~~
EnHttpParseResult OnBody(pSender, dwConnID, pData, iLength)
pSender -- 事件源对象
dwConnID -- 连接ID
pData -- 数据缓冲区
iLength -- 数据长度
~~~
**Chunked报文头事件:**
~~~
EnHttpParseResult OnChunkHeader(pSender, dwConnID, iLength)
pSender -- 事件源对象
dwConnID -- 连接ID
iLength -- Chunked报文体数据长度
~~~
**Chunked报文结束事件:**
~~~
EnHttpParseResult OnChunkComplete(pSender, dwConnID)
pSender -- 事件源对象
dwConnID -- 连接ID
~~~
**完成解析事件:**
~~~
EnHttpParseResult OnMessageComplete(pSender, dwConnID)
pSender -- 事件源对象
dwConnID -- 连接ID
~~~
**升级协议事件:**
~~~
EnHttpParseResult OnUpgrade(pSender, dwConnID)
pSender -- 事件源对象
dwConnID -- 连接ID
enUpgradeType -- 协议类型
~~~
**解析错误事件:**
~~~
EnHttpParseResult OnParseError(pSender, dwConnID, iErrorCode, lpszErrorDesc)
pSender -- 事件源对象
dwConnID -- 连接ID
iErrorCode -- 错误代码
lpszErrorDesc -- 错误描述
~~~
**Web Socket数据包头事件:**
~~~
EnHandleResult OnWSMessageHeader(pSender, dwConnID, bFinal, iReserved, iOperationCode, lpszMask, ullBodyLen)
pSender -- 事件源对象
dwConnID -- 连接ID
bFinal -- 是否结束帧
iReserved -- RSV1/RSV2/RSV3 各 1 位
iOperationCode -- 操作码:0x0 - 0xF
lpszMask -- 掩码(nullptr 或 4 字节掩码,如果为 nullptr 则没有掩码)
ullBodyLen -- 消息体长度
~~~
**Web Socket 数据包体事件:**
~~~
EnHandleResult OnWSMessageBody(pSender, dwConnID, pData, iLength)
pSender -- 事件源对象
dwConnID -- 连接ID
pData -- 消息体数据缓冲区
iLength -- 消息体数据长度
~~~
**Web Socket 数据包完成事件:**
~~~
EnHandleResult OnWSMessageComplete(pSender, dwConnID)
pSender -- 事件源对象
dwConnID -- 连接ID
~~~
OnHeadersComplete、OnBody、OnMessageComplete和OnParseError是最基本的4个HTTP事件,所有应用程序都要对这些事件进行处理,其他事件则根据应用程序的实际情况进行处理。例如:如果应用程序不用处理Chunked报文则可忽略OnChunkHeader和OnChunkComplete事件;如果应用程序不会进行协议升级则可忽略OnUpgrade事件。
* * * * *
HP-Socket支持Web Socket和Http Tunnel协议升级,协议升级时会触发OnUpgrade事件,该事件的enUpgradeType参数指示升级类型:

**HUT_WEB_SOCKET** :Web Socket
**HUT_HTTP_TUNNEL** :HTTP Tunnel
* * * * *
当完成协议升级后不再进行HTTP解析,也不会触发常规HTTP事件。如果升级类型为Web Socket,触发OnWSMessageHeader、OnWSMessageBody和OnWSMessageComplete事件处理Web Socket数据;如果升级类型为HTTP Tunnel,后续接收的所有数据都被看作为TCP数据,触发OnReceive事件。
* * * * *
> 注意:
> Sync Client:同步HTTP客户端组件(CHttpSyncClient和CHttpsSyncClient)内部会处理所有事件,因此,它们不需要绑定监听器(构造方法的监听器参数传入null);如果绑定了监听器则可以跟踪组件的通信过程。
