Line data Source code
1 : #include "source/common/http/date_provider_impl.h" 2 : 3 : #include <chrono> 4 : #include <string> 5 : 6 : namespace Envoy { 7 : namespace Http { 8 : namespace { 9 : 10 : class DateProviderDateFormatter : public DateFormatter { 11 : public: 12 13 : DateProviderDateFormatter() : DateFormatter("%a, %d %b %Y %H:%M:%S GMT") {} 13 : }; 14 : using DateProviderDateFormatterSingleton = ConstSingleton<DateProviderDateFormatter>; 15 : } // namespace 16 : 17 : TlsCachingDateProviderImpl::TlsCachingDateProviderImpl(Event::Dispatcher& dispatcher, 18 : ThreadLocal::SlotAllocator& tls) 19 : : DateProviderImplBase(dispatcher.timeSource()), tls_(tls.allocateSlot()), 20 105 : refresh_timer_(dispatcher.createTimer([this]() -> void { onRefreshDate(); })) { 21 : 22 96 : onRefreshDate(); 23 96 : } 24 : 25 121 : void TlsCachingDateProviderImpl::onRefreshDate() { 26 121 : std::string new_date_string = DateProviderDateFormatterSingleton::get().now(time_source_); 27 239 : tls_->set([new_date_string](Event::Dispatcher&) -> ThreadLocal::ThreadLocalObjectSharedPtr { 28 239 : return std::make_shared<ThreadLocalCachedDate>(new_date_string); 29 239 : }); 30 : 31 121 : refresh_timer_->enableTimer(std::chrono::milliseconds(500)); 32 121 : } 33 : 34 422 : void TlsCachingDateProviderImpl::setDateHeader(ResponseHeaderMap& headers) { 35 422 : headers.setDate(tls_->getTyped<ThreadLocalCachedDate>().date_string_); 36 422 : } 37 : 38 140 : void SlowDateProviderImpl::setDateHeader(ResponseHeaderMap& headers) { 39 140 : headers.setDate(DateProviderDateFormatterSingleton::get().now(time_source_)); 40 140 : } 41 : 42 : } // namespace Http 43 : } // namespace Envoy