From: Christopher Faulet Date: Mon, 22 Jul 2019 14:49:30 +0000 (+0200) Subject: BUG/MINOR: http_htx: Support empty errorfiles X-Git-Tag: v2.1-dev2~287 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=90cc4811beec126c8057e3ea81899d1313090dfe;p=thirdparty%2Fhaproxy.git BUG/MINOR: http_htx: Support empty errorfiles Empty error files may be used to disable the sending of any message for specific error codes. A common use-case is to use the file "/dev/null". This way the default error message is overridden and no message is returned to the client. It was supported in the legacy HTTP mode, but not in HTX. Because of a bug, such messages triggered an error. This patch must be backported to 2.0 and 1.9. However, the patch will have to be adapted. --- diff --git a/include/proto/http_htx.h b/include/proto/http_htx.h index e33fdbec6f..26df97f27a 100644 --- a/include/proto/http_htx.h +++ b/include/proto/http_htx.h @@ -47,6 +47,6 @@ unsigned int http_get_htx_hdr(const struct htx *htx, const struct ist hdr, int occ, struct http_hdr_ctx *ctx, char **vptr, size_t *vlen); unsigned int http_get_htx_fhdr(const struct htx *htx, const struct ist hdr, int occ, struct http_hdr_ctx *ctx, char **vptr, size_t *vlen); -struct htx *http_str_to_htx(struct buffer *buf, struct ist raw); +int http_str_to_htx(struct buffer *buf, struct ist raw); #endif /* _PROTO_HTTP_HTX_H */ diff --git a/src/http_htx.c b/src/http_htx.c index 07ff191c93..7f4f7e9a6f 100644 --- a/src/http_htx.c +++ b/src/http_htx.c @@ -600,7 +600,7 @@ unsigned int http_get_htx_fhdr(const struct htx *htx, const struct ist hdr, return 1; } -struct htx *http_str_to_htx(struct buffer *buf, struct ist raw) +int http_str_to_htx(struct buffer *buf, struct ist raw) { struct htx *htx; struct htx_sl *sl; @@ -610,11 +610,17 @@ struct htx *http_str_to_htx(struct buffer *buf, struct ist raw) unsigned int flags = HTX_SL_F_IS_RESP; int ret = 0; + b_reset(buf); + if (!raw.len) { + buf->size = 0; + buf->area = malloc(raw.len); + return 1; + } + buf->size = global.tune.bufsize; buf->area = (char *)malloc(buf->size); if (!buf->area) goto error; - b_reset(buf); h1m_init_res(&h1m); h1m.flags |= H1_MF_NO_PHDR; @@ -663,12 +669,12 @@ struct htx *http_str_to_htx(struct buffer *buf, struct ist raw) if (!htx_add_endof(htx, HTX_BLK_EOM)) goto error; - return htx; + return 1; error: if (buf->size) free(buf->area); - return NULL; + return 0; } static int http_htx_init(void)