41 #include "HttpNames.h"
43 #include "EffectiveUrl.h"
50 using std::stringstream;
52 #define CACHE_CONTROL_HEADER_KEY "cache-control"
53 #define REFRESH_THRESHOLD 60
55 #define MODULE HTTP_MODULE
56 #define prolog std::string("EffectiveUrl::").append(__func__).append("() - ")
69 BESDEBUG(MODULE, prolog <<
"BEGIN" << endl);
74 get_header(CACHE_CONTROL_HEADER_KEY, cc_hdr_val, found);
76 BESDEBUG(MODULE, prolog << CACHE_CONTROL_HEADER_KEY <<
" '" << cc_hdr_val <<
"'" << endl);
79 BESDEBUG(MODULE, prolog <<
"now: " << now << endl);
82 string max_age_key(
"max-age=");
83 size_t max_age_index = cc_hdr_val.find(max_age_key);
84 if (max_age_index != cc_hdr_val.npos) {
85 string max_age_str = cc_hdr_val.substr(max_age_index + max_age_key.size());
87 std::istringstream(max_age_str) >> max_age;
88 time_t expires = ingest_time() + max_age;
89 time_t remaining = expires - now;
90 BESDEBUG(MODULE, prolog <<
"expires: " << expires <<
91 " remaining: " << remaining <<
92 " threshold: " << REFRESH_THRESHOLD << endl);
94 expired = remaining < REFRESH_THRESHOLD;
95 BESDEBUG(MODULE, prolog <<
"expired: " << (expired ?
"true" :
"false") << endl);
101 BESDEBUG(MODULE, prolog <<
"END expired: " << (expired ?
"true" :
"false") << endl);
118 auto rname_itr = d_response_header_names.rbegin();
119 auto rvalue_itr = d_response_header_values.rbegin();
120 while(!found && rname_itr != d_response_header_names.rend()){
121 string hdr_name = *rname_itr;
122 found = (lc_name == hdr_name);
137 string indent_inc =
" ";
138 string indent = indent_inc;
141 auto name_itr = d_response_header_names.begin();
142 auto value_itr = d_response_header_values.begin();
143 while(name_itr!=d_response_header_names.end()){
144 ss << indent <<
"Header: " << *name_itr <<
": " << *value_itr << endl;
158 d_resp_hdr_lines.clear();
159 d_resp_hdr_lines = resp_hdrs;
160 d_response_header_names.clear();
161 d_response_header_values.clear();
163 auto index = resp_hdrs.begin();
164 while(index!=resp_hdrs.end()){
165 size_t colon = (*index).find(
":");
166 if(colon!=(*index).npos){
167 string key((*index).substr(0,colon));
169 string value((*index).substr(colon));
170 d_response_header_names.push_back(key);
171 d_response_header_values.push_back(value);
172 BESDEBUG(MODULE, prolog <<
"Ingested header: " << key <<
": " << value <<
"(size: " << d_response_header_values.size() <<
")" << endl);
175 ERROR_LOG(prolog <<
"Encounter malformed response header! Missing ':' delimiter. SKIPPING" << endl);
static std::string lowercase(const std::string &s)
std::string dump() override
A string dump of the instance.
bool is_expired() override
Returns true if URL is reusable, false otherwise.
void get_header(const std::string &name, std::string &value, bool &found)
get the value of the named header
void ingest_response_headers(const std::vector< std::string > &resp_hdrs)
Ingests the passed response hedaers.
virtual std::string dump()
virtual bool is_expired()
utility class for the HTTP catalog module