Skip to content

Commit af393dc

Browse files
committed
feat: add X-Client-Version and X-Client-Git-Commit-Short headers
1 parent 99af053 commit af393dc

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

pyiceberg/catalog/rest/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
)
7575
from pyiceberg.typedef import EMPTY_DICT, UTF8, IcebergBaseModel, Identifier, Properties
7676
from pyiceberg.types import transform_dict_value_to_str
77+
from pyiceberg.utils.build_info import git_commit_short_id
7778
from pyiceberg.utils.deprecated import deprecation_message
7879
from pyiceberg.utils.properties import get_first_property_value, get_header_properties, property_as_bool
7980

@@ -484,6 +485,8 @@ def _config_headers(self, session: Session) -> None:
484485
session.headers.update(header_properties)
485486
session.headers["Content-type"] = "application/json"
486487
session.headers["User-Agent"] = f"PyIceberg/{__version__}"
488+
session.headers["X-Client-Version"] = __version__
489+
session.headers["X-Client-Git-Commit-Short"] = git_commit_short_id()
487490
session.headers.setdefault("X-Iceberg-Access-Delegation", ACCESS_DELEGATION_DEFAULT)
488491

489492
def _create_table(

tests/catalog/test_rest.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,27 @@ def test_config_sets_headers(requests_mock: Mocker) -> None:
368368
)
369369

370370

371+
def test_client_version_headers(requests_mock: Mocker) -> None:
372+
import re
373+
374+
from pyiceberg import __version__
375+
376+
requests_mock.get(
377+
f"{TEST_URI}v1/config",
378+
json={"defaults": {}, "overrides": {}},
379+
status_code=200,
380+
)
381+
382+
catalog = RestCatalog("rest", uri=TEST_URI, warehouse="s3://some-bucket")
383+
384+
assert catalog._session.headers.get("X-Client-Version") == __version__
385+
assert "X-Client-Git-Commit-Short" in catalog._session.headers
386+
git_commit = catalog._session.headers.get("X-Client-Git-Commit-Short")
387+
assert git_commit is not None
388+
assert isinstance(git_commit, str)
389+
assert re.match(r"^[0-9a-f]{7}$", git_commit), f"Expected 7-char hex git hash, got: {git_commit}"
390+
391+
371392
@pytest.mark.filterwarnings(
372393
"ignore:Deprecated in 0.8.0, will be removed in 1.0.0. Iceberg REST client is missing the OAuth2 server URI:DeprecationWarning"
373394
)

0 commit comments

Comments
 (0)