Lines
100 %
Functions
#include "source/common/tracing/trace_context_impl.h"
#include "source/common/http/header_map_impl.h"
namespace Envoy {
namespace Tracing {
TraceContextHandler::TraceContextHandler(absl::string_view key) : key_(key) {
// This will force the header map to be finalized in unit tests and do nothing in prod (
// where the header map is already finalized when the server is initializing).
Http::TypedHeaderMapImpl<Http::RequestHeaderMap>::inlineHeadersSize();
handle_ = Http::CustomInlineHeaderRegistry::getInlineHeader<
Http::CustomInlineHeaderRegistry::Type::RequestHeaders>(key_);
}
void TraceContextHandler::set(TraceContext& trace_context, absl::string_view value) const {
// Will dynamic_cast be better?
auto header_map = trace_context.requestHeaders();
if (!header_map.has_value()) {
trace_context.set(key_, value);
return;
if (handle_.has_value()) {
header_map->setInline(handle_.value(), value);
} else {
header_map->setCopy(key_, value);
void TraceContextHandler::setRefKey(TraceContext& trace_context, absl::string_view value) const {
header_map->setReferenceKey(key_, value);
void TraceContextHandler::setRef(TraceContext& trace_context, absl::string_view value) const {
header_map->setReferenceInline(handle_.value(), value);
header_map->setReference(key_, value);
absl::optional<absl::string_view>
TraceContextHandler::get(const TraceContext& trace_context) const {
return trace_context.get(key_);
auto* entry = header_map->getInline(handle_.value());
if (entry == nullptr) {
return absl::nullopt;
return entry->value().getStringView();
auto results = header_map->get(key_);
if (results.empty()) {
return results[0]->value().getStringView();
TraceContextHandler::GetAllResult
TraceContextHandler::getAll(const TraceContext& trace_context) const {
if (const auto value = trace_context.get(key_); value.has_value()) {
return {value.value()};
return {};
return {entry->value().getStringView()};
GetAllResult all_values;
all_values.reserve(results.size());
for (size_t i = 0; i < results.size(); ++i) {
all_values.push_back(results[i]->value().getStringView());
return all_values;
void TraceContextHandler::remove(TraceContext& trace_context) const {
trace_context.remove(key_);
header_map->removeInline(handle_.value());
header_map->remove(key_);
} // namespace Tracing
} // namespace Envoy