mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-23 14:51:27 +02:00
MINOR: http-htx: Use http reply from the http-errors section
When an http reply is configured to use an error message from an http-errors section, instead of referencing the error message, the http reply is used. To do so the new http reply type HTTP_REPLY_INDIRECT has been added.
This commit is contained in:
parent
40e8569676
commit
e29a97e51a
@ -47,10 +47,11 @@ struct http_reply_hdr {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define HTTP_REPLY_EMPTY 0x00 /* the reply has no payload */
|
#define HTTP_REPLY_EMPTY 0x00 /* the reply has no payload */
|
||||||
#define HTTP_REPLY_ERRMSG 0x01 /* the reply is an error message */
|
#define HTTP_REPLY_ERRMSG 0x01 /* the reply is an error message (may be NULL) */
|
||||||
#define HTTP_REPLY_ERRFILES 0x02 /* the reply references an http-errors section */
|
#define HTTP_REPLY_ERRFILES 0x02 /* the reply references an http-errors section */
|
||||||
#define HTTP_REPLY_RAW 0x03 /* the reply use a raw payload */
|
#define HTTP_REPLY_RAW 0x03 /* the reply use a raw payload */
|
||||||
#define HTTP_REPLY_LOGFMT 0x04 /* the reply use a log-format payload */
|
#define HTTP_REPLY_LOGFMT 0x04 /* the reply use a log-format payload */
|
||||||
|
#define HTTP_REPLY_INDIRECT 0x05 /* the reply references another http-reply (may be NULL) */
|
||||||
|
|
||||||
/* Uses by HAProxy to generate internal responses */
|
/* Uses by HAProxy to generate internal responses */
|
||||||
struct http_reply {
|
struct http_reply {
|
||||||
@ -63,6 +64,7 @@ struct http_reply {
|
|||||||
struct buffer obj; /* A raw string (type = HTTP_REPLY_RAW) */
|
struct buffer obj; /* A raw string (type = HTTP_REPLY_RAW) */
|
||||||
struct buffer *errmsg; /* The error message to use as response (type = HTTP_REPLY_ERRMSG).
|
struct buffer *errmsg; /* The error message to use as response (type = HTTP_REPLY_ERRMSG).
|
||||||
* may be NULL, if so rely on the proxy error messages */
|
* may be NULL, if so rely on the proxy error messages */
|
||||||
|
struct http_reply *reply; /* The HTTP reply to use as response (type = HTTP_REPLY_INDIRECT) */
|
||||||
char *http_errors; /* The http-errors section to use (type = HTTP_REPLY_ERRFILES).
|
char *http_errors; /* The http-errors section to use (type = HTTP_REPLY_ERRFILES).
|
||||||
* Should be resolved during post-check */
|
* Should be resolved during post-check */
|
||||||
} body;
|
} body;
|
||||||
|
@ -4708,7 +4708,18 @@ int http_reply_message(struct stream *s, struct http_reply *reply)
|
|||||||
s->txn->status = reply->status;
|
s->txn->status = reply->status;
|
||||||
channel_htx_truncate(res, htx);
|
channel_htx_truncate(res, htx);
|
||||||
|
|
||||||
/* HTTP_REPLY_ERRFILES unexpected here. handled as no payload if so */
|
/*
|
||||||
|
* - HTTP_REPLY_ERRFILES unexpected here. handled as no payload if so
|
||||||
|
*
|
||||||
|
* - HTTP_REPLY_INDIRECT: switch on another reply if defined or handled
|
||||||
|
* as no payload if NULL. the TXN status code is set with the status
|
||||||
|
* of the original reply.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (reply->type == HTTP_REPLY_INDIRECT) {
|
||||||
|
if (reply->body.reply)
|
||||||
|
reply = reply->body.reply;
|
||||||
|
}
|
||||||
|
|
||||||
if (reply->type == HTTP_REPLY_ERRMSG) {
|
if (reply->type == HTTP_REPLY_ERRMSG) {
|
||||||
/* implicit or explicit error message*/
|
/* implicit or explicit error message*/
|
||||||
|
@ -1278,10 +1278,10 @@ int http_check_http_reply(struct http_reply *reply, struct proxy *px, char **err
|
|||||||
|
|
||||||
list_for_each_entry(http_errs, &http_errors_list, list) {
|
list_for_each_entry(http_errs, &http_errors_list, list) {
|
||||||
if (strcmp(http_errs->id, reply->body.http_errors) == 0) {
|
if (strcmp(http_errs->id, reply->body.http_errors) == 0) {
|
||||||
reply->type = HTTP_REPLY_ERRMSG;
|
reply->type = HTTP_REPLY_INDIRECT;
|
||||||
free(reply->body.http_errors);
|
free(reply->body.http_errors);
|
||||||
reply->body.errmsg = http_errs->errmsg[http_get_status_idx(reply->status)];
|
reply->body.reply = http_errs->replies[http_get_status_idx(reply->status)];
|
||||||
if (!reply->body.errmsg)
|
if (!reply->body.reply)
|
||||||
ha_warning("Proxy '%s': status '%d' referenced by an http reply "
|
ha_warning("Proxy '%s': status '%d' referenced by an http reply "
|
||||||
"not declared in http-errors section '%s'.\n",
|
"not declared in http-errors section '%s'.\n",
|
||||||
px->id, reply->status, http_errs->id);
|
px->id, reply->status, http_errs->id);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user