mirror of
https://gitee.com/acl-dev/acl.git
synced 2024-11-30 02:47:56 +08:00
9697f95b8f
This reverts commit 15d999759e
.
193 lines
6.2 KiB
C
193 lines
6.2 KiB
C
#ifndef __HTTP_SERVICE_INCLUDE_H__
|
|
#define __HTTP_SERVICE_INCLUDE_H__
|
|
|
|
#include "lib_acl.h"
|
|
#include <time.h>
|
|
#include "lib_protocol.h"
|
|
|
|
#include "service_struct.h"
|
|
#include "file_cache.h"
|
|
#include "http_vhost.h"
|
|
#include "dns.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define DEBUG_PROXY_BASE 60
|
|
#define DEBUG_HTML_TITLE (DEBUG_PROXY_BASE + 1)
|
|
|
|
/* 常量定义 */
|
|
#define STR acl_vstring_str
|
|
#define LEN ACL_VSTRING_LEN
|
|
#define SCP ACL_SAFE_STRNCPY
|
|
|
|
#define HTTP_HDRLEN_DEF 8192
|
|
|
|
#define HTTP_FILTER_ERROR 0
|
|
#define HTTP_FILTER_HTTPD (1<<0)
|
|
#define HTTP_FILTER_PROXY (1<<1)
|
|
|
|
typedef struct HTTP_SERVICE HTTP_SERVICE;
|
|
typedef struct HTTP_CLIENT HTTP_CLIENT;
|
|
|
|
/* 过滤器初始化函数类型定义 */
|
|
typedef void (*plugin_init_fn)(ACL_DLL_ENV *dll_env, const char *plugin_cfg_dir);
|
|
|
|
/* 过滤器匹配函数类型定义 */
|
|
typedef int (*plugin_filter_request_fn)(ACL_VSTREAM *client,
|
|
HTTP_HDR_REQ *hdr_req,
|
|
void **ctx_ptr);
|
|
typedef int (*plugin_filter_respond_fn)(ACL_VSTREAM *client,
|
|
ACL_VSTREAM *server,
|
|
HTTP_HDR_REQ *hdr_req,
|
|
HTTP_HDR_RES *hdr_res,
|
|
void **ctx_ptr);
|
|
|
|
/* 过滤器接管函数类型定义 */
|
|
typedef void (*plugin_forward_request_fn)(ACL_VSTREAM *client,
|
|
HTTP_HDR_REQ *hdr_req, void *ctx);
|
|
typedef void (*plugin_forward_respond_fn)(ACL_VSTREAM *client, ACL_VSTREAM *server,
|
|
HTTP_HDR_REQ *hdr_req, HTTP_HDR_RES *hdr_res, void *ctx);
|
|
|
|
/* HTTP数据体过滤器函数类型定义 */
|
|
typedef char *(*plugin_dat_filter_fn)(const char *data, int dlen,
|
|
int *ret, int *stop, void *ctx);
|
|
/* 释放HTTP数据体过滤器分配的内存 */
|
|
typedef void (*plugin_dat_free_fn)(void *buf, void *ctx);
|
|
|
|
/* 过滤器结构类型定义 */
|
|
typedef struct HTTP_PLUGIN {
|
|
plugin_init_fn init;
|
|
union {
|
|
plugin_filter_request_fn request; /* 请求过滤器 */
|
|
plugin_filter_respond_fn respond; /* 响应过滤器 */
|
|
} filter; /* 过滤器接口 */
|
|
union {
|
|
plugin_forward_request_fn request; /* 请求接管器 */
|
|
plugin_forward_respond_fn respond; /* 响应接管器 */
|
|
} forward; /* 接管器接口 */
|
|
plugin_dat_filter_fn data_filter; /* 数据体过滤器 */
|
|
plugin_dat_free_fn data_free; /* 释放动态内存 */
|
|
} HTTP_PLUGIN;
|
|
|
|
struct HTTP_SERVICE {
|
|
SERVICE service;
|
|
ACL_VSTRING *file_path;
|
|
|
|
ACL_FIFO request_plugins; /* 外挂请求过滤器(HTTP_PLUGIN)集合 */
|
|
ACL_FIFO respond_plugins; /* 外挂响应过滤器(HTTP_PLUGIN)集合 */
|
|
ACL_FIFO request_dat_plugins; /* 外挂请求过滤器(HTTP_PLUGIN)集合 */
|
|
ACL_FIFO respond_dat_plugins; /* 外挂响应过滤器(HTTP_PLUGIN)集合 */
|
|
};
|
|
|
|
typedef struct {
|
|
HTTP_CLIENT *http_client;
|
|
HTTP_HDR_REQ *hdr_req; /* HTTP协议请求头指针 */
|
|
HTTP_REQ *req; /* HTTP协议请求 */
|
|
int flag;
|
|
#define CLIENT_READ_WAIT (1 << 2)
|
|
#define SERVER_READ_WAIT (1 << 3)
|
|
} HTTP_CLIENT_REQ;
|
|
|
|
struct HTTP_CLIENT {
|
|
CLIENT_ENTRY entry; /* 基本代理对象 */
|
|
HTTP_CLIENT_REQ *req_curr; /* 当前正被处理的请求 */
|
|
ACL_FIFO req_list; /* HTTP请求队列 */
|
|
#define WRITE_TO_CLIENT(x, buff, dlen) acl_aio_writen((x)->entry.client, (buff), (int) (dlen))
|
|
#define WRITEV_TO_CLIENT(x, vect, cnt) acl_aio_writev((x)->entry.client, (vect), (int) (cnt))
|
|
#define WRITE_TO_SERVER(x, buff, dlen) acl_aio_writen((x)->entry.server, (buff), (int) (dlen))
|
|
HTTP_HDR_RES *hdr_res; /* HTTP协议响应头指针 */
|
|
HTTP_RES *res; /* HTTP协议响应 */
|
|
ACL_VSTREAM *fp;
|
|
|
|
int use_cache;
|
|
ACL_VSTRING *buf; /* 内部用的动态内存 */
|
|
FILE_CACHE *cache;
|
|
CACHE_ITER cache_iter;
|
|
|
|
unsigned int flag;
|
|
#define HTTP_FLAG_CLIENT_LOCKED (1 << 0)
|
|
#define HTTP_FLAG_SERVER_LOCKED (1 << 1)
|
|
#define HTTP_FLAG_CLIENT_CLOSED (1 << 3)
|
|
#define HTTP_FLAG_SERVER_CLOSED (1 << 4)
|
|
#define HTTP_FLAG_REQEND (1 << 5)
|
|
#define HTTP_FLAG_FINISH (1 << 6)
|
|
#define HTTP_FLAG_CLIENT_KEEP_ALIVE (1 << 7)
|
|
#define HTTP_FLAG_SERVER_KEEP_ALIVE (1 << 8)
|
|
|
|
size_t total_size;
|
|
size_t sent_size;
|
|
|
|
struct {
|
|
time_t read_reqhdr; /* 读HTTP协议请求头时间 */
|
|
time_t read_reqbody; /* 读HTTP协议请求体时间 */
|
|
time_t read_reshdr; /* 读HTTP协议响应头时间 */
|
|
time_t read_resbody; /* 读HTTP协议响应体时间 */
|
|
time_t send_reqhdr; /* 写HTTP协议请求头时间 */
|
|
time_t send_reqbody; /* 写HTTP协议请求体时间 */
|
|
time_t send_reshdr; /* 写HTTP协议响应头时间 */
|
|
time_t send_resbody; /* 写HTTP协议响应体时间 */
|
|
} tm;
|
|
|
|
plugin_dat_filter_fn request_filter; /* 外挂模块HTTP请求数据体过滤器 */
|
|
plugin_dat_filter_fn respond_filter; /* 外挂模块HTTP响应数据体过滤器 */
|
|
void *plugin_req_ctx; /* 外挂模块在HTTP请求阶段的动态参数 */
|
|
void *plugin_res_ctx; /* 外挂模块在HTTP响应阶段的动态参数 */
|
|
};
|
|
|
|
/* in html_template.c */
|
|
extern char HTTP_REPLY_DNS_ERR[];
|
|
extern char HTTP_REPLY_TIMEOUT[];
|
|
extern char HTTP_REPLY_ERROR[];
|
|
extern char HTTP_SEND_ERROR[];
|
|
extern char HTTP_REQUEST_INVALID[];
|
|
extern char HTTP_REQUEST_LOOP[];
|
|
extern char HTTP_CONNECT_ERROR[];
|
|
extern char HTTP_CONNECT_TIMEOUT[];
|
|
extern char HTTP_REQUEST_DENY[];
|
|
extern char HTTP_REQUEST_NOFOUND[];
|
|
extern char HTTP_INTERNAL_ERROR[];
|
|
|
|
/* in http_service.c */
|
|
void http_service_main(HTTP_SERVICE *service, ACL_ASTREAM *stream);
|
|
void http_service_start(HTTP_CLIENT *client);
|
|
void http_service_free(HTTP_SERVICE *service);
|
|
HTTP_SERVICE *http_service_new(void);
|
|
|
|
/* in http_filter.c */
|
|
int http_filter_type(void);
|
|
void http_filter_set(const char *filter_info);
|
|
|
|
/* in http_plugin.c */
|
|
void http_plugin_load(ACL_DLL_ENV *dll_env, const char *dlname, const char *plugin_cfgdir);
|
|
void http_plugin_load_all(ACL_DLL_ENV *dll_env, const char *dlnames, const char *plugin_cfgdir);
|
|
void http_plugin_unload_all(void);
|
|
void http_plugin_set_callback(HTTP_SERVICE *service);
|
|
|
|
/* in http_conf.c */
|
|
void http_conf_load(const char *path, const char *default_cf);
|
|
|
|
/* in http_client.c */
|
|
HTTP_CLIENT *http_client_new(HTTP_SERVICE *service, ACL_ASTREAM *stream);
|
|
void http_client_free(CLIENT_ENTRY *entry);
|
|
void http_client_reset(HTTP_CLIENT *client);
|
|
HTTP_CLIENT_REQ *http_client_req_new(HTTP_CLIENT *http_client);
|
|
void http_client_req_free(HTTP_CLIENT_REQ *req);
|
|
int http_client_req_filter(HTTP_CLIENT *http_client);
|
|
|
|
/* in http_server.c */
|
|
int http_server_start(HTTP_CLIENT *http_client);
|
|
|
|
/* in http_proxy.c */
|
|
int http_proxy_start(HTTP_CLIENT *entry);
|
|
|
|
/* in tcp_proxy.c */
|
|
void tcp_start(CLIENT_ENTRY *entry);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|