完成HTTP解析请求侧解析基本流程
* 集成HTTP Parser,解析HTTP请求侧数据; * 增加tfe_http.h中请求方法、应答状态的常量定义 * 变更tfe_http.h中HTTP头部标准定义,去掉非头部字段,增加TFE前缀避免冲突。
This commit is contained in:
@@ -1,7 +1,89 @@
|
||||
#pragma once
|
||||
|
||||
#include <tfe_future.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/* Copy from http_parser.h */
|
||||
#define HTTP_METHOD_MAP(XX) \
|
||||
XX(0, DELETE, DELETE) \
|
||||
XX(1, GET, GET) \
|
||||
XX(2, HEAD, HEAD) \
|
||||
XX(3, POST, POST) \
|
||||
XX(4, PUT, PUT) \
|
||||
/* pathological */ \
|
||||
XX(5, CONNECT, CONNECT) \
|
||||
XX(6, OPTIONS, OPTIONS) \
|
||||
XX(7, TRACE, TRACE) \
|
||||
/* WebDAV */ \
|
||||
XX(8, COPY, COPY) \
|
||||
XX(9, LOCK, LOCK) \
|
||||
XX(10, MKCOL, MKCOL) \
|
||||
XX(11, MOVE, MOVE) \
|
||||
XX(12, PROPFIND, PROPFIND) \
|
||||
XX(13, PROPPATCH, PROPPATCH) \
|
||||
XX(14, SEARCH, SEARCH) \
|
||||
XX(15, UNLOCK, UNLOCK) \
|
||||
XX(16, BIND, BIND) \
|
||||
XX(17, REBIND, REBIND) \
|
||||
XX(18, UNBIND, UNBIND) \
|
||||
XX(19, ACL, ACL) \
|
||||
/* subversion */ \
|
||||
XX(20, REPORT, REPORT) \
|
||||
XX(21, MKACTIVITY, MKACTIVITY) \
|
||||
XX(22, CHECKOUT, CHECKOUT) \
|
||||
XX(23, MERGE, MERGE) \
|
||||
/* upnp */ \
|
||||
XX(24, MSEARCH, M-SEARCH) \
|
||||
XX(25, NOTIFY, NOTIFY) \
|
||||
XX(26, SUBSCRIBE, SUBSCRIBE) \
|
||||
XX(27, UNSUBSCRIBE, UNSUBSCRIBE) \
|
||||
/* RFC-5789 */ \
|
||||
XX(28, PATCH, PATCH) \
|
||||
XX(29, PURGE, PURGE) \
|
||||
/* CalDAV */ \
|
||||
XX(30, MKCALENDAR, MKCALENDAR) \
|
||||
/* RFC-2068, section 19.6.1.2 */ \
|
||||
XX(31, LINK, LINK) \
|
||||
XX(32, UNLINK, UNLINK) \
|
||||
/* icecast */ \
|
||||
XX(33, SOURCE, SOURCE) \
|
||||
|
||||
enum tfe_http_std_method
|
||||
{
|
||||
#define XX(num, name, string) TFE_HTTP_##name = num,
|
||||
HTTP_METHOD_MAP(XX)
|
||||
#undef XX
|
||||
};
|
||||
|
||||
enum tfe_http_std_field
|
||||
{
|
||||
TFE_HTTP_UNKNOWN_FIELD = 0,
|
||||
TFE_HTTP_HOST,
|
||||
TFE_HTTP_REFERER,
|
||||
TFE_HTTP_USER_AGENT,
|
||||
TFE_HTTP_COOKIE,
|
||||
TFE_HTTP_PROXY_AUTHORIZATION,
|
||||
TFE_HTTP_AUTHORIZATION,
|
||||
TFE_HTTP_LOCATION,
|
||||
TFE_HTTP_SERVER,
|
||||
TFE_HTTP_ETAG,
|
||||
TFE_HTTP_DATE,
|
||||
TFE_HTTP_TRAILER,
|
||||
TFE_HTTP_TRANSFER_ENCODING,
|
||||
TFE_HTTP_VIA,
|
||||
TFE_HTTP_PRAGMA,
|
||||
TFE_HTTP_CONNECTION,
|
||||
TFE_HTTP_CONT_ENCODING,
|
||||
TFE_HTTP_CONT_LANGUAGE,
|
||||
TFE_HTTP_CONT_LOCATION,
|
||||
TFE_HTTP_CONT_RANGE,
|
||||
TFE_HTTP_CONT_LENGTH,
|
||||
TFE_HTTP_CONT_TYPE,
|
||||
TFE_HTTP_CONT_DISPOSITION,
|
||||
TFE_HTTP_EXPIRES,
|
||||
TFE_HTTP_ACCEPT_ENCODING,
|
||||
};
|
||||
|
||||
struct tfe_http_req_spec
|
||||
{
|
||||
int method;
|
||||
@@ -10,11 +92,10 @@ struct tfe_http_req_spec
|
||||
char * url; //uri+host
|
||||
char * accept_encoding;
|
||||
};
|
||||
|
||||
struct tfe_http_resp_spec
|
||||
{
|
||||
int resp_code;
|
||||
int major_version; //HTTP/1.x or HTTP/ 2
|
||||
int minor_version; //HTTP 1.1 or 1.0
|
||||
char * content_encoding;
|
||||
};
|
||||
|
||||
@@ -27,60 +108,28 @@ enum tfe_http_direction
|
||||
struct tfe_http_half
|
||||
{
|
||||
enum tfe_http_direction direction;
|
||||
short major_version; //HTTP/1.x or HTTP/ 2
|
||||
short minor_version; //HTTP 1.1 or 1.0
|
||||
|
||||
union
|
||||
{
|
||||
struct tfe_http_req_spec req_spec;
|
||||
struct tfe_http_resp_spec resp_spec;
|
||||
};
|
||||
|
||||
size_t field_cnt;
|
||||
unsigned int field_cnt;
|
||||
uint64_t cont_len;
|
||||
uint64_t cont_range_from;
|
||||
uint64_t cont_range_to;
|
||||
struct evbuffer * body;
|
||||
void * fields; //hide by protocol layer
|
||||
};
|
||||
|
||||
struct tfe_http_session
|
||||
{
|
||||
int session_sequence;//?
|
||||
int session_id;//?
|
||||
int major_version;//1:HTTP 1.x, 2:HTTP 2
|
||||
struct tfe_http_half * req;
|
||||
struct tfe_http_half * resp;//value is NULL before response received.
|
||||
void * proto_spec;
|
||||
};
|
||||
|
||||
enum tfe_http_std_field
|
||||
{
|
||||
HTTP_UNKNOWN_FIELD = 0,
|
||||
HTTP_MESSAGE_URL,
|
||||
HTTP_URI,
|
||||
HTTP_HOST,
|
||||
HTTP_REFERER,
|
||||
HTTP_USER_AGENT,
|
||||
HTTP_COOKIE,
|
||||
HTTP_PROXY_AUTHORIZATION,
|
||||
HTTP_AUTHORIZATION,
|
||||
HTTP_LOCATION,
|
||||
HTTP_SERVER,
|
||||
HTTP_ETAG,
|
||||
HTTP_DATE,
|
||||
HTTP_TRAILER,
|
||||
HTTP_TRANSFER_ENCODING,
|
||||
HTTP_VIA,
|
||||
HTTP_PRAGMA,
|
||||
HTTP_CONNECTION,
|
||||
HTTP_CONT_ENCODING,
|
||||
HTTP_CONT_LANGUAGE,
|
||||
HTTP_CONT_LOCATION,
|
||||
HTTP_CONT_RANGE,
|
||||
HTTP_CONT_LENGTH,
|
||||
HTTP_CONT_TYPE,
|
||||
HTTP_CONT_DISPOSITION,
|
||||
HTTP_CHARSET,
|
||||
HTTP_EXPIRES,
|
||||
HTTP_X_FLASH_VERSION,
|
||||
HTTP_TRANSFER_LENGTH
|
||||
};
|
||||
|
||||
struct http_field_name
|
||||
@@ -149,7 +198,7 @@ enum tfe_bussiness_action
|
||||
|
||||
//@param event: bit AND of EV_HTTP_**
|
||||
//@param body_frag: NULL for no body data.
|
||||
typedef tfe_bussiness_action (* http_read_func)(const struct tfe_stream * stream,
|
||||
typedef tfe_bussiness_action (* http_data_func)(const struct tfe_stream * stream,
|
||||
const struct tfe_http_session * session, uint64_t event, struct evbuffer * body_frag, void ** pme);
|
||||
|
||||
struct tfe_http_half * tfe_http_request_create(int major_version, int method, const char * uri, const char * host);
|
||||
|
||||
Reference in New Issue
Block a user