Module: Elastic::Transport::MetaHeader

Included in:
Client
Defined in:
lib/elastic/transport/meta_header.rb

Overview

Methods for the Elastic meta header used by Cloud. X-Elastic-Client-Meta HTTP header which is used by Elastic Cloud and can be disabled when instantiating the Client with the :enable_meta_header parameter set to ‘false`.

Instance Method Summary collapse

Instance Method Details

#called_from?(service) ⇒ Boolean

Returns:

  • (Boolean)


74
75
76
# File 'lib/elastic/transport/meta_header.rb', line 74

def called_from?(service)
  !caller.select { |c| c.match?(service) }.empty?
end

#client_meta_version(version) ⇒ Object

We return the current version if it’s a release, but if it’s a pre/alpha/beta release we return <VERSION_NUMBER>p



81
82
83
84
85
86
87
# File 'lib/elastic/transport/meta_header.rb', line 81

def client_meta_version(version)
  regexp = /^([0-9]+\.[0-9]+\.[0-9]+)(\.?[a-z0-9.-]+)?$/
  match = version.match(regexp)
  return "#{match[1]}p" if match[2]

  version
end

#elasticsearch?Boolean

Returns:

  • (Boolean)


64
65
66
67
# File 'lib/elastic/transport/meta_header.rb', line 64

def elasticsearch?
  defined?(Elastic::ELASTICSEARCH_SERVICE_VERSION) &&
    called_from?('elasticsearch')
end

#enterprise_search?Boolean

Returns:

  • (Boolean)


59
60
61
62
# File 'lib/elastic/transport/meta_header.rb', line 59

def enterprise_search?
  defined?(Elastic::ENTERPRISE_SERVICE_VERSION) &&
    called_from?('enterprise-search-ruby')
end

#meta_header_adapterObject

This function tries to define the version for the Faraday adapter. If it hasn’t been loaded by the time we’re calling this method, it’s going to report the adapter (if we know it) but return 0 as the version. It won’t report anything when using a custom adapter we don’t identify.

Returns a Hash<adapter_alias, version>



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/elastic/transport/meta_header.rb', line 109

def meta_header_adapter
  if @transport_class == Transport::HTTP::Faraday
    version = '0'
    adapter_version = case @arguments[:adapter]
             when :patron
               version = Patron::VERSION if defined?(::Patron::VERSION)
               { pt: version }
             when :net_http
               version = if defined?(Net::HTTP::VERSION)
                           Net::HTTP::VERSION
                         elsif defined?(Net::HTTP::HTTPVersion)
                           Net::HTTP::HTTPVersion
                         end
               { nh: version }
             when :typhoeus
               version = Typhoeus::VERSION if defined?(::Typhoeus::VERSION)
               { ty: version }
             when :httpclient
               version = HTTPClient::VERSION if defined?(HTTPClient::VERSION)
               { hc: version }
             when :net_http_persistent
               version = Net::HTTP::Persistent::VERSION if defined?(Net::HTTP::Persistent::VERSION)
               { np: version }
             else
               {}
             end
    { fd: Faraday::VERSION }.merge(adapter_version)
  elsif defined?(Transport::HTTP::Curb) && @transport_class == Transport::HTTP::Curb
    { cl: Curl::CURB_VERSION }
  elsif defined?(Transport::HTTP::Manticore) && @transport_class == Transport::HTTP::Manticore
    { mc: Manticore::VERSION }
  end
end

#meta_header_engineObject



89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/elastic/transport/meta_header.rb', line 89

def meta_header_engine
  case RUBY_ENGINE
  when 'ruby'
    {}
  when 'jruby'
    { jv: ENV_JAVA['java.version'], jr: JRUBY_VERSION }
  when 'rbx'
    { rbx: RUBY_VERSION }
  else
    { RUBY_ENGINE.to_sym => RUBY_VERSION }
  end
end

#meta_header_service_versionObject



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/elastic/transport/meta_header.rb', line 41

def meta_header_service_version
  if enterprise_search?
    Elastic::ENTERPRISE_SERVICE_VERSION
  elsif serverless?
    if defined?(Elastic::ES_SERVERLESS_SERVICE_VERSION)
      Elastic::ES_SERVERLESS_SERVICE_VERSION
    else
      Elastic::ELASTICSEARCH_SERVICE_VERSION
    end
  elsif elasticsearch?
    Elastic::ELASTICSEARCH_SERVICE_VERSION
  elsif defined?(Elasticsearch::VERSION)
    [:es, client_meta_version(Elasticsearch::VERSION)]
  else
    [:et, client_meta_version(Elastic::Transport::VERSION)]
  end
end

#serverless?Boolean

Returns:

  • (Boolean)


69
70
71
72
# File 'lib/elastic/transport/meta_header.rb', line 69

def serverless?
  defined?(ElasticsearchServerless::CLIENT_VERSION) &&
    called_from?('elasticsearch-serverless')
end

#set_meta_headerObject



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/elastic/transport/meta_header.rb', line 25

def set_meta_header
  return if @arguments[:enable_meta_header] == false

  service, version = meta_header_service_version

  meta_headers = {
    service.to_sym => version,
    rb: RUBY_VERSION,
    t: Elastic::Transport::VERSION
  }
  meta_headers.merge!(meta_header_engine) if meta_header_engine
  meta_headers.merge!(meta_header_adapter) if meta_header_adapter

  add_header({ 'x-elastic-client-meta' => meta_headers.map { |k, v| "#{k}=#{v}" }.join(',') })
end