diff --git a/src/proto_http.c b/src/proto_http.c index 9fe10392a..3cd97fe82 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -2866,7 +2866,7 @@ int process_srv(struct session *t) * Cache-Control or Expires header fields." */ if (likely(txn->meth != HTTP_METH_POST) && - unlikely(t->be->options & PR_O_CHK_CACHE)) + (t->be->options & (PR_O_CHK_CACHE|PR_O_COOK_NOC))) txn->flags |= TX_CACHEABLE | TX_CACHE_COOK; break; default: @@ -3003,8 +3003,15 @@ int process_srv(struct session *t) */ manage_server_side_cookies(t, rep); + /* - * 5: add server cookie in the response if needed + * 5: check for cache-control or pragma headers. + */ + check_response_for_cacheability(t, rep); + + + /* + * 6: add server cookie in the response if needed */ if ((t->srv) && !(t->flags & SN_DIRECT) && (t->be->options & PR_O_COOK_INS) && (!(t->be->options & PR_O_COOK_POST) || (txn->meth == HTTP_METH_POST))) { @@ -3029,7 +3036,10 @@ int process_srv(struct session *t) * Some caches understand the correct form: 'no-cache="set-cookie"', but * others don't (eg: apache <= 1.3.26). So we use 'private' instead. */ - if (t->be->options & PR_O_COOK_NOC) { + if ((t->be->options & PR_O_COOK_NOC) && (txn->flags & TX_CACHEABLE)) { + + txn->flags &= ~TX_CACHEABLE & ~TX_CACHE_COOK; + if (unlikely(http_header_add_tail2(rep, &txn->rsp, &txn->hdr_idx, "Cache-control: private", 22)) < 0) goto return_bad_resp; @@ -3037,12 +3047,6 @@ int process_srv(struct session *t) } - /* - * 6: check for cache-control or pragma headers. - */ - check_response_for_cacheability(t, rep); - - /* * 7: check if result will be cacheable with a cookie. * We'll block the response if security checks have caught