From c2f95b558331c8332aed9ba8717e2826b6488b35 Mon Sep 17 00:00:00 2001 From: Kuat Yessenov Date: Mon, 9 Jan 2023 23:21:53 +0000 Subject: [PATCH] baggage: allow propagation Signed-off-by: Kuat Yessenov --- .../filters/http/connect_baggage/config.proto | 9 +++++-- .../filters/http/connect_baggage/filter.cc | 24 +++++++++++++++---- .../filters/http/connect_baggage/filter.h | 4 ++++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/source/extensions/filters/http/connect_baggage/config.proto b/source/extensions/filters/http/connect_baggage/config.proto index 3e338b9e91b..37e08c0b62b 100644 --- a/source/extensions/filters/http/connect_baggage/config.proto +++ b/source/extensions/filters/http/connect_baggage/config.proto @@ -17,5 +17,10 @@ syntax = "proto3"; package io.istio.http.connect_baggage; -// Computes and stores the downstream peer metadata from the "baggage" header. -message Config {} +// Computes or propagates the downstream peer metadata using the "baggage" +// header. +message Config { + // Write "baggage" header from downstream peer metadata, instead of reading + // it. + bool propagate = 1; +} diff --git a/source/extensions/filters/http/connect_baggage/filter.cc b/source/extensions/filters/http/connect_baggage/filter.cc index 7963c4efb06..dda96adc27c 100644 --- a/source/extensions/filters/http/connect_baggage/filter.cc +++ b/source/extensions/filters/http/connect_baggage/filter.cc @@ -26,10 +26,26 @@ namespace Extensions { namespace HttpFilters { namespace ConnectBaggage { +constexpr absl::string_view Baggage = "baggage"; +constexpr absl::string_view DownstreamPeerKey = "wasm.downstream_peer"; + Http::FilterHeadersStatus Filter::decodeHeaders(Http::RequestHeaderMap& headers, bool) { + if (propagate_) { + const auto* object = decoder_callbacks_->streamInfo() + .filterState() + ->getDataReadOnly( + DownstreamPeerKey); + if (object) { + const auto peer = Istio::Common::convertFlatNodeToWorkloadMetadata( + *flatbuffers::GetRoot( + object->value().data())); + headers.addCopy(Http::LowerCaseString(Baggage), peer.baggage()); + } + return Http::FilterHeadersStatus::Continue; + } const auto header_string = Http::HeaderUtility::getAllOfHeaderAsString( - headers, Http::LowerCaseString("baggage")); + headers, Http::LowerCaseString(Baggage)); const auto result = header_string.result(); if (result) { const auto metadata_object = @@ -67,10 +83,10 @@ Http::FilterHeadersStatus Filter::decodeHeaders(Http::RequestHeaderMap& headers, } Http::FilterFactoryCb FilterConfigFactory::createFilterFactoryFromProtoTyped( - const io::istio::http::connect_baggage::Config&, const std::string&, + const io::istio::http::connect_baggage::Config& config, const std::string&, Server::Configuration::FactoryContext&) { - return [](Http::FilterChainFactoryCallbacks& callbacks) { - auto filter = std::make_shared(); + return [config](Http::FilterChainFactoryCallbacks& callbacks) { + auto filter = std::make_shared(config.propagate()); callbacks.addStreamFilter(filter); }; } diff --git a/source/extensions/filters/http/connect_baggage/filter.h b/source/extensions/filters/http/connect_baggage/filter.h index c9e93f0f743..96fe901ff5d 100644 --- a/source/extensions/filters/http/connect_baggage/filter.h +++ b/source/extensions/filters/http/connect_baggage/filter.h @@ -26,8 +26,12 @@ namespace ConnectBaggage { class Filter : public Http::PassThroughFilter { public: + Filter(bool propagate) : propagate_(propagate) {} Http::FilterHeadersStatus decodeHeaders(Http::RequestHeaderMap&, bool) override; + + private: + bool propagate_; }; class FilterConfigFactory