MINOR: cache: allow caching of OPTIONS request

Allow HAProxy to cache responses to OPTIONS HTTP requests.
This is useful in the use case of "Cross-Origin Resource Sharing" (cors)
to cache CORS responses from API servers.

Since HAProxy does not support Vary header for now, this would be only
useful for "access-control-allow-origin: *" use case.
This commit is contained in:
Baptiste Assmann 2019-08-07 12:24:36 +02:00 committed by William Lallemand
parent db92a836f4
commit 1263540fe8

View File

@ -560,8 +560,8 @@ enum act_return http_action_store_cache(struct act_rule *rule, struct proxy *px,
if (!(txn->req.flags & HTTP_MSGF_VER_11)) if (!(txn->req.flags & HTTP_MSGF_VER_11))
goto out; goto out;
/* cache only GET method */ /* cache only GET or OPTIONS method */
if (txn->meth != HTTP_METH_GET) if (txn->meth != HTTP_METH_GET && txn->meth != HTTP_METH_OPTIONS)
goto out; goto out;
/* cache key was not computed */ /* cache key was not computed */
@ -1058,6 +1058,9 @@ int sha1_hosturi(struct stream *s)
ctx.blk = NULL; ctx.blk = NULL;
switch (txn->meth) { switch (txn->meth) {
case HTTP_METH_OPTIONS:
chunk_memcat(trash, "OPTIONS", 7);
break;
case HTTP_METH_HEAD: case HTTP_METH_HEAD:
case HTTP_METH_GET: case HTTP_METH_GET:
chunk_memcat(trash, "GET", 3); chunk_memcat(trash, "GET", 3);
@ -1093,10 +1096,10 @@ enum act_return http_action_req_cache_use(struct act_rule *rule, struct proxy *p
struct cache_flt_conf *cconf = rule->arg.act.p[0]; struct cache_flt_conf *cconf = rule->arg.act.p[0];
struct cache *cache = cconf->c.cache; struct cache *cache = cconf->c.cache;
/* Ignore cache for HTTP/1.0 requests and for requests other than GET /* Ignore cache for HTTP/1.0 requests and for requests other than GET,
* and HEAD */ * HEAD and OPTIONS */
if (!(txn->req.flags & HTTP_MSGF_VER_11) || if (!(txn->req.flags & HTTP_MSGF_VER_11) ||
(txn->meth != HTTP_METH_GET && txn->meth != HTTP_METH_HEAD)) (txn->meth != HTTP_METH_GET && txn->meth != HTTP_METH_HEAD && txn->meth != HTTP_METH_OPTIONS))
txn->flags |= TX_CACHE_IGNORE; txn->flags |= TX_CACHE_IGNORE;
http_check_request_for_cacheability(s, &s->req); http_check_request_for_cacheability(s, &s->req);