MINOR: connection: support PROXY v2 TLV emission without stream
Update API for PROXY protocol header encoding. Previously, it requires stream parameter to be set. Change make_proxy_line() and associated functions to add an extra session parameter. This is useful in context where no stream is instantiated. For example, this is the case for rhttp preconnect. This change allows to extend PROXY v2 TLV encoding. Replace build_logline() which requires a stream instance and call directly sess_build_logline(). Note that stream parameter is kept as it is necessary for unique ID encoding. This change has no functional change for standard connections. However, it is necessary to support TLV encoding on rhttp preconnect.
This commit is contained in:
parent
7a81bfc8d2
commit
60496e884e
@ -53,7 +53,7 @@ extern struct mux_stopping_data mux_stopping_data[MAX_THREADS];
|
||||
/* receive a PROXY protocol header over a connection */
|
||||
int conn_recv_proxy(struct connection *conn, int flag);
|
||||
int conn_send_proxy(struct connection *conn, unsigned int flag);
|
||||
int make_proxy_line(char *buf, int buf_len, struct server *srv, struct connection *remote, struct stream *strm);
|
||||
int make_proxy_line(char *buf, int buf_len, struct server *srv, struct connection *remote, struct stream *strm, struct session *sess);
|
||||
struct conn_tlv_list *conn_get_tlv(struct connection *conn, int type);
|
||||
|
||||
int conn_append_debug_info(struct buffer *buf, const struct connection *conn, const char *pfx);
|
||||
|
@ -1424,7 +1424,7 @@ int connect_server(struct stream *s)
|
||||
|
||||
/* 5. proxy protocol */
|
||||
if (srv && srv->pp_opts) {
|
||||
proxy_line_ret = make_proxy_line(trash.area, trash.size, srv, cli_conn, s);
|
||||
proxy_line_ret = make_proxy_line(trash.area, trash.size, srv, cli_conn, s, strm_sess(s));
|
||||
if (proxy_line_ret) {
|
||||
hash_params.proxy_prehash =
|
||||
conn_hash_prehash(trash.area, proxy_line_ret);
|
||||
|
@ -1321,10 +1321,11 @@ int conn_send_proxy(struct connection *conn, unsigned int flag)
|
||||
*/
|
||||
|
||||
if (sc && sc_strm(sc)) {
|
||||
struct stream *strm = __sc_strm(sc);
|
||||
ret = make_proxy_line(trash.area, trash.size,
|
||||
objt_server(conn->target),
|
||||
sc_conn(sc_opposite(sc)),
|
||||
__sc_strm(sc));
|
||||
strm, strm_sess(strm));
|
||||
}
|
||||
else {
|
||||
/* The target server expects a LOCAL line to be sent first. Retrieving
|
||||
@ -1335,7 +1336,7 @@ int conn_send_proxy(struct connection *conn, unsigned int flag)
|
||||
|
||||
ret = make_proxy_line(trash.area, trash.size,
|
||||
objt_server(conn->target), conn,
|
||||
NULL);
|
||||
NULL, conn->owner);
|
||||
}
|
||||
|
||||
if (!ret)
|
||||
@ -1941,7 +1942,7 @@ static int make_tlv(char *dest, int dest_len, char type, uint16_t length, const
|
||||
}
|
||||
|
||||
/* Note: <remote> is explicitly allowed to be NULL */
|
||||
static int make_proxy_line_v2(char *buf, int buf_len, struct server *srv, struct connection *remote, struct stream *strm)
|
||||
static int make_proxy_line_v2(char *buf, int buf_len, struct server *srv, struct connection *remote, struct stream *strm, struct session *sess)
|
||||
{
|
||||
const char pp2_signature[] = PP2_SIGNATURE;
|
||||
void *tlv_crc32c_p = NULL;
|
||||
@ -2022,7 +2023,7 @@ static int make_proxy_line_v2(char *buf, int buf_len, struct server *srv, struct
|
||||
}
|
||||
}
|
||||
|
||||
if (strm) {
|
||||
if (sess) {
|
||||
struct buffer *replace = NULL;
|
||||
|
||||
list_for_each_entry(srv_tlv, &srv->pp_tlvs, list) {
|
||||
@ -2036,7 +2037,7 @@ static int make_proxy_line_v2(char *buf, int buf_len, struct server *srv, struct
|
||||
if (unlikely(!replace))
|
||||
return 0;
|
||||
|
||||
replace->data = build_logline(strm, replace->area, replace->size, &srv_tlv->fmt);
|
||||
replace->data = sess_build_logline(sess, strm, replace->area, replace->size, &srv_tlv->fmt);
|
||||
|
||||
if (unlikely((buf_len - ret) < sizeof(struct tlv))) {
|
||||
free_trash_chunk(replace);
|
||||
@ -2179,12 +2180,12 @@ static int make_proxy_line_v2(char *buf, int buf_len, struct server *srv, struct
|
||||
}
|
||||
|
||||
/* Note: <remote> is explicitly allowed to be NULL */
|
||||
int make_proxy_line(char *buf, int buf_len, struct server *srv, struct connection *remote, struct stream *strm)
|
||||
int make_proxy_line(char *buf, int buf_len, struct server *srv, struct connection *remote, struct stream *strm, struct session *sess)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (srv && (srv->pp_opts & SRV_PP_V2)) {
|
||||
ret = make_proxy_line_v2(buf, buf_len, srv, remote, strm);
|
||||
ret = make_proxy_line_v2(buf, buf_len, srv, remote, strm, sess);
|
||||
}
|
||||
else {
|
||||
const struct sockaddr_storage *src = NULL;
|
||||
|
Loading…
x
Reference in New Issue
Block a user