#ifndef	__HTTP_PLUGIN_INCLUDE_H__
#define	__HTTP_PLUGIN_INCLUDE_H__

#include "lib_acl.h"
#include "lib_protocol.h"

#ifdef	__cplusplus
extern "C" {
#endif

/*------------------------- 动态模块需要的函数接口 ---------------------------*/

/**
 * HTTP 初始化注册函数, 该函数如果非空，则由主程序在刚开始运行时调用
 * @param dll_env {ACL_DLL_ENV*} DLL 环境变量, dll_env->logfp 日志文件句柄,
 *  如果不希望将日志记在主程序日志文件中，则可以将此值置空
 * @param dmptr {ACL_DEBUG_MEM*} 用于内存调试的句柄
 * @param cfg_dir {const char*} 配置文件所在路径，该路径下存放所有动态库的配置文件
 */
void http_plugin_init(ACL_DLL_ENV *dll_env, const char *cfg_dir);

/**
 * HTTP 请求过滤注册函数，该函数如果非空，则由主程序在收到HTTP请求头时调用
 * @param client {ACL_VSTREAM*} 客户端流
 * @param hdr_req {HTTP_HDR_REQ*} HTTP请求头
 * @param ctx_ptr {void**} 该指针可以用来存储用户的动态数据
 * @return {int} < 0: 表示禁止该HTTP请求, 该值表示错误号，可以为：-5xx/-4xx;
 *  0: 表示该HTTP请求继续由主程序处理; > 0: 表示该HTTP请求可以由外挂模块的单独
 *  线程处理
 */
int http_request_filter(ACL_VSTREAM *client, HTTP_HDR_REQ *hdr_req, void **ctx_ptr);

/**
 * HTTP 请求接管处理注册函数，该函数如果非空，且 http_request_filter() > 0，则由
 * 主程序调用此函数完全接管该HTTP请求及响应，主程序不再处理该HTTP请求及HTTP响应
 * @param client {ACL_VSTREAM*} HTTP客户端数据连接流
 * @param hdr_req {HTTP_HDR_REQ*} 客户端HTTP请求头
 * @param ctx {void*} 过滤器的参数，该动态参数是由 http_request_filter 中的 ctx_ptr
 *  参数返回的
 */
void http_request_forward(ACL_VSTREAM *client, HTTP_HDR_REQ *hdr_req, void *ctx);

/*------------------------------ 其它函数接口 --------------------------------*/

#define	DEBUG_BASE	500
#define	DBG_REQ		(DEBUG_BASE + 1)
#define	DBG_RES		(DEBUG_BASE + 2)

#define	STR	acl_vstring_str
#define	LEN	ACL_VSTRING_LEN

extern char *var_cfg_log_name;
extern char *var_cfg_http_domain_allow;
extern char *var_cfg_http_domain_redirect;
extern int   var_cfg_http_domain_allow_all;

#ifdef	__cplusplus
}
#endif

#endif
