[7.x] Add the 'X-Elastic-Client-Meta' header
Co-authored-by: Seth Michael Larson <[email protected]>
This commit is contained in:
co-authored by
Seth Michael Larson
parent
2e06989ca1
commit
b894e359df
@@ -17,6 +17,7 @@
|
||||
# under the License.
|
||||
|
||||
import ssl
|
||||
import re
|
||||
import gzip
|
||||
import io
|
||||
from mock import patch
|
||||
@@ -316,3 +317,43 @@ class TestAIOHttpConnection:
|
||||
con = await self._get_mock_connection(response_body=buf)
|
||||
status, headers, data = await con.perform_request("GET", "/")
|
||||
assert u"你好\uda6a" == data
|
||||
|
||||
async def test_meta_header_value(self):
|
||||
con = await self._get_mock_connection()
|
||||
assert con.meta_header is True
|
||||
|
||||
await con.perform_request("GET", "/", body=b"{}")
|
||||
|
||||
_, kwargs = con.session.request.call_args
|
||||
headers = kwargs["headers"]
|
||||
assert re.match(
|
||||
r"^es=[0-9]+\.[0-9]+\.[0-9]+p?,py=[0-9]+\.[0-9]+\.[0-9]+p?,"
|
||||
r"t=[0-9]+\.[0-9]+\.[0-9]+p?,ai=[0-9]+\.[0-9]+\.[0-9]+p?$",
|
||||
headers["x-elastic-client-meta"],
|
||||
)
|
||||
|
||||
con = await self._get_mock_connection()
|
||||
assert con.meta_header is True
|
||||
|
||||
await con.perform_request(
|
||||
"GET", "/", body=b"{}", params={"_client_meta": (("h", "bp"),)}
|
||||
)
|
||||
|
||||
(method, url), kwargs = con.session.request.call_args
|
||||
headers = kwargs["headers"]
|
||||
assert method == "GET"
|
||||
assert str(url) == "http://localhost:9200/"
|
||||
assert re.match(
|
||||
r"^es=[0-9]+\.[0-9]+\.[0-9]+p?,py=[0-9]+\.[0-9]+\.[0-9]+p?,"
|
||||
r"t=[0-9]+\.[0-9]+\.[0-9]+p?,ai=[0-9]+\.[0-9]+\.[0-9]+p?,h=bp$",
|
||||
headers["x-elastic-client-meta"],
|
||||
)
|
||||
|
||||
con = await self._get_mock_connection(connection_params={"meta_header": False})
|
||||
assert con.meta_header is False
|
||||
|
||||
await con.perform_request("GET", "/", body=b"{}")
|
||||
|
||||
_, kwargs = con.session.request.call_args
|
||||
headers = kwargs["headers"]
|
||||
assert "x-elastic-client-meta" not in (x.lower() for x in headers)
|
||||
|
||||
@@ -40,7 +40,12 @@ from elasticsearch.connection import (
|
||||
RequestsHttpConnection,
|
||||
Urllib3HttpConnection,
|
||||
)
|
||||
from elasticsearch import __versionstr__
|
||||
from elasticsearch.connection.base import (
|
||||
_get_client_meta_header,
|
||||
_python_to_meta_version,
|
||||
)
|
||||
|
||||
from elasticsearch import __version__, __versionstr__
|
||||
from .test_cases import TestCase, SkipTest
|
||||
|
||||
|
||||
@@ -161,6 +166,32 @@ class TestBaseConnection(TestCase):
|
||||
conn = Connection(**kwargs)
|
||||
assert conn.host == expected_host
|
||||
|
||||
def test_meta_header(self):
|
||||
conn = Connection(meta_header=True)
|
||||
assert conn.meta_header is True
|
||||
conn = Connection(meta_header=False)
|
||||
assert conn.meta_header is False
|
||||
|
||||
with pytest.raises(TypeError) as e:
|
||||
Connection(meta_header=1)
|
||||
assert str(e.value) == "meta_header must be of type bool"
|
||||
|
||||
def test_get_client_meta_header(self):
|
||||
meta_header = _get_client_meta_header()
|
||||
assert ("es=%s" % (".".join(str(x) for x in __version__),)) in meta_header
|
||||
assert ("t=%s" % (".".join(str(x) for x in __version__),)) in meta_header
|
||||
assert ("py=%s" % python_version()) in meta_header
|
||||
|
||||
meta_header = _get_client_meta_header((("h", "bp"),))
|
||||
assert meta_header.endswith(",h=bp")
|
||||
|
||||
meta_header = _get_client_meta_header((("ur", "1.26.3"), ("h", "bp")))
|
||||
assert meta_header.endswith(",ur=1.26.3,h=bp")
|
||||
|
||||
def test_python_to_meta_version(self):
|
||||
assert _python_to_meta_version("1.26.3") == "1.26.3"
|
||||
assert _python_to_meta_version("7.10.1a1") == "7.10.1p"
|
||||
|
||||
|
||||
class TestUrllib3Connection(TestCase):
|
||||
def _get_mock_connection(self, connection_params={}, response_body=b"{}"):
|
||||
@@ -434,6 +465,45 @@ class TestUrllib3Connection(TestCase):
|
||||
status, headers, data = con.perform_request("GET", "/")
|
||||
self.assertEqual(u"你好\uda6a", data)
|
||||
|
||||
def test_meta_header_value(self):
|
||||
con = self._get_mock_connection()
|
||||
self.assertTrue(con.meta_header)
|
||||
|
||||
con.perform_request("GET", "/", body=b"{}")
|
||||
|
||||
_, kwargs = con.pool.urlopen.call_args
|
||||
headers = kwargs["headers"]
|
||||
assert re.match(
|
||||
r"^es=[0-9]+\.[0-9]+\.[0-9]+p?,py=[0-9]+\.[0-9]+\.[0-9]+p?,"
|
||||
r"t=[0-9]+\.[0-9]+\.[0-9]+p?,ur=[0-9]+\.[0-9]+\.[0-9]+p?$",
|
||||
headers["x-elastic-client-meta"],
|
||||
)
|
||||
|
||||
con = self._get_mock_connection({"meta_header": True})
|
||||
self.assertTrue(con.meta_header)
|
||||
|
||||
con.perform_request(
|
||||
"GET", "/", body=b"{}", params={"_client_meta": (("h", "bp"),)}
|
||||
)
|
||||
|
||||
args, kwargs = con.pool.urlopen.call_args
|
||||
headers = kwargs["headers"]
|
||||
assert args == ("GET", "/", b"{}")
|
||||
assert re.match(
|
||||
r"^es=[0-9]+\.[0-9]+\.[0-9]+p?,py=[0-9]+\.[0-9]+\.[0-9]+p?,"
|
||||
r"t=[0-9]+\.[0-9]+\.[0-9]+p?,ur=[0-9]+\.[0-9]+\.[0-9]+p?,h=bp$",
|
||||
headers["x-elastic-client-meta"],
|
||||
)
|
||||
|
||||
con = self._get_mock_connection({"meta_header": False})
|
||||
self.assertFalse(con.meta_header)
|
||||
|
||||
con.perform_request("GET", "/", body=b"{}")
|
||||
|
||||
_, kwargs = con.pool.urlopen.call_args
|
||||
headers = kwargs["headers"]
|
||||
assert "x-elastic-client-meta" not in (x.lower() for x in headers)
|
||||
|
||||
|
||||
class TestRequestsConnection(TestCase):
|
||||
def _get_mock_connection(
|
||||
@@ -835,3 +905,42 @@ class TestRequestsConnection(TestCase):
|
||||
con = self._get_mock_connection(response_body=buf)
|
||||
status, headers, data = con.perform_request("GET", "/")
|
||||
self.assertEqual(u"你好\uda6a", data)
|
||||
|
||||
def test_meta_header_value(self):
|
||||
con = self._get_mock_connection()
|
||||
self.assertTrue(con.meta_header)
|
||||
|
||||
con.perform_request("GET", "/", body=b"{}")
|
||||
|
||||
args, _ = con.session.send.call_args
|
||||
headers = args[0].headers
|
||||
assert re.match(
|
||||
r"^es=[0-9]+\.[0-9]+\.[0-9]+p?,py=[0-9]+\.[0-9]+\.[0-9]+p?,"
|
||||
r"t=[0-9]+\.[0-9]+\.[0-9]+p?,rq=[0-9]+\.[0-9]+\.[0-9]+p?$",
|
||||
headers["x-elastic-client-meta"],
|
||||
)
|
||||
|
||||
con = self._get_mock_connection()
|
||||
self.assertTrue(con.meta_header)
|
||||
|
||||
con.perform_request(
|
||||
"GET", "/", body=b"{}", params={"_client_meta": (("h", "bp"),)}
|
||||
)
|
||||
|
||||
args, _ = con.session.send.call_args
|
||||
headers = args[0].headers
|
||||
assert args[0].url == "http://localhost:9200/"
|
||||
assert re.match(
|
||||
r"^es=[0-9]+\.[0-9]+\.[0-9]+p?,py=[0-9]+\.[0-9]+\.[0-9]+p?,"
|
||||
r"t=[0-9]+\.[0-9]+\.[0-9]+p?,rq=[0-9]+\.[0-9]+\.[0-9]+p?,h=bp$",
|
||||
headers["x-elastic-client-meta"],
|
||||
)
|
||||
|
||||
con = self._get_mock_connection({"meta_header": False})
|
||||
self.assertFalse(con.meta_header)
|
||||
|
||||
con.perform_request("GET", "/", body=b"{}")
|
||||
|
||||
args, _ = con.session.send.call_args
|
||||
headers = args[0].headers
|
||||
assert "x-elastic-client-meta" not in (x.lower() for x in headers)
|
||||
|
||||
@@ -21,6 +21,7 @@ import time
|
||||
import threading
|
||||
import pytest
|
||||
from elasticsearch import helpers, Elasticsearch
|
||||
from elasticsearch.helpers import actions
|
||||
from elasticsearch.serializer import JSONSerializer
|
||||
|
||||
from .test_cases import TestCase
|
||||
@@ -204,6 +205,20 @@ class TestChunkActions(TestCase):
|
||||
chunk = chunk if isinstance(chunk, str) else chunk.encode("utf-8")
|
||||
self.assertLessEqual(len(chunk), max_byte_size)
|
||||
|
||||
def test_add_helper_meta_to_kwargs(self):
|
||||
self.assertEqual(
|
||||
actions._add_helper_meta_to_kwargs({}, "b"),
|
||||
{"params": {"_client_meta": (("h", "b"),)}},
|
||||
)
|
||||
self.assertEqual(
|
||||
actions._add_helper_meta_to_kwargs({"params": {}}, "b"),
|
||||
{"params": {"_client_meta": (("h", "b"),)}},
|
||||
)
|
||||
self.assertEqual(
|
||||
actions._add_helper_meta_to_kwargs({"params": {"key": "value"}}, "b"),
|
||||
{"params": {"_client_meta": (("h", "b"),), "key": "value"}},
|
||||
)
|
||||
|
||||
|
||||
class TestExpandActions(TestCase):
|
||||
def test_string_actions_are_marked_as_simple_inserts(self):
|
||||
|
||||
Reference in New Issue
Block a user