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"{}"):