mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-23 06:41:32 +02:00
Historically, an option was added to wait for the request payload (option http-buffer-request). This option has 2 drawbacks. First, it is an ON/OFF option for the whole proxy. It cannot be enabled on demand depending on the message. Then, as its name suggests, it only works on the request side. The only option to wait for the response payload was to write a dedicated filter. While it is an acceptable solution for complex applications, it is a bit overkill to simply match strings in the body. To make everyone happy, this patch adds a dedicated HTTP action to wait for the message payload, for the request or the response depending it is used in an http-request or an http-response ruleset. The time to wait is configurable and, optionally, the minimum payload size to have before stop to wait. Both the http action and the old http analyzer rely on the same internal function.
90 lines
4.1 KiB
C
90 lines
4.1 KiB
C
/*
|
|
* include/haproxy/http_ana.h
|
|
* This file contains HTTP protocol definitions.
|
|
*
|
|
* Copyright (C) 2000-2011 Willy Tarreau - w@1wt.eu
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation, version 2.1
|
|
* exclusively.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef _HAPROXY_PROTO_HTTP_H
|
|
#define _HAPROXY_PROTO_HTTP_H
|
|
|
|
#include <haproxy/api.h>
|
|
#include <haproxy/channel-t.h>
|
|
#include <haproxy/http_ana-t.h>
|
|
#include <haproxy/htx-t.h>
|
|
#include <haproxy/stream-t.h>
|
|
|
|
extern struct pool_head *pool_head_uniqueid;
|
|
extern struct pool_head *pool_head_http_txn;
|
|
|
|
int http_wait_for_request(struct stream *s, struct channel *req, int an_bit);
|
|
int http_process_req_common(struct stream *s, struct channel *req, int an_bit, struct proxy *px);
|
|
int http_process_request(struct stream *s, struct channel *req, int an_bit);
|
|
int http_process_tarpit(struct stream *s, struct channel *req, int an_bit);
|
|
int http_wait_for_request_body(struct stream *s, struct channel *req, int an_bit);
|
|
int http_wait_for_response(struct stream *s, struct channel *rep, int an_bit);
|
|
int http_process_res_common(struct stream *s, struct channel *rep, int an_bit, struct proxy *px);
|
|
int http_request_forward_body(struct stream *s, struct channel *req, int an_bit);
|
|
int http_response_forward_body(struct stream *s, struct channel *res, int an_bit);
|
|
int http_apply_redirect_rule(struct redirect_rule *rule, struct stream *s, struct http_txn *txn);
|
|
int http_eval_after_res_rules(struct stream *s);
|
|
int http_replace_hdrs(struct stream* s, struct htx *htx, struct ist name, const char *str, struct my_regex *re, int full);
|
|
int http_req_replace_stline(int action, const char *replace, int len,
|
|
struct proxy *px, struct stream *s);
|
|
int http_res_set_status(unsigned int status, struct ist reason, struct stream *s);
|
|
void http_check_request_for_cacheability(struct stream *s, struct channel *req);
|
|
void http_check_response_for_cacheability(struct stream *s, struct channel *res);
|
|
enum rule_result http_wait_for_msg_body(struct stream *s, struct channel *chn, unsigned int time, unsigned int bytes);
|
|
void http_perform_server_redirect(struct stream *s, struct stream_interface *si);
|
|
void http_server_error(struct stream *s, struct stream_interface *si, int err, int finst, struct http_reply *msg);
|
|
void http_reply_and_close(struct stream *s, short status, struct http_reply *msg);
|
|
void http_return_srv_error(struct stream *s, struct stream_interface *si);
|
|
struct http_reply *http_error_message(struct stream *s);
|
|
int http_reply_to_htx(struct stream *s, struct htx *htx, struct http_reply *reply);
|
|
int http_reply_message(struct stream *s, struct http_reply *reply);
|
|
int http_forward_proxy_resp(struct stream *s, int final);
|
|
|
|
struct http_txn *http_create_txn(struct stream *s);
|
|
void http_destroy_txn(struct stream *s);
|
|
|
|
/* for debugging, reports the HTTP/1 message state name (legacy version) */
|
|
static inline const char *h1_msg_state_str(enum h1_state msg_state)
|
|
{
|
|
switch (msg_state) {
|
|
case HTTP_MSG_RQBEFORE: return "MSG_RQBEFORE";
|
|
case HTTP_MSG_RPBEFORE: return "MSG_RPBEFORE";
|
|
case HTTP_MSG_ERROR: return "MSG_ERROR";
|
|
case HTTP_MSG_BODY: return "MSG_BODY";
|
|
case HTTP_MSG_DATA: return "MSG_DATA";
|
|
case HTTP_MSG_ENDING: return "MSG_ENDING";
|
|
case HTTP_MSG_DONE: return "MSG_DONE";
|
|
case HTTP_MSG_CLOSING: return "MSG_CLOSING";
|
|
case HTTP_MSG_CLOSED: return "MSG_CLOSED";
|
|
case HTTP_MSG_TUNNEL: return "MSG_TUNNEL";
|
|
default: return "MSG_??????";
|
|
}
|
|
}
|
|
|
|
#endif /* _HAPROXY_PROTO_HTTP_H */
|
|
|
|
/*
|
|
* Local variables:
|
|
* c-indent-level: 8
|
|
* c-basic-offset: 8
|
|
* End:
|
|
*/
|