mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-11 01:26:58 +02:00
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.
150 lines
4.0 KiB
C
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 */
|