#include "tfe_connection.h" #include struct tfe_http_req_spec { int method; char* uri; char* host; 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; }; #define HTTP_REQUEST 1 #define HTTP_RESPONSE 2 struct tfe_http_half { int direction; //HTTP_REQUEST or HTTP_RESPONSE union { struct tfe_http_req_spec req_spec; struct tfe_http_resp_spec resp_spec; }; size_t 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 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 { enum tfe_http_std_field field_id; char* field_name; //Non-NULL when field_id isHTTP_UNKNOWN_FIELD. }; const char* tfe_http_field_read(const struct tfe_http_half* half, const struct http_field_name* name); int tfe_http_field_to_range(const char* field_value, long* range_from, long* range_to); int tfe_http_field_to_digit(const char* field_value, long* digit); //******obsolete //long tfe_http_read_num_field(const struct tfe_http_half* half, const struct http_field_name* name); //@Input param interator: NULL to get the first field. //@Output param name: //@return: field value. const char* tfe_http_field_iterate(const struct tfe_http_half* half, void* interator, struct http_field_name* name); struct tfe_http_half* tfe_http_allow_write(const struct tfe_http_half* half); //@param value: NULL for delete //@param name: Could be CHUNK/ENCODING int tfe_http_field_write(struct tfe_http_half* half, const struct http_field_name* name, const char* value); //******obsolete //int tfe_http_field_read_func(const struct tfe_http_half* half, const char* name, char* value, size_t size); enum http_ev_bit_number { REQ_HDR_BITNUM=0, REQ_BODY_BEGIN_BITNUM, REQ_BODY_CONT_BITNUM, REQ_BODY_END_BITNUM, RESP_HDR_BITNUM, RESP_BODY_BEGIN_BITNUM, RESP_BODY_CONT_BITNUM, RESP_BODY_END_BITNUM }; #define EV_HTTP_REQ_HDR ((uint64_t)1<