haproxy/include/types/action.h
Christopher Faulet 4a2c142779 MEDIUM: http-rules: Support extra headers for HTTP return actions
It is now possible to append extra headers to the generated responses by HTTP
return actions, while it is not based on an errorfile. For return actions based
on errorfiles, these extra headers are ignored. To define an extra header, a
"hdr" argument must be used with a name and a value. The value is a log-format
string. For instance:

  http-request status 200 hdr "x-src" "%[src]" hdr "x-dst" "%[dst]"
2020-02-06 15:13:03 +01:00

189 lines
5.9 KiB
C

/*
* include/types/action.h
* This file contains actions definitions.
*
* Copyright (C) 2000-2010 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 _TYPES_ACTION_H
#define _TYPES_ACTION_H
#include <common/regex.h>
#include <types/applet.h>
#include <types/stick_table.h>
enum act_from {
ACT_F_TCP_REQ_CON, /* tcp-request connection */
ACT_F_TCP_REQ_SES, /* tcp-request session */
ACT_F_TCP_REQ_CNT, /* tcp-request content */
ACT_F_TCP_RES_CNT, /* tcp-response content */
ACT_F_HTTP_REQ, /* http-request */
ACT_F_HTTP_RES, /* http-response */
};
enum act_return {
ACT_RET_CONT, /* continue processing. */
ACT_RET_STOP, /* stop processing. */
ACT_RET_YIELD, /* call me again. */
ACT_RET_ERR, /* internal processing error. */
ACT_RET_DONE, /* processing done, stop processing */
ACT_RET_DENY, /* deny, must be handled by the caller */
ACT_RET_ABRT, /* abort, handled by action itsleft. */
ACT_RET_INV, /* invalid request/response */
};
enum act_parse_ret {
ACT_RET_PRS_OK, /* continue processing. */
ACT_RET_PRS_ERR, /* abort processing. */
};
/* Option flags passed to custom actions */
enum act_opt {
ACT_OPT_NONE = 0x00000000, /* no flag */
ACT_OPT_FINAL = 0x00000001, /* last call, cannot yield */
ACT_OPT_FIRST = 0x00000002, /* first call for this action */
};
/* Flags used to describe the action. */
enum act_flag {
ACT_FLAG_FINAL = 1 << 0, /* the action stops the rules evaluation when executed */
};
/* known actions to be used without any action function pointer. This enum is
* typically used in a switch case, iff .action_ptr is undefined. So if an
* action function is defined for one of following action types, the function
* have the priority over the switch.
*/
enum act_name {
ACT_CUSTOM = 0,
/* common action */
ACT_ACTION_ALLOW,
ACT_ACTION_DENY,
/* common http actions .*/
ACT_HTTP_DEL_HDR,
ACT_HTTP_REDIR,
ACT_HTTP_SET_NICE,
ACT_HTTP_SET_LOGL,
ACT_HTTP_SET_TOS,
ACT_HTTP_SET_MARK,
/* http request actions. */
ACT_HTTP_REQ_TARPIT,
ACT_HTTP_REQ_AUTH,
/* tcp actions */
ACT_TCP_EXPECT_PX,
ACT_TCP_EXPECT_CIP,
ACT_TCP_CLOSE, /* close at the sender's */
};
/* NOTE: if <.action_ptr> is defined, the referenced function will always be
* called regardless the action type. */
struct act_rule {
struct list list;
struct acl_cond *cond; /* acl condition to meet */
unsigned int action; /* ACT_* or any meaningful value if action_ptr is defined */
unsigned int flags; /* ACT_FLAG_* */
enum act_from from; /* ACT_F_* */
enum act_return (*action_ptr)(struct act_rule *rule, struct proxy *px, /* ptr to custom action */
struct session *sess, struct stream *s, int opts);
int (*check_ptr)(struct act_rule *rule, struct proxy *px, char **err); /* ptr to check function */
void (*release_ptr)(struct act_rule *rule); /* ptr to release function */
struct action_kw *kw;
struct applet applet; /* used for the applet registration. */
union {
struct {
struct sample_expr *expr;
char *varname;
char *resolvers_id;
struct dns_resolvers *resolvers;
struct dns_options *dns_opts;
} dns; /* dns resolution */
struct {
int i; /* integer param (status, nice, loglevel, ..) */
struct ist str; /* string param (reason, header name, ...) */
struct list fmt; /* log-format compatible expression */
struct my_regex *re; /* used by replace-header/value/uri/path */
} http; /* args used by some HTTP rules */
struct {
int status; /* status code */
struct buffer *errmsg; /* HTTP error message, may be NULL */
} http_deny; /* args used by HTTP deny rules */
struct {
int status;
char *ctype;
struct list *hdrs;
union {
struct list fmt;
struct buffer obj;
struct buffer *errmsg;
} body;
} http_return;
struct redirect_rule *redir; /* redirect rule or "http-request redirect" */
struct {
char *ref; /* MAP or ACL file name to update */
struct list key; /* pattern to retrieve MAP or ACL key */
struct list value; /* pattern to retrieve MAP value */
} map;
struct sample_expr *expr;
struct {
struct sample_expr *expr; /* expression used as the key */
struct cap_hdr *hdr; /* the capture storage */
} cap;
struct {
struct sample_expr *expr;
int idx;
} capid;
struct hlua_rule *hlua_rule;
struct {
struct sample_expr *expr;
const char *name;
enum vars_scope scope;
} vars;
struct {
int sc;
} gpc;
struct {
int sc;
long long int value;
struct sample_expr *expr;
} gpt;
struct track_ctr_prm trk_ctr;
struct {
void *p[4];
} act; /* generic pointers to be used by custom actions */
} arg; /* arguments used by some actions */
};
struct action_kw {
const char *kw;
enum act_parse_ret (*parse)(const char **args, int *cur_arg, struct proxy *px,
struct act_rule *rule, char **err);
int match_pfx;
void *private;
};
struct action_kw_list {
struct list list;
struct action_kw kw[VAR_ARRAY];
};
#endif /* _TYPES_ACTION_H */