Repository: trafficserver Updated Branches: refs/heads/master 7fa5c5c7a -> 2158d61dc
TS-2357: Add option to cache POST requests Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/2158d61d Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/2158d61d Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/2158d61d Branch: refs/heads/master Commit: 2158d61dc83d88c04204201d55d61005955c1bbd Parents: 7fa5c5c Author: Bryan Call <[email protected]> Authored: Fri Aug 8 16:00:02 2014 -0700 Committer: Bryan Call <[email protected]> Committed: Fri Aug 8 16:00:02 2014 -0700 ---------------------------------------------------------------------- CHANGES | 2 ++ mgmt/RecordsConfig.cc | 2 ++ proxy/http/HttpConfig.cc | 2 ++ proxy/http/HttpConfig.h | 2 ++ proxy/http/HttpTransact.cc | 13 +++++++------ proxy/http/HttpTransactHeaders.cc | 5 +++-- proxy/http/HttpTransactHeaders.h | 2 +- 7 files changed, 19 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2158d61d/CHANGES ---------------------------------------------------------------------- diff --git a/CHANGES b/CHANGES index a6db8d9..f3c0696 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,8 @@ -*- coding: utf-8 -*- Changes with Apache Traffic Server 5.1.0 + *) [TS-2357] Add option to cache POST requests + *) [TS-2996] Add consistent hash method to parent selection. *) [TS-2332] Add Consistent Hash class. http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2158d61d/mgmt/RecordsConfig.cc ---------------------------------------------------------------------- diff --git a/mgmt/RecordsConfig.cc b/mgmt/RecordsConfig.cc index 31890d3..3e96b6b 100644 --- a/mgmt/RecordsConfig.cc +++ b/mgmt/RecordsConfig.cc @@ -626,6 +626,8 @@ RecordElement RecordsConfig[] = { , {RECT_CONFIG, "proxy.config.http.cache.enable_default_vary_headers", RECD_INT, "0", RECU_DYNAMIC, RR_NULL, RECC_INT, "[0-1]", RECA_NULL} , + {RECT_CONFIG, "proxy.config.http.cache.post_method", RECD_INT, "0", RECU_DYNAMIC, RR_NULL, RECC_INT, "[0-1]", RECA_NULL} + , {RECT_CONFIG, "proxy.config.http.cache.max_open_read_retries", RECD_INT, "-1", RECU_NULL, RR_NULL, RECC_NULL, NULL, RECA_NULL} , {RECT_CONFIG, "proxy.config.http.cache.open_read_retry_time", RECD_INT, "10", RECU_NULL, RR_NULL, RECC_NULL, NULL, RECA_NULL} http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2158d61d/proxy/http/HttpConfig.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpConfig.cc b/proxy/http/HttpConfig.cc index beac3cf..88433a9 100644 --- a/proxy/http/HttpConfig.cc +++ b/proxy/http/HttpConfig.cc @@ -1391,6 +1391,7 @@ HttpConfig::startup() HttpEstablishStaticConfigByte(c.oride.cache_ignore_auth, "proxy.config.http.cache.ignore_authentication"); HttpEstablishStaticConfigByte(c.oride.cache_urls_that_look_dynamic, "proxy.config.http.cache.cache_urls_that_look_dynamic"); HttpEstablishStaticConfigByte(c.cache_enable_default_vary_headers, "proxy.config.http.cache.enable_default_vary_headers"); + HttpEstablishStaticConfigByte(c.cache_post_method, "proxy.config.http.cache.post_method"); HttpEstablishStaticConfigByte(c.ignore_accept_mismatch, "proxy.config.http.cache.ignore_accept_mismatch"); HttpEstablishStaticConfigByte(c.ignore_accept_language_mismatch, "proxy.config.http.cache.ignore_accept_language_mismatch"); @@ -1643,6 +1644,7 @@ HttpConfig::reconfigure() params->oride.cache_ignore_auth = INT_TO_BOOL(m_master.oride.cache_ignore_auth); params->oride.cache_urls_that_look_dynamic = INT_TO_BOOL(m_master.oride.cache_urls_that_look_dynamic); params->cache_enable_default_vary_headers = INT_TO_BOOL(m_master.cache_enable_default_vary_headers); + params->cache_post_method = INT_TO_BOOL(m_master.cache_post_method); params->ignore_accept_mismatch = m_master.ignore_accept_mismatch; params->ignore_accept_language_mismatch = m_master.ignore_accept_language_mismatch; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2158d61d/proxy/http/HttpConfig.h ---------------------------------------------------------------------- diff --git a/proxy/http/HttpConfig.h b/proxy/http/HttpConfig.h index df819db..ae670f7 100644 --- a/proxy/http/HttpConfig.h +++ b/proxy/http/HttpConfig.h @@ -707,6 +707,7 @@ public: // cache control // /////////////////// MgmtByte cache_enable_default_vary_headers; + MgmtByte cache_post_method; //////////////////////////////////////////// // CONNECT ports (used to be == ssl_ports // @@ -910,6 +911,7 @@ HttpConfigParams::HttpConfigParams() cache_vary_default_other(NULL), max_cache_open_write_retries(1), cache_enable_default_vary_headers(0), + cache_post_method(0), connect_ports_string(NULL), connect_ports(NULL), push_method_enabled(0), http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2158d61d/proxy/http/HttpTransact.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpTransact.cc b/proxy/http/HttpTransact.cc index 53b8e71..a734b92 100644 --- a/proxy/http/HttpTransact.cc +++ b/proxy/http/HttpTransact.cc @@ -454,11 +454,12 @@ do_cookies_prevent_caching(int cookies_conf, HTTPHdr* request, HTTPHdr* response inline static bool -does_method_require_cache_copy_deletion(int method) +does_method_require_cache_copy_deletion(const HttpConfigParams *http_config_param, const int method) { return ((method != HTTP_WKSIDX_GET) && (method == HTTP_WKSIDX_DELETE || method == HTTP_WKSIDX_PURGE || - method == HTTP_WKSIDX_PUT || method == HTTP_WKSIDX_POST)); + method == HTTP_WKSIDX_PUT || + (http_config_param->cache_post_method != 1 && method == HTTP_WKSIDX_POST))); } @@ -2265,7 +2266,7 @@ HttpTransact::issue_revalidate(State* s) // request to the server. is_cache_response_returnable will ensure // that we forward the request. We now specify what the cache // action should be when the response is received. - if (does_method_require_cache_copy_deletion(s->method)) { + if (does_method_require_cache_copy_deletion(s->http_config_param, s->method)) { s->cache_info.action = CACHE_PREPARE_TO_DELETE; DebugTxn("http_seq", "[HttpTransact::issue_revalidate] cache action: DELETE"); } else { @@ -3038,7 +3039,7 @@ HttpTransact::HandleCacheOpenReadMiss(State* s) } // We do a cache lookup for DELETE and PUT requests as well. // We must, however, not cache the responses to these requests. - if (does_method_require_cache_copy_deletion(s->method) && s->api_req_cacheable == false) { + if (does_method_require_cache_copy_deletion(s->http_config_param, s->method) && s->api_req_cacheable == false) { s->cache_info.action = CACHE_DO_NO_ACTION; } else if ((s->hdr_info.client_request.presence(MIME_PRESENCE_RANGE) && !s->txn_conf->cache_range_write) || s->range_setup == RANGE_NOT_SATISFIABLE || s->range_setup == RANGE_NOT_HANDLED) { @@ -5747,7 +5748,7 @@ HttpTransact::is_cache_response_returnable(State* s) return false; } - if (!HttpTransactHeaders::is_method_cacheable(s->method) && s->api_resp_cacheable == false) { + if (!HttpTransactHeaders::is_method_cacheable(s->http_config_param, s->method) && s->api_resp_cacheable == false) { SET_VIA_STRING(VIA_CACHE_RESULT, VIA_IN_CACHE_NOT_ACCEPTABLE); SET_VIA_STRING(VIA_DETAIL_CACHE_LOOKUP, VIA_DETAIL_MISS_METHOD); return false; @@ -6022,7 +6023,7 @@ HttpTransact::is_response_cacheable(State* s, HTTPHdr* request, HTTPHdr* respons // Basically, the problem is the resp for POST url1 req should not // be served to a GET url1 request, but we just match URL not method. int req_method = request->method_get_wksidx(); - if (!(HttpTransactHeaders::is_method_cacheable(req_method)) && s->api_req_cacheable == false) { + if (!(HttpTransactHeaders::is_method_cacheable(s->http_config_param, req_method)) && s->api_req_cacheable == false) { DebugTxn("http_trans", "[is_response_cacheable] " "only GET, and some HEAD and POST are cachable"); return false; } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2158d61d/proxy/http/HttpTransactHeaders.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpTransactHeaders.cc b/proxy/http/HttpTransactHeaders.cc index 51af5cc..821b36c 100644 --- a/proxy/http/HttpTransactHeaders.cc +++ b/proxy/http/HttpTransactHeaders.cc @@ -31,9 +31,10 @@ #include "I_Machine.h" bool -HttpTransactHeaders::is_method_cacheable(int method) +HttpTransactHeaders::is_method_cacheable(const HttpConfigParams *http_config_param, const int method) { - return (method == HTTP_WKSIDX_GET || method == HTTP_WKSIDX_HEAD); + return (method == HTTP_WKSIDX_GET || method == HTTP_WKSIDX_HEAD || + (http_config_param->cache_post_method == 1 && method == HTTP_WKSIDX_POST)); } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2158d61d/proxy/http/HttpTransactHeaders.h ---------------------------------------------------------------------- diff --git a/proxy/http/HttpTransactHeaders.h b/proxy/http/HttpTransactHeaders.h index 64df9bf..6170a75 100644 --- a/proxy/http/HttpTransactHeaders.h +++ b/proxy/http/HttpTransactHeaders.h @@ -32,7 +32,7 @@ class HttpTransactHeaders { public: static bool is_this_http_method_supported(int method); - static bool is_method_cacheable(int method); + static bool is_method_cacheable(const HttpConfigParams *http_config_param, const int method); static bool is_method_cache_lookupable(int method); static bool is_this_a_hop_by_hop_header(const char *field_name_wks); static bool is_this_method_supported(int the_scheme, int the_method);
