Line data Source code
1 : #pragma once 2 : 3 : #include <chrono> 4 : #include <memory> 5 : #include <vector> 6 : 7 : #include "envoy/common/time.h" 8 : #include "envoy/config/route/v3/route_components.pb.h" 9 : #include "envoy/http/header_map.h" 10 : #include "envoy/router/router.h" 11 : 12 : #include "source/common/protobuf/protobuf.h" 13 : 14 : #include "absl/types/optional.h" 15 : 16 : namespace Envoy { 17 : namespace Router { 18 : 19 : enum class ResetHeaderFormat { Seconds, UnixTimestamp }; 20 : 21 : /** 22 : * A ResetHeaderParser specifies a header name and a format to match against 23 : * response headers that are used to signal a rate limit interval reset, such 24 : * as Retry-After or X-RateLimit-Reset. 25 : */ 26 : class ResetHeaderParserImpl : public ResetHeaderParser { 27 : public: 28 : /** 29 : * Build a vector of ResetHeaderParserSharedPtr given input config. 30 : */ 31 : static std::vector<ResetHeaderParserSharedPtr> buildResetHeaderParserVector( 32 : const Protobuf::RepeatedPtrField<envoy::config::route::v3::RetryPolicy::ResetHeader>& 33 0 : reset_headers) { 34 0 : std::vector<ResetHeaderParserSharedPtr> ret; 35 0 : for (const auto& reset_header : reset_headers) { 36 0 : ret.emplace_back(std::make_shared<ResetHeaderParserImpl>(reset_header)); 37 0 : } 38 0 : return ret; 39 0 : } 40 : 41 : ResetHeaderParserImpl(const envoy::config::route::v3::RetryPolicy::ResetHeader& config); 42 : 43 0 : const Http::LowerCaseString& name() const { return name_; } 44 0 : ResetHeaderFormat format() const { return format_; } 45 : 46 : /** 47 : * Iterate over the headers, choose the first one that matches by name, and try to parse its 48 : * value. 49 : */ 50 : absl::optional<std::chrono::milliseconds> 51 : parseInterval(TimeSource& time_source, const Http::HeaderMap& headers) const override; 52 : 53 : private: 54 : const Http::LowerCaseString name_; 55 : ResetHeaderFormat format_; 56 : }; 57 : 58 : } // namespace Router 59 : } // namespace Envoy