43#include "EffectiveUrl.h"
50using std::stringstream;
52#define CACHE_CONTROL_HEADER_KEY "cache-control"
54#define MODULE HTTP_MODULE
55#define prolog std::string("EffectiveUrl::").append(__func__).append("() - ")
59EffectiveUrl::EffectiveUrl() :
http::url(
""), d_response_header_names(), d_response_header_values() {
60 BESDEBUG(HTTP_MODULE, prolog <<
"created: " << ingest_time() << endl);
69 bool EffectiveUrl::is_expired() {
71 BESDEBUG(MODULE, prolog <<
"BEGIN" << endl);
76 auto now = std::chrono::system_clock::now();
77 auto now_secs = std::chrono::time_point_cast<std::chrono::seconds>(now);
78 BESDEBUG(MODULE, prolog <<
"now_secs: " << now_secs.time_since_epoch().count() << endl);
80 get_header(CACHE_CONTROL_HEADER_KEY, cc_hdr_val, found);
82 BESDEBUG(MODULE, prolog << CACHE_CONTROL_HEADER_KEY <<
" '" << cc_hdr_val <<
"'" << endl);
85 string max_age_key(
"max-age=");
86 size_t max_age_index = cc_hdr_val.find(max_age_key);
87 if (max_age_index != cc_hdr_val.npos) {
88 string max_age_str = cc_hdr_val.substr(max_age_index + max_age_key.size());
90 std::istringstream(max_age_str) >> msi;
91 std::chrono::seconds max_age(msi);
92 auto itime = std::chrono::system_clock::from_time_t(ingest_time());
93 auto expires_time = std::chrono::time_point_cast<std::chrono::seconds>(itime + max_age);
94 expired = now_secs > expires_time;
96 BESDEBUG(MODULE, prolog <<
"expires_time: " << expires_time.time_since_epoch().count() <<
97 " threshold: " << HTTP_URL_REFRESH_THRESHOLD << endl);
99 BESDEBUG(MODULE, prolog <<
"expired: " << (expired ?
"true" :
"false") << endl);
103 expired = url::is_expired();
105 BESDEBUG(MODULE, prolog <<
"END expired: " << (expired ?
"true" :
"false") << endl);
119 void EffectiveUrl::get_header(
const std::string &name, std::string &value,
bool &found ) {
122 auto rname_itr = d_response_header_names.rbegin();
123 auto rvalue_itr = d_response_header_values.rbegin();
124 while(!found && rname_itr != d_response_header_names.rend()){
125 string hdr_name = *rname_itr;
126 found = (lc_name == hdr_name);
139 string EffectiveUrl::dump(){
141 string indent_inc =
" ";
142 string indent = indent_inc;
145 auto name_itr = d_response_header_names.begin();
146 auto value_itr = d_response_header_values.begin();
147 while(name_itr!=d_response_header_names.end()){
148 ss << indent <<
"Header: " << *name_itr <<
": " << *value_itr << endl;
160 void EffectiveUrl::ingest_response_headers(
const vector<string> &resp_hdrs)
162 d_resp_hdr_lines.clear();
163 d_resp_hdr_lines = resp_hdrs;
164 d_response_header_names.clear();
165 d_response_header_values.clear();
167 auto index = resp_hdrs.begin();
168 while(index!=resp_hdrs.end()){
169 size_t colon = (*index).find(
":");
170 if(colon!=(*index).npos){
171 string key((*index).substr(0,colon));
173 string value((*index).substr(colon));
174 d_response_header_names.push_back(key);
175 d_response_header_values.push_back(value);
176 BESDEBUG(MODULE, prolog <<
"Ingested header: " << key <<
": " << value <<
"(size: " << d_response_header_values.size() <<
")" << endl);
179 ERROR_LOG(prolog <<
"Encounter malformed response header! Missing ':' delimiter. SKIPPING" << endl);
static std::string lowercase(const std::string &s)
utility class for the HTTP catalog module