class ElasticAPM::TraceContext::Tracestate
@api private
def self.parse(header)
def self.parse(header) entries = split_by_nl_and_comma(header) .each_with_object({}) do |entry, hsh| k, v = entry.split('=') next unless k && v && !k.empty? && !v.empty? hsh[k] = case k when 'es' then EsEntry.new(v) else Entry.new(k, v) end end new(entries: entries) end
def es_entry
def es_entry # lazy generate this so we only add it if necessary entries['es'] ||= EsEntry.new end
def initialize(entries: {}, sample_rate: nil)
def initialize(entries: {}, sample_rate: nil) @entries = entries self.sample_rate = sample_rate if sample_rate end
def split_by_nl_and_comma(str)
def split_by_nl_and_comma(str) # HTTP allows multiple headers with the same name, eg. multiple # Set-Cookie headers per response. # Rack handles this by joining the headers under the same key, # separated by newlines. # See https://www.rubydoc.info/github/rack/rack/file/SPEC String(str).split(ENTRY_SPLIT_REGEX).flatten end
def to_header
def to_header return "" unless entries.any? entries.values.map(&:to_s).join(',') end