@@ -122,6 +122,13 @@ class FilterCallbacks {
122122 * Clear the route cache explicitly.
123123 */
124124 virtual void clearRouteCache () PURE;
125+
126+ /* *
127+ * @return const ProtobufWkt::Struct& the filter context from the most specific filter config
128+ * from the route or virtual host. Empty struct will be returned if no route or virtual host is
129+ * found.
130+ */
131+ virtual const ProtobufWkt::Struct& filterContext () const PURE;
125132};
126133
127134class Filter ;
@@ -194,7 +201,8 @@ class StreamHandleWrapper : public Filters::Common::Lua::BaseLuaObject<StreamHan
194201 {" timestampString" , static_luaTimestampString},
195202 {" connectionStreamInfo" , static_luaConnectionStreamInfo},
196203 {" setUpstreamOverrideHost" , static_luaSetUpstreamOverrideHost},
197- {" clearRouteCache" , static_luaClearRouteCache}};
204+ {" clearRouteCache" , static_luaClearRouteCache},
205+ {" filterContext" , static_luaFilterContext}};
198206 }
199207
200208private:
@@ -326,6 +334,11 @@ class StreamHandleWrapper : public Filters::Common::Lua::BaseLuaObject<StreamHan
326334 */
327335 DECLARE_LUA_FUNCTION (StreamHandleWrapper, luaClearRouteCache);
328336
337+ /* *
338+ * Get the filter context.
339+ */
340+ DECLARE_LUA_FUNCTION (StreamHandleWrapper, luaFilterContext);
341+
329342 enum Timestamp::Resolution getTimestampResolution (absl::string_view unit_parameter);
330343
331344 int doHttpCall (lua_State* state, const HttpCallOptions& options);
@@ -345,6 +358,7 @@ class StreamHandleWrapper : public Filters::Common::Lua::BaseLuaObject<StreamHan
345358 body_wrapper_.reset ();
346359 trailers_wrapper_.reset ();
347360 metadata_wrapper_.reset ();
361+ filter_context_wrapper_.reset ();
348362 stream_info_wrapper_.reset ();
349363 connection_wrapper_.reset ();
350364 public_key_wrapper_.reset ();
@@ -372,6 +386,8 @@ class StreamHandleWrapper : public Filters::Common::Lua::BaseLuaObject<StreamHan
372386 Filters::Common::Lua::LuaDeathRef<Filters::Common::Lua::BufferWrapper> body_wrapper_;
373387 Filters::Common::Lua::LuaDeathRef<HeaderMapWrapper> trailers_wrapper_;
374388 Filters::Common::Lua::LuaDeathRef<Filters::Common::Lua::MetadataMapWrapper> metadata_wrapper_;
389+ Filters::Common::Lua::LuaDeathRef<Filters::Common::Lua::MetadataMapWrapper>
390+ filter_context_wrapper_;
375391 Filters::Common::Lua::LuaDeathRef<StreamInfoWrapper> stream_info_wrapper_;
376392 Filters::Common::Lua::LuaDeathRef<ConnectionStreamInfoWrapper> connection_stream_info_wrapper_;
377393 Filters::Common::Lua::LuaDeathRef<Filters::Common::Lua::ConnectionWrapper> connection_wrapper_;
@@ -446,43 +462,17 @@ class FilterConfigPerRoute : public Router::RouteSpecificFilterConfig {
446462 Server::Configuration::ServerFactoryContext& context);
447463
448464 bool disabled () const { return disabled_; }
449- const std::string& name () const { return name_; }
465+ absl::string_view name () const { return name_; }
450466 PerLuaCodeSetup* perLuaCodeSetup () const { return per_lua_code_setup_ptr_.get (); }
467+ const ProtobufWkt::Struct& filterContext () const { return filter_context_; }
451468
452469private:
453470 const bool disabled_;
454471 const std::string name_;
455472 PerLuaCodeSetupPtr per_lua_code_setup_ptr_;
473+ const ProtobufWkt::Struct filter_context_;
456474};
457475
458- namespace {
459-
460- PerLuaCodeSetup* getPerLuaCodeSetup (const FilterConfig* filter_config,
461- Http::StreamFilterCallbacks* callbacks) {
462- const FilterConfigPerRoute* config_per_route = nullptr ;
463- if (callbacks && callbacks->route ()) {
464- config_per_route =
465- Http::Utility::resolveMostSpecificPerFilterConfig<FilterConfigPerRoute>(callbacks);
466- }
467-
468- if (config_per_route != nullptr ) {
469- if (config_per_route->disabled ()) {
470- return nullptr ;
471- }
472- if (!config_per_route->name ().empty ()) {
473- ASSERT (filter_config);
474- return filter_config->perLuaCodeSetup (config_per_route->name ());
475- }
476- return config_per_route->perLuaCodeSetup ();
477- }
478- ASSERT (filter_config);
479- return filter_config->perLuaCodeSetup ();
480- }
481-
482- } // namespace
483-
484- // TODO(mattklein123): Filter stats.
485-
486476/* *
487477 * The HTTP Lua filter. Allows scripts to run in both the request an response flow.
488478 */
@@ -500,7 +490,7 @@ class Filter : public Http::StreamFilter, private Filters::Common::Lua::LuaLogga
500490 // Http::StreamDecoderFilter
501491 Http::FilterHeadersStatus decodeHeaders (Http::RequestHeaderMap& headers,
502492 bool end_stream) override {
503- PerLuaCodeSetup* setup = getPerLuaCodeSetup (config_. get (), decoder_callbacks_. callbacks_ );
493+ PerLuaCodeSetup* setup = getPerLuaCodeSetup ();
504494 const int function_ref = setup ? setup->requestFunctionRef () : LUA_REFNIL;
505495 return doHeaders (request_stream_wrapper_, request_coroutine_, decoder_callbacks_, function_ref,
506496 setup, headers, end_stream);
@@ -521,7 +511,7 @@ class Filter : public Http::StreamFilter, private Filters::Common::Lua::LuaLogga
521511 }
522512 Http::FilterHeadersStatus encodeHeaders (Http::ResponseHeaderMap& headers,
523513 bool end_stream) override {
524- PerLuaCodeSetup* setup = getPerLuaCodeSetup (config_. get (), decoder_callbacks_. callbacks_ );
514+ PerLuaCodeSetup* setup = getPerLuaCodeSetup ();
525515 const int function_ref = setup ? setup->responseFunctionRef () : LUA_REFNIL;
526516 return doHeaders (response_stream_wrapper_, response_coroutine_, encoder_callbacks_,
527517 function_ref, setup, headers, end_stream);
@@ -574,6 +564,7 @@ class Filter : public Http::StreamFilter, private Filters::Common::Lua::LuaLogga
574564 cb->clearRouteCache ();
575565 }
576566 }
567+ const ProtobufWkt::Struct& filterContext () const override { return parent_.filterContext (); }
577568
578569 Filter& parent_;
579570 Http::StreamDecoderFilterCallbacks* callbacks_{};
@@ -602,13 +593,43 @@ class Filter : public Http::StreamFilter, private Filters::Common::Lua::LuaLogga
602593 UNREFERENCED_PARAMETER (host_and_strict);
603594 }
604595 void clearRouteCache () override {}
596+ const ProtobufWkt::Struct& filterContext () const override { return parent_.filterContext (); }
605597
606598 Filter& parent_;
607599 Http::StreamEncoderFilterCallbacks* callbacks_{};
608600 };
609601
610602 using StreamHandleRef = Filters::Common::Lua::LuaDeathRef<StreamHandleWrapper>;
611603
604+ PerLuaCodeSetup* getPerLuaCodeSetup () {
605+ if (decoder_callbacks_.callbacks_ != nullptr ) {
606+ per_route_config_ = Http::Utility::resolveMostSpecificPerFilterConfig<FilterConfigPerRoute>(
607+ decoder_callbacks_.callbacks_ );
608+ }
609+
610+ if (per_route_config_ != nullptr ) {
611+ // The filter is disabled by the route configuration explicitly.
612+ if (per_route_config_->disabled ()) {
613+ return nullptr ;
614+ }
615+ // The filter should execute the script specified by the script name if exist.
616+ if (!per_route_config_->name ().empty ()) {
617+ return config_->perLuaCodeSetup (per_route_config_->name ());
618+ }
619+ // The filter should execute the script specified by the inline code if exist.
620+ if (auto inline_code = per_route_config_->perLuaCodeSetup (); inline_code != nullptr ) {
621+ return inline_code;
622+ }
623+ }
624+
625+ return config_->perLuaCodeSetup ();
626+ }
627+
628+ const ProtobufWkt::Struct& filterContext () const {
629+ return per_route_config_ == nullptr ? ProtobufWkt::Struct::default_instance ()
630+ : per_route_config_->filterContext ();
631+ }
632+
612633 Http::FilterHeadersStatus doHeaders (StreamHandleRef& handle,
613634 Filters::Common::Lua::CoroutinePtr& coroutine,
614635 FilterCallbacks& callbacks, int function_ref,
@@ -618,11 +639,8 @@ class Filter : public Http::StreamFilter, private Filters::Common::Lua::LuaLogga
618639 Http::FilterTrailersStatus doTrailers (StreamHandleRef& handle, Http::HeaderMap& trailers);
619640
620641 FilterConfigConstSharedPtr config_;
621- DecoderCallbacks decoder_callbacks_{*this };
622- EncoderCallbacks encoder_callbacks_{*this };
623- StreamHandleRef request_stream_wrapper_;
624- StreamHandleRef response_stream_wrapper_;
625- bool destroyed_{};
642+ const FilterConfigPerRoute* per_route_config_{};
643+
626644 TimeSource& time_source_;
627645 LuaFilterStats stats_;
628646
@@ -640,6 +658,12 @@ class Filter : public Http::StreamFilter, private Filters::Common::Lua::LuaLogga
640658 // seems like a safer fix for now.
641659 Filters::Common::Lua::CoroutinePtr request_coroutine_;
642660 Filters::Common::Lua::CoroutinePtr response_coroutine_;
661+
662+ DecoderCallbacks decoder_callbacks_{*this };
663+ EncoderCallbacks encoder_callbacks_{*this };
664+ StreamHandleRef request_stream_wrapper_;
665+ StreamHandleRef response_stream_wrapper_;
666+ bool destroyed_{};
643667};
644668
645669} // namespace Lua
0 commit comments