From ea397e0f92806de9f27e5354691cb4b0d41893a8 Mon Sep 17 00:00:00 2001 From: Rushi Agrawal Date: Thu, 26 Aug 2021 18:55:25 +0530 Subject: [PATCH] Add support for Elasticsearch api versioning header Originally added in Elasticsearch in commit 2c5f1d15697e75f932a2c82634927e22931d4879, removed in OpenSearch in 3eac282c57552ef196e16c35132cca1d06f122b2 Note that this just adds support of 'elasticsearch' header, there's no 'opensearch' header support as such. Signed-off-by: Rushi Agrawal --- opensearch/connection/base.py | 6 ++++++ opensearch/serializer.py | 5 +++++ test_opensearch/test_connection.py | 21 +++++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/opensearch/connection/base.py b/opensearch/connection/base.py index 05d81c71..b8c27237 100644 --- a/opensearch/connection/base.py +++ b/opensearch/connection/base.py @@ -28,6 +28,7 @@ import binascii import gzip import io import logging +import os import re import warnings from platform import python_version @@ -127,6 +128,11 @@ class Connection(object): if opaque_id: self.headers["x-opaque-id"] = opaque_id + if os.getenv("ELASTIC_CLIENT_APIVERSIONING") == "1": + self.headers.setdefault( + "accept", "application/vnd.elasticsearch+json;compatible-with=7" + ) + self.headers.setdefault("content-type", "application/json") self.headers.setdefault("user-agent", self._get_default_user_agent()) diff --git a/opensearch/serializer.py b/opensearch/serializer.py index fcc9b146..d7180e8e 100644 --- a/opensearch/serializer.py +++ b/opensearch/serializer.py @@ -163,6 +163,11 @@ class Deserializer(object): if not mimetype: deserializer = self.default else: + # Treat 'application/vnd.elasticsearch+json' + # as application/json for compatibility. + if mimetype == "application/vnd.elasticsearch+json": + mimetype = "application/json" + # split out charset mimetype, _, _ = mimetype.partition(";") try: diff --git a/test_opensearch/test_connection.py b/test_opensearch/test_connection.py index c02a7183..e296a29b 100644 --- a/test_opensearch/test_connection.py +++ b/test_opensearch/test_connection.py @@ -28,6 +28,7 @@ import gzip import io import json +import os import re import ssl import warnings @@ -173,6 +174,26 @@ class TestBaseConnection(TestCase): conn = Connection(**kwargs) assert conn.host == expected_host + def test_compatibility_accept_header(self): + try: + conn = Connection() + assert "accept" not in conn.headers + + os.environ["ELASTIC_CLIENT_APIVERSIONING"] = "0" + + conn = Connection() + assert "accept" not in conn.headers + + os.environ["ELASTIC_CLIENT_APIVERSIONING"] = "1" + + conn = Connection() + assert ( + conn.headers["accept"] + == "application/vnd.elasticsearch+json;compatible-with=7" + ) + finally: + os.environ.pop("ELASTIC_CLIENT_APIVERSIONING") + class TestUrllib3Connection(TestCase): def _get_mock_connection(self, connection_params={}, response_body=b"{}"):