57
63
#define HTTP_IS_TOKEN(x) (http_is_token[(unsigned char)(x)])
58
64
#define HTTP_IS_VER_TOKEN(x) (http_is_ver_token[(unsigned char)(x)])
60
int event_accept(int fd);
61
int process_cli(struct session *t);
62
int process_srv_data(struct session *t);
63
int process_srv_conn(struct session *t);
64
int http_wait_for_request(struct session *s, struct buffer *req, int an_bit);
65
int http_process_req_common(struct session *s, struct buffer *req, int an_bit, struct proxy *px);
66
int http_process_request(struct session *t, struct buffer *req, int an_bit);
67
int http_process_tarpit(struct session *s, struct buffer *req, int an_bit);
68
int http_process_request_body(struct session *s, struct buffer *req, int an_bit);
69
int http_send_name_header(struct http_txn *txn, struct http_msg *msg, struct buffer *buf, struct proxy* be, const char* svr_name);
70
int http_wait_for_response(struct session *s, struct buffer *rep, int an_bit);
71
int http_process_res_common(struct session *t, struct buffer *rep, int an_bit, struct proxy *px);
72
int http_request_forward_body(struct session *s, struct buffer *req, int an_bit);
73
int http_response_forward_body(struct session *s, struct buffer *res, int an_bit);
66
int process_cli(struct session *s);
67
int process_srv_data(struct session *s);
68
int process_srv_conn(struct session *s);
69
int http_wait_for_request(struct session *s, struct channel *req, int an_bit);
70
int http_process_req_common(struct session *s, struct channel *req, int an_bit, struct proxy *px);
71
int http_process_request(struct session *s, struct channel *req, int an_bit);
72
int http_process_tarpit(struct session *s, struct channel *req, int an_bit);
73
int http_wait_for_request_body(struct session *s, struct channel *req, int an_bit);
74
int http_send_name_header(struct http_txn *txn, struct proxy* be, const char* svr_name);
75
int http_wait_for_response(struct session *s, struct channel *rep, int an_bit);
76
int http_process_res_common(struct session *s, struct channel *rep, int an_bit, struct proxy *px);
77
int http_request_forward_body(struct session *s, struct channel *req, int an_bit);
78
int http_response_forward_body(struct session *s, struct channel *res, int an_bit);
75
void debug_hdr(const char *dir, struct session *t, const char *start, const char *end);
76
void get_srv_from_appsession(struct session *t, const char *begin, int len);
77
int apply_filter_to_req_headers(struct session *t, struct buffer *req, struct hdr_exp *exp);
78
int apply_filter_to_req_line(struct session *t, struct buffer *req, struct hdr_exp *exp);
79
int apply_filters_to_request(struct session *s, struct buffer *req, struct proxy *px);
80
int apply_filters_to_response(struct session *t, struct buffer *rtr, struct proxy *px);
81
void manage_client_side_appsession(struct session *t, const char *buf, int len);
82
void manage_client_side_cookies(struct session *t, struct buffer *req);
83
void manage_server_side_cookies(struct session *t, struct buffer *rtr);
84
void check_response_for_cacheability(struct session *t, struct buffer *rtr);
85
int stats_check_uri(struct session *s, struct proxy *backend);
80
void debug_hdr(const char *dir, struct session *s, const char *start, const char *end);
81
void get_srv_from_appsession(struct session *s, const char *begin, int len);
82
int apply_filter_to_req_headers(struct session *s, struct channel *req, struct hdr_exp *exp);
83
int apply_filter_to_req_line(struct session *s, struct channel *req, struct hdr_exp *exp);
84
int apply_filters_to_request(struct session *s, struct channel *req, struct proxy *px);
85
int apply_filters_to_response(struct session *s, struct channel *rtr, struct proxy *px);
86
void manage_client_side_appsession(struct session *s, const char *buf, int len);
87
void manage_client_side_cookies(struct session *s, struct channel *req);
88
void manage_server_side_cookies(struct session *s, struct channel *rtr);
89
void check_response_for_cacheability(struct session *s, struct channel *rtr);
90
int stats_check_uri(struct stream_interface *si, struct http_txn *txn, struct proxy *backend);
86
91
void init_proto_http();
92
int http_find_full_header2(const char *name, int len,
93
char *sol, struct hdr_idx *idx,
87
95
int http_find_header2(const char *name, int len,
88
96
char *sol, struct hdr_idx *idx,
89
97
struct hdr_ctx *ctx);
98
char *find_hdr_value_end(char *s, const char *e);
99
int http_header_match2(const char *hdr, const char *end, const char *name, int len);
100
int http_remove_header2(struct http_msg *msg, struct hdr_idx *idx, struct hdr_ctx *ctx);
101
int http_header_add_tail2(struct http_msg *msg, struct hdr_idx *hdr_idx, const char *text, int len);
90
102
void http_sess_log(struct session *s);
91
void perform_http_redirect(struct session *s, struct stream_interface *si);
103
void http_perform_server_redirect(struct session *s, struct stream_interface *si);
92
104
void http_return_srv_error(struct session *s, struct stream_interface *si);
93
105
void http_capture_bad_message(struct error_snapshot *es, struct session *s,
94
struct buffer *buf, struct http_msg *msg,
95
int state, struct proxy *other_end);
96
unsigned int get_ip_from_hdr2(struct http_msg *msg, const char *hname, int hlen,
97
struct hdr_idx *idx, int occ);
106
struct http_msg *msg,
107
enum ht_state state, struct proxy *other_end);
108
unsigned int http_get_hdr(const struct http_msg *msg, const char *hname, int hlen,
109
struct hdr_idx *idx, int occ,
110
struct hdr_ctx *ctx, char **vptr, int *vlen);
99
112
void http_init_txn(struct session *s);
100
113
void http_end_txn(struct session *s);
101
114
void http_reset_txn(struct session *s);
116
struct http_req_rule *parse_http_req_cond(const char **args, const char *file, int linenum, struct proxy *proxy);
117
struct http_res_rule *parse_http_res_cond(const char **args, const char *file, int linenum, struct proxy *proxy);
118
void free_http_req_rules(struct list *r);
119
void free_http_res_rules(struct list *r);
120
struct chunk *http_error_message(struct session *s, int msgnum);
121
struct redirect_rule *http_parse_redirect_rule(const char *file, int linenum, struct proxy *curproxy,
122
const char **args, char **errmsg, int use_fmt);
123
int smp_fetch_cookie(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
124
const struct arg *args, struct sample *smp, const char *kw);
126
enum http_meth_t find_http_meth(const char *str, const int len);
128
struct http_req_action_kw *action_http_req_custom(const char *kw);
129
struct http_res_action_kw *action_http_res_custom(const char *kw);
131
static inline void http_req_keywords_register(struct http_req_action_kw_list *kw_list)
133
LIST_ADDQ(&http_req_keywords.list, &kw_list->list);
136
static inline void http_res_keywords_register(struct http_res_action_kw_list *kw_list)
138
LIST_ADDQ(&http_res_keywords.list, &kw_list->list);
103
142
/* to be used when contents change in an HTTP message */
104
143
#define http_msg_move_end(msg, bytes) do { \
105
144
unsigned int _bytes = (bytes); \
145
(msg)->next += (_bytes); \
106
146
(msg)->sov += (_bytes); \
107
147
(msg)->eoh += (_bytes); \
151
/* Return the amount of bytes that need to be rewound before buf->p to access
152
* the current message's headers. The purpose is to be able to easily fetch
153
* the message's beginning before headers are forwarded, as well as after.
154
* The principle is that msg->eoh and msg->eol are immutable while msg->sov
155
* equals the sum of the two before forwarding and is zero after forwarding,
156
* so the difference cancels the rewinding.
158
static inline int http_hdr_rewind(const struct http_msg *msg)
160
return msg->eoh + msg->eol - msg->sov;
163
/* Return the amount of bytes that need to be rewound before buf->p to access
164
* the current message's URI. The purpose is to be able to easily fetch
165
* the message's beginning before headers are forwarded, as well as after.
167
static inline int http_uri_rewind(const struct http_msg *msg)
169
return http_hdr_rewind(msg) - msg->sl.rq.u;
172
/* Return the amount of bytes that need to be rewound before buf->p to access
173
* the current message's BODY. The purpose is to be able to easily fetch
174
* the message's beginning before headers are forwarded, as well as after.
176
static inline int http_body_rewind(const struct http_msg *msg)
178
return http_hdr_rewind(msg) - msg->eoh - msg->eol;
181
/* Return the amount of bytes that need to be rewound before buf->p to access
182
* the current message's DATA. The difference with the function above is that
183
* if a chunk is present and has already been parsed, its size is skipped so
184
* that the byte pointed to is the first byte of actual data. The function is
185
* safe for use in state HTTP_MSG_DATA regardless of whether the headers were
186
* already forwarded or not.
188
static inline int http_data_rewind(const struct http_msg *msg)
190
return http_body_rewind(msg) - msg->sol;
193
/* Return the maximum amount of bytes that may be read after the beginning of
194
* the message body, according to the advertised length. The function is safe
195
* for use between HTTP_MSG_BODY and HTTP_MSG_DATA regardless of whether the
196
* headers were already forwarded or not.
198
static inline int http_body_bytes(const struct http_msg *msg)
202
len = msg->chn->buf->i - msg->sov - msg->sol;
203
if (len > msg->body_len)
208
/* for debugging, reports the HTTP message state name */
209
static inline const char *http_msg_state_str(int msg_state)
212
case HTTP_MSG_RQBEFORE: return "MSG_RQBEFORE";
213
case HTTP_MSG_RQBEFORE_CR: return "MSG_RQBEFORE_CR";
214
case HTTP_MSG_RQMETH: return "MSG_RQMETH";
215
case HTTP_MSG_RQMETH_SP: return "MSG_RQMETH_SP";
216
case HTTP_MSG_RQURI: return "MSG_RQURI";
217
case HTTP_MSG_RQURI_SP: return "MSG_RQURI_SP";
218
case HTTP_MSG_RQVER: return "MSG_RQVER";
219
case HTTP_MSG_RQLINE_END: return "MSG_RQLINE_END";
220
case HTTP_MSG_RPBEFORE: return "MSG_RPBEFORE";
221
case HTTP_MSG_RPBEFORE_CR: return "MSG_RPBEFORE_CR";
222
case HTTP_MSG_RPVER: return "MSG_RPVER";
223
case HTTP_MSG_RPVER_SP: return "MSG_RPVER_SP";
224
case HTTP_MSG_RPCODE: return "MSG_RPCODE";
225
case HTTP_MSG_RPCODE_SP: return "MSG_RPCODE_SP";
226
case HTTP_MSG_RPREASON: return "MSG_RPREASON";
227
case HTTP_MSG_RPLINE_END: return "MSG_RPLINE_END";
228
case HTTP_MSG_HDR_FIRST: return "MSG_HDR_FIRST";
229
case HTTP_MSG_HDR_NAME: return "MSG_HDR_NAME";
230
case HTTP_MSG_HDR_COL: return "MSG_HDR_COL";
231
case HTTP_MSG_HDR_L1_SP: return "MSG_HDR_L1_SP";
232
case HTTP_MSG_HDR_L1_LF: return "MSG_HDR_L1_LF";
233
case HTTP_MSG_HDR_L1_LWS: return "MSG_HDR_L1_LWS";
234
case HTTP_MSG_HDR_VAL: return "MSG_HDR_VAL";
235
case HTTP_MSG_HDR_L2_LF: return "MSG_HDR_L2_LF";
236
case HTTP_MSG_HDR_L2_LWS: return "MSG_HDR_L2_LWS";
237
case HTTP_MSG_LAST_LF: return "MSG_LAST_LF";
238
case HTTP_MSG_ERROR: return "MSG_ERROR";
239
case HTTP_MSG_BODY: return "MSG_BODY";
240
case HTTP_MSG_100_SENT: return "MSG_100_SENT";
241
case HTTP_MSG_CHUNK_SIZE: return "MSG_CHUNK_SIZE";
242
case HTTP_MSG_DATA: return "MSG_DATA";
243
case HTTP_MSG_CHUNK_CRLF: return "MSG_CHUNK_CRLF";
244
case HTTP_MSG_TRAILERS: return "MSG_TRAILERS";
245
case HTTP_MSG_DONE: return "MSG_DONE";
246
case HTTP_MSG_CLOSING: return "MSG_CLOSING";
247
case HTTP_MSG_CLOSED: return "MSG_CLOSED";
248
case HTTP_MSG_TUNNEL: return "MSG_TUNNEL";
249
default: return "MSG_??????";
110
253
#endif /* _PROTO_PROTO_HTTP_H */