MINOR: proto_htx: Add functions htx_send_name_header

It is more or less the same than legacy version but adapted to be called from
HTX analyzers. In the legacy version of this function, we switch on the HTX code
when applicable.
This commit is contained in:
Christopher Faulet 2018-10-24 21:15:35 +02:00 committed by Willy Tarreau
parent 25a02f65b1
commit 64159df1fb
3 changed files with 33 additions and 1 deletions

View File

@ -61,7 +61,6 @@ int htx_process_req_common(struct stream *s, struct channel *req, int an_bit, st
int htx_process_request(struct stream *s, struct channel *req, int an_bit);
int htx_process_tarpit(struct stream *s, struct channel *req, int an_bit);
int htx_wait_for_request_body(struct stream *s, struct channel *req, int an_bit);
int htx_send_name_header(struct http_txn *txn, struct proxy* be, const char* svr_name);
int htx_wait_for_response(struct stream *s, struct channel *rep, int an_bit);
int htx_process_res_common(struct stream *s, struct channel *rep, int an_bit, struct proxy *px);
int htx_request_forward_body(struct stream *s, struct channel *req, int an_bit);
@ -75,6 +74,7 @@ int htx_req_replace_stline(int action, const char *replace, int len,
void htx_res_set_status(unsigned int status, const char *reason, struct stream *s);
void htx_check_request_for_cacheability(struct stream *s, struct channel *req);
void htx_check_response_for_cacheability(struct stream *s, struct channel *res);
int htx_send_name_header(struct stream *s, struct proxy *be, const char *srv_name);
void htx_server_error(struct stream *s, struct stream_interface *si, int err, int finst, const struct buffer *msg);
void htx_reply_and_close(struct stream *s, short status, struct buffer *msg);

View File

@ -3683,6 +3683,8 @@ int http_send_name_header(struct stream *s, struct proxy* be, const char* srv_na
char *hdr_val;
unsigned int old_o, old_i;
if (IS_HTX_STRM(s))
return htx_send_name_header(s, be, srv_name);
ctx.idx = 0;
old_o = http_hdr_rewind(&txn->req);

View File

@ -4735,6 +4735,36 @@ void htx_check_response_for_cacheability(struct stream *s, struct channel *res)
}
}
/* send a server's name with an outgoing request over an established connection.
* Note: this function is designed to be called once the request has been
* scheduled for being forwarded. This is the reason why the number of forwarded
* bytes have to be adjusted.
*/
int htx_send_name_header(struct stream *s, struct proxy *be, const char *srv_name)
{
struct htx *htx;
struct http_hdr_ctx ctx;
struct ist hdr;
uint32_t data;
hdr = ist2(be->server_id_hdr_name, be->server_id_hdr_len);
htx = htx_from_buf(&s->req.buf);
data = htx->data;
ctx.blk = NULL;
while (http_find_header(htx, hdr, &ctx, 1))
http_remove_header(htx, &ctx);
http_add_header(htx, hdr, ist2(srv_name, strlen(srv_name)));
if (co_data(&s->req)) {
if (data >= htx->data)
c_rew(&s->req, data - htx->data);
else
c_adv(&s->req, htx->data - data);
}
return 0;
}
/* This function terminates the request because it was completly analyzed or
* because an error was triggered during the body forwarding.
*/