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
438
  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
9603
    : DateProviderImplBase(dispatcher.timeSource()), tls_(tls.allocateSlot()),
20
15229
      refresh_timer_(dispatcher.createTimer([this]() -> void { onRefreshDate(); })) {
21

            
22
9603
  onRefreshDate();
23
9603
}
24

            
25
19393
void TlsCachingDateProviderImpl::onRefreshDate() {
26
19393
  std::string new_date_string = DateProviderDateFormatterSingleton::get().now(time_source_);
27
38868
  tls_->set([new_date_string](Event::Dispatcher&) -> ThreadLocal::ThreadLocalObjectSharedPtr {
28
38868
    return std::make_shared<ThreadLocalCachedDate>(new_date_string);
29
38868
  });
30

            
31
19393
  refresh_timer_->enableTimer(std::chrono::milliseconds(500));
32
19393
}
33

            
34
46208
void TlsCachingDateProviderImpl::setDateHeader(ResponseHeaderMap& headers) {
35
46208
  headers.setDate(tls_->getTyped<ThreadLocalCachedDate>().date_string_);
36
46208
}
37

            
38
694
void SlowDateProviderImpl::setDateHeader(ResponseHeaderMap& headers) {
39
694
  headers.setDate(DateProviderDateFormatterSingleton::get().now(time_source_));
40
694
}
41

            
42
} // namespace Http
43
} // namespace Envoy