haproxy/include/haproxy/http_ext-t.h
Aurelien DARRAGON b2e2ec51b3 MEDIUM: proxy/http_ext: implement dynamic http_ext
proxy http-only options implemented in http_ext were statically stored
within proxy struct.

We're making some changes so that http_ext are now stored in a dynamically
allocated structs.
http_ext related structs are only allocated when needed to save some space
whenever possible, and they are automatically freed upon proxy deletion.

Related PX_O_HTTP{7239,XFF,XOT) option flags were removed because we're now
considering an http_ext option as 'active' if it is allocated (ptr is not NULL)

A few checks (and BUG_ON) were added to make these changes safe because
it adds some (acceptable) complexity to the previous design.

Also, proxy.http was renamed to proxy.http_ext to make things more explicit.
2023-01-27 15:18:59 +01:00

150 lines
4.0 KiB
C

/*
* include/haproxy/http_ext-t.h
* Version-agnostic and implementation-agnostic HTTP extensions definitions
*
* Copyright 2022 HAProxy Technologies
*
* 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_HTTPEXT_T_H
#define _HAPROXY_HTTPEXT_T_H
#include <arpa/inet.h>
#include <import/ist.h>
#include <haproxy/tools-t.h>
enum forwarded_header_attribute_type {
FORWARDED_HEADER_UNK = 0,
FORWARDED_HEADER_OBFS = 1,
FORWARDED_HEADER_PORT = 2,
FORWARDED_HEADER_IP = 3,
};
struct forwarded_header_nodename {
union {
struct sockaddr_storage ip;
struct ist obfs;
};
enum forwarded_header_attribute_type type;
};
struct forwarded_header_nodeport {
union {
uint16_t port;
struct ist obfs;
};
enum forwarded_header_attribute_type type;
};
struct forwarded_header_node {
struct forwarded_header_nodename nodename;
struct forwarded_header_nodeport nodeport;
struct ist raw;
};
enum forwarded_header_proto {
FORWARDED_HEADER_HTTP = 1,
FORWARDED_HEADER_HTTPS = 2
};
struct forwarded_header_ctx {
struct forwarded_header_node nfor;
struct forwarded_header_node nby;
struct ist host;
enum forwarded_header_proto proto;
};
enum http_ext_7239_forby_mode {
HTTP_7239_FORBY_ORIG = 1,
HTTP_7239_FORBY_SMP = 2
};
struct http_ext_7239_forby {
/* nn = nodename, np = nodeport */
union {
char *nn_expr_s;
struct sample_expr *nn_expr;
};
union {
char *np_expr_s;
struct sample_expr *np_expr;
};
enum http_ext_7239_forby_mode nn_mode;
enum http_ext_7239_forby_mode np_mode;
};
enum http_ext_7239_host_mode {
HTTP_7239_HOST_ORIG = 1,
HTTP_7239_HOST_SMP = 2
};
struct http_ext_7239_host {
union {
char *expr_s;
struct sample_expr *expr;
};
enum http_ext_7239_host_mode mode;
};
struct http_ext_7239 {
/* forwarded header parameters options */
struct http_ext_7239_forby p_for;
struct http_ext_7239_forby p_by;
struct http_ext_7239_host p_host;
uint8_t p_proto;
/* config error hints, used only during configuration parsing */
char *c_file;
int c_line;
int c_mode; /* 0: parsed, 1: compiled */
};
enum forwarded_header_field {
FORWARDED_HEADER_FOR = 0x01,
FORWARDED_HEADER_BY = 0x02,
FORWARDED_HEADER_HOST = 0x04,
FORWARDED_HEADER_PROTO = 0x08,
FORWARDED_HEADER_ALL = FORWARDED_HEADER_FOR|FORWARDED_HEADER_BY|FORWARDED_HEADER_HOST|FORWARDED_HEADER_PROTO
};
enum http_ext_xff_mode {
HTTP_XFF_IFNONE = 0, /* set if not already set */
HTTP_XFF_ALWAYS = 1 /* always set x-forwarded-for */
};
struct http_ext_xff {
struct ist hdr_name; /* header to use - default: "x-forwarded-for" */
struct net_addr except_net; /* don't forward x-forward-for for this address. */
uint8_t mode;
};
struct http_ext_xot {
struct ist hdr_name; /* header to use - default: "x-original-to" */
struct net_addr except_net; /* don't forward x-original-to for this address. */
};
/* http_ext options */
struct http_ext {
/* forwarded header (RFC 7239) */
struct http_ext_7239 *fwd;
/* x-forward-for:
* conditionally insert x-forwarded-for with client address
*/
struct http_ext_xff *xff;
/* x-original-to:
* insert x-original-to with destination address
*/
struct http_ext_xot *xot;
};
#endif /* !_HAPROXY_HTTPEXT_T_H */