From: Christopher Faulet Date: Wed, 24 Oct 2018 19:15:35 +0000 (+0200) Subject: MINOR: proto_htx: Add functions htx_send_name_header X-Git-Tag: v1.9-dev7~53 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=64159df1fb4420b85e5622d6cd81eb5475e09304;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/include/proto/proto_http.h b/include/proto/proto_http.h index 2961eaee4c..40e82b2c36 100644 --- a/include/proto/proto_http.h +++ b/include/proto/proto_http.h @@ -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); diff --git a/src/proto_http.c b/src/proto_http.c index 25b85fff77..fc46826b5c 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -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); diff --git a/src/proto_htx.c b/src/proto_htx.c index 0dd17c8b86..d7dbabac9c 100644 --- a/src/proto_htx.c +++ b/src/proto_htx.c @@ -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. */