[MINOR] acl: add the http_req_first match
This match returns true when the request calling it is the first one of
a connection.
(cherry picked from commit 922ca979c50653c415852531f36fe409190ad76b)
diff --git a/doc/configuration.txt b/doc/configuration.txt
index d96a498..d7f81f4 100644
--- a/doc/configuration.txt
+++ b/doc/configuration.txt
@@ -7202,6 +7202,12 @@
Currently only http basic auth is supported.
+http_req_first
+ Returns true when the request being processed is the first one of the
+ connection. This can be used to add or remove headers that may be missing
+ from some requests when a request is not the first one, or even to perform
+ some specific ACL checks only on the first request.
+
method <string>
Applies to the method in the HTTP request, eg: "GET". Some predefined ACL
already check for most common methods.
diff --git a/src/proto_http.c b/src/proto_http.c
index 3003e5d..3a2be18 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -7968,6 +7968,22 @@
return 1;
}
+/* return a valid test if the current request is the first one on the connection */
+static int
+acl_fetch_http_first_req(struct proxy *px, struct session *s, void *l7, int dir,
+ struct acl_expr *expr, struct acl_test *test)
+{
+ if (!s)
+ return 0;
+
+ if (s->txn.flags & TX_NOT_FIRST)
+ test->flags |= ACL_TEST_F_SET_RES_FAIL;
+ else
+ test->flags |= ACL_TEST_F_SET_RES_PASS;
+
+ return 1;
+}
+
static int
acl_fetch_http_auth(struct proxy *px, struct session *s, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test)
@@ -8061,8 +8077,9 @@
{ "cook_pst", acl_parse_none, acl_fetch_cook, acl_match_pst },
#endif
- { "http_auth", acl_parse_nothing, acl_fetch_http_auth, acl_match_auth },
- { "http_auth_group", acl_parse_strcat, acl_fetch_http_auth, acl_match_auth },
+ { "http_auth", acl_parse_nothing, acl_fetch_http_auth, acl_match_auth, ACL_USE_L7REQ_PERMANENT },
+ { "http_auth_group", acl_parse_strcat, acl_fetch_http_auth, acl_match_auth, ACL_USE_L7REQ_PERMANENT },
+ { "http_first_req", acl_parse_nothing, acl_fetch_http_first_req, acl_match_nothing, ACL_USE_L7REQ_PERMANENT },
{ NULL, NULL, NULL, NULL },
}};