]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[MINOR] acl: add the http_req_first match
authorWilly Tarreau <w@1wt.eu>
Fri, 22 Oct 2010 18:04:13 +0000 (20:04 +0200)
committerWilly Tarreau <w@1wt.eu>
Sat, 30 Oct 2010 17:04:35 +0000 (19:04 +0200)
This match returns true when the request calling it is the first one of
a connection.
(cherry picked from commit 922ca979c50653c415852531f36fe409190ad76b)

doc/configuration.txt
src/proto_http.c

index d96a4981aac92b93a149abdde2819e9070c4a49b..d7f81f4e9027cb7a169c57263236bbefb3063d69 100644 (file)
@@ -7202,6 +7202,12 @@ http_auth_group(userlist) <group> [<group>]*
 
   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.
index 3003e5d09f0a0a70e0c72f880ce8cac9d06ceab6..3a2be18f7532f03c6bf3ab585bf822b7f279ee30 100644 (file)
@@ -7968,6 +7968,22 @@ acl_fetch_proto_http(struct proxy *px, struct session *s, void *l7, int dir,
        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 @@ static struct acl_kw_list acl_kws = {{ },{
        { "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 },
 }};