};
#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_RAW 0x03 /* the reply use a raw 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 */
struct http_reply {
struct buffer obj; /* A raw string (type = HTTP_REPLY_RAW) */
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 */
- char *http_errors; /* The http-errors section to use (type = HTTP_REPLY_ERRFILES).
+ 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).
* Should be resolved during post-check */
} body;
struct list list; /* next http_reply in the global list.
s->txn->status = reply->status;
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) {
/* implicit or explicit error message*/
list_for_each_entry(http_errs, &http_errors_list, list) {
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);
- reply->body.errmsg = http_errs->errmsg[http_get_status_idx(reply->status)];
- if (!reply->body.errmsg)
+ reply->body.reply = http_errs->replies[http_get_status_idx(reply->status)];
+ if (!reply->body.reply)
ha_warning("Proxy '%s': status '%d' referenced by an http reply "
"not declared in http-errors section '%s'.\n",
px->id, reply->status, http_errs->id);