You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2020/05/12 16:31:20 UTC
[trafficserver] branch master updated: Add
HttpTransact::get_max_age and TSHttpTxnGetMaxAge
This is an automated email from the ASF dual-hosted git repository.
zwoop pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push:
new 4575058 Add HttpTransact::get_max_age and TSHttpTxnGetMaxAge
4575058 is described below
commit 4575058101fea8ff4d854415d7d580e05f58131b
Author: Emanuele Rocca <em...@wikimedia.org>
AuthorDate: Fri May 1 13:02:18 2020 +0200
Add HttpTransact::get_max_age and TSHttpTxnGetMaxAge
Add a new function called HttpTransact::get_max_age based on the logic
in HttpTransact::calculate_document_freshness_limit that extracts
max_age depending on s-maxage and max-age. Expose the function as
TSHttpTxnGetMaxAge.
---
include/ts/ts.h | 12 ++++++++++++
proxy/http/HttpTransact.cc | 31 +++++++++++++++++++++----------
proxy/http/HttpTransact.h | 1 +
src/traffic_server/InkAPI.cc | 24 ++++++++++++++++++++++++
4 files changed, 58 insertions(+), 10 deletions(-)
diff --git a/include/ts/ts.h b/include/ts/ts.h
index 0cfa624..21c3ec6 100644
--- a/include/ts/ts.h
+++ b/include/ts/ts.h
@@ -2453,6 +2453,18 @@ tsapi TSReturnCode TSHttpTxnMilestoneGet(TSHttpTxn txnp, TSMilestonesType milest
tsapi int TSHttpTxnIsCacheable(TSHttpTxn txnp, TSMBuffer request, TSMBuffer response);
/**
+ Get the maximum age in seconds as indicated by the origin server.
+ This would typically be used in TS_HTTP_READ_RESPONSE_HDR_HOOK, when you have
+ the server response ready.
+
+ @param txnp the transaction pointer
+ @param response the server response header. If NULL, use the transactions origin response.
+
+ @return the age in seconds if specified by Cache-Control, -1 otherwise
+*/
+tsapi int TSHttpTxnGetMaxAge(TSHttpTxn txnp, TSMBuffer response);
+
+/**
Return a string representation for a TSServerState value. This is useful for plugin debugging.
@param state the value of this TSServerState
diff --git a/proxy/http/HttpTransact.cc b/proxy/http/HttpTransact.cc
index 026870a..a41e389 100644
--- a/proxy/http/HttpTransact.cc
+++ b/proxy/http/HttpTransact.cc
@@ -7143,25 +7143,36 @@ HttpTransact::does_client_request_permit_storing(CacheControlResult *c, HTTPHdr
}
int
+HttpTransact::get_max_age(HTTPHdr *response)
+{
+ int max_age = -1;
+ uint32_t cc_mask = response->get_cooked_cc_mask();
+
+ if (cc_mask & MIME_COOKED_MASK_CC_S_MAXAGE) {
+ // Precedence to s-maxage
+ max_age = static_cast<int>(response->get_cooked_cc_s_maxage());
+ } else if (cc_mask & MIME_COOKED_MASK_CC_MAX_AGE) {
+ // If s-maxage isn't set, try max-age
+ max_age = static_cast<int>(response->get_cooked_cc_max_age());
+ }
+
+ return max_age;
+}
+
+int
HttpTransact::calculate_document_freshness_limit(State *s, HTTPHdr *response, time_t response_date, bool *heuristic)
{
bool expires_set, date_set, last_modified_set;
time_t date_value, expires_value, last_modified_value;
MgmtInt min_freshness_bounds, max_freshness_bounds;
int freshness_limit = 0;
- uint32_t cc_mask = response->get_cooked_cc_mask();
+ int max_age = get_max_age(response);
*heuristic = false;
- if (cc_mask & (MIME_COOKED_MASK_CC_S_MAXAGE | MIME_COOKED_MASK_CC_MAX_AGE)) {
- if (cc_mask & MIME_COOKED_MASK_CC_S_MAXAGE) {
- freshness_limit = static_cast<int>(response->get_cooked_cc_s_maxage());
- TxnDebug("http_match", "calculate_document_freshness_limit --- s_max_age set, freshness_limit = %d", freshness_limit);
- } else if (cc_mask & MIME_COOKED_MASK_CC_MAX_AGE) {
- freshness_limit = static_cast<int>(response->get_cooked_cc_max_age());
- TxnDebug("http_match", "calculate_document_freshness_limit --- max_age set, freshness_limit = %d", freshness_limit);
- }
- freshness_limit = std::min(std::max(0, freshness_limit), static_cast<int>(s->txn_conf->cache_guaranteed_max_lifetime));
+ if (max_age >= 0) {
+ freshness_limit = std::min(std::max(0, max_age), static_cast<int>(s->txn_conf->cache_guaranteed_max_lifetime));
+ TxnDebug("http_match", "calculate_document_freshness_limit --- freshness_limit = %d", freshness_limit);
} else {
date_set = last_modified_set = false;
diff --git a/proxy/http/HttpTransact.h b/proxy/http/HttpTransact.h
index e8d1415..5230cd3 100644
--- a/proxy/http/HttpTransact.h
+++ b/proxy/http/HttpTransact.h
@@ -1037,6 +1037,7 @@ public:
static void handle_request_keep_alive_headers(State *s, HTTPVersion ver, HTTPHdr *heads);
static void handle_response_keep_alive_headers(State *s, HTTPVersion ver, HTTPHdr *heads);
+ static int get_max_age(HTTPHdr *response);
static int calculate_document_freshness_limit(State *s, HTTPHdr *response, time_t response_date, bool *heuristic);
static Freshness_t what_is_document_freshness(State *s, HTTPHdr *client_request, HTTPHdr *cached_obj_response);
static Authentication_t AuthenticationNeeded(const OverridableHttpConfigParams *p, HTTPHdr *client_request,
diff --git a/src/traffic_server/InkAPI.cc b/src/traffic_server/InkAPI.cc
index 1efa887..41fddf8 100644
--- a/src/traffic_server/InkAPI.cc
+++ b/src/traffic_server/InkAPI.cc
@@ -8950,6 +8950,30 @@ TSHttpTxnIsCacheable(TSHttpTxn txnp, TSMBuffer request, TSMBuffer response)
return (req->valid() && resp->valid() && HttpTransact::is_response_cacheable(&(sm->t_state), req, resp)) ? 1 : 0;
}
+int
+TSHttpTxnGetMaxAge(TSHttpTxn txnp, TSMBuffer response)
+{
+ sdk_assert(sdk_sanity_check_txn(txnp) == TS_SUCCESS);
+ HttpSM *sm = (HttpSM *)txnp;
+ HTTPHdr *resp;
+
+ if (response) {
+ // Make sure the response we got as a parameter is valid
+ sdk_assert(sdk_sanity_check_mbuffer(response) == TS_SUCCESS);
+ resp = reinterpret_cast<HTTPHdr *>(response);
+ } else {
+ // Use the transactions origin response if the user passed NULL
+ resp = &(sm->t_state.hdr_info.server_response);
+ }
+
+ if (!resp || !resp->valid()) {
+ return -1;
+ }
+
+ // We have a valid response, return max_age
+ return HttpTransact::get_max_age(resp);
+}
+
// Lookup various debug names for common HTTP types.
const char *
TSHttpServerStateNameLookup(TSServerState state)