Skip to content

Commit 70013c8

Browse files
authored
chore: Correct x-goog-api-client header logic (#876)
1 parent bde3fb0 commit 70013c8

14 files changed

+65
-24
lines changed

firebase_admin/_http_client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
DEFAULT_TIMEOUT_SECONDS = 120
3939

4040
METRICS_HEADERS = {
41-
'X-GOOG-API-CLIENT': _utils.get_metrics_header(),
41+
'x-goog-api-client': _utils.get_metrics_header(),
4242
}
4343

4444
class HttpClient:
@@ -76,7 +76,6 @@ def __init__(
7676

7777
if headers:
7878
self._session.headers.update(headers)
79-
self._session.headers.update(METRICS_HEADERS)
8079
if retries:
8180
self._session.mount('http://', requests.adapters.HTTPAdapter(max_retries=retries))
8281
self._session.mount('https://', requests.adapters.HTTPAdapter(max_retries=retries))
@@ -120,6 +119,7 @@ class call this method to send HTTP requests out. Refer to
120119
"""
121120
if 'timeout' not in kwargs:
122121
kwargs['timeout'] = self.timeout
122+
kwargs.setdefault('headers', {}).update(METRICS_HEADERS)
123123
resp = self._session.request(method, self.base_url + url, **kwargs)
124124
resp.raise_for_status()
125125
return resp

firebase_admin/app_check.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class _AppCheckService:
5252
_jwks_client = None
5353

5454
_APP_CHECK_HEADERS = {
55-
'X-GOOG-API-CLIENT': _utils.get_metrics_header(),
55+
'x-goog-api-client': _utils.get_metrics_header(),
5656
}
5757

5858
def __init__(self, app):

firebase_admin/storage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class _StorageClient:
5656
"""Holds a Google Cloud Storage client instance."""
5757

5858
STORAGE_HEADERS = {
59-
'X-GOOG-API-CLIENT': _utils.get_metrics_header(),
59+
'x-goog-api-client': _utils.get_metrics_header(),
6060
}
6161

6262
def __init__(self, credentials, project, default_bucket):

tests/test_auth_providers.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,11 @@ def _assert_request(request, expected_method, expected_url):
7575
assert request.method == expected_method
7676
assert request.url == expected_url
7777
assert request.headers['X-Client-Version'] == f'Python/Admin/{firebase_admin.__version__}'
78-
assert request.headers['X-GOOG-API-CLIENT'] == _utils.get_metrics_header()
78+
expected_metrics_header = [
79+
_utils.get_metrics_header(),
80+
_utils.get_metrics_header() + ' mock-cred-metric-tag'
81+
]
82+
assert request.headers['x-goog-api-client'] in expected_metrics_header
7983

8084
class TestOIDCProviderConfig:
8185

tests/test_db.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,8 @@ def _assert_request(self, request, expected_method, expected_url):
198198
assert request.url == expected_url
199199
assert request.headers['Authorization'] == 'Bearer mock-token'
200200
assert request.headers['User-Agent'] == db._USER_AGENT
201-
assert request.headers['X-GOOG-API-CLIENT'] == _utils.get_metrics_header()
201+
expected_metrics_header = _utils.get_metrics_header() + ' mock-cred-metric-tag'
202+
assert request.headers['x-goog-api-client'] == expected_metrics_header
202203

203204
@pytest.mark.parametrize('data', valid_values)
204205
def test_get_value(self, data):
@@ -665,7 +666,8 @@ def _assert_request(self, request, expected_method, expected_url):
665666
assert request.url == expected_url
666667
assert request.headers['Authorization'] == 'Bearer mock-token'
667668
assert request.headers['User-Agent'] == db._USER_AGENT
668-
assert request.headers['X-GOOG-API-CLIENT'] == _utils.get_metrics_header()
669+
expected_metrics_header = _utils.get_metrics_header() + ' mock-cred-metric-tag'
670+
assert request.headers['x-goog-api-client'] == expected_metrics_header
669671

670672
def test_get_value(self):
671673
ref = db.reference('/test')

tests/test_functions.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ def test_task_enqueue(self):
122122
assert recorder[0].url == _DEFAULT_REQUEST_URL
123123
assert recorder[0].headers['Content-Type'] == 'application/json'
124124
assert recorder[0].headers['Authorization'] == 'Bearer mock-token'
125-
assert recorder[0].headers['X-GOOG-API-CLIENT'] == _utils.get_metrics_header()
125+
expected_metrics_header = _utils.get_metrics_header() + ' mock-cred-metric-tag'
126+
assert recorder[0].headers['x-goog-api-client'] == expected_metrics_header
126127
assert task_id == 'test-task-id'
127128

128129
def test_task_enqueue_with_extension(self):
@@ -139,7 +140,8 @@ def test_task_enqueue_with_extension(self):
139140
assert recorder[0].url == _CLOUD_TASKS_URL + resource_name
140141
assert recorder[0].headers['Content-Type'] == 'application/json'
141142
assert recorder[0].headers['Authorization'] == 'Bearer mock-token'
142-
assert recorder[0].headers['X-GOOG-API-CLIENT'] == _utils.get_metrics_header()
143+
expected_metrics_header = _utils.get_metrics_header() + ' mock-cred-metric-tag'
144+
assert recorder[0].headers['x-goog-api-client'] == expected_metrics_header
143145
assert task_id == 'test-task-id'
144146

145147
def test_task_delete(self):
@@ -149,8 +151,8 @@ def test_task_delete(self):
149151
assert len(recorder) == 1
150152
assert recorder[0].method == 'DELETE'
151153
assert recorder[0].url == _DEFAULT_TASK_URL
152-
assert recorder[0].headers['X-GOOG-API-CLIENT'] == _utils.get_metrics_header()
153-
154+
expected_metrics_header = _utils.get_metrics_header() + ' mock-cred-metric-tag'
155+
assert recorder[0].headers['x-goog-api-client'] == expected_metrics_header
154156

155157
class TestTaskQueueOptions:
156158

tests/test_http_client.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,21 @@ def test_metrics_headers():
7171
assert len(recorder) == 1
7272
assert recorder[0].method == 'GET'
7373
assert recorder[0].url == _TEST_URL
74-
assert recorder[0].headers['X-GOOG-API-CLIENT'] == _utils.get_metrics_header()
74+
assert recorder[0].headers['x-goog-api-client'] == _utils.get_metrics_header()
75+
76+
def test_metrics_headers_with_credentials():
77+
client = _http_client.HttpClient(
78+
credential=testutils.MockGoogleCredential())
79+
assert client.session is not None
80+
recorder = _instrument(client, 'body')
81+
resp = client.request('get', _TEST_URL)
82+
assert resp.status_code == 200
83+
assert resp.text == 'body'
84+
assert len(recorder) == 1
85+
assert recorder[0].method == 'GET'
86+
assert recorder[0].url == _TEST_URL
87+
expected_metrics_header = _utils.get_metrics_header() + ' mock-cred-metric-tag'
88+
assert recorder[0].headers['x-goog-api-client'] == expected_metrics_header
7589

7690
def test_credential():
7791
client = _http_client.HttpClient(

tests/test_instance_id.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ def _instrument_iid_service(self, app, status=200, payload='True'):
6868
def _assert_request(self, request, expected_method, expected_url):
6969
assert request.method == expected_method
7070
assert request.url == expected_url
71-
assert request.headers['X-GOOG-API-CLIENT'] == _utils.get_metrics_header()
71+
expected_metrics_header = _utils.get_metrics_header() + ' mock-cred-metric-tag'
72+
assert request.headers['x-goog-api-client'] == expected_metrics_header
7273

7374
def _get_url(self, project_id, iid):
7475
return instance_id._IID_SERVICE_URL + 'project/{0}/instanceId/{1}'.format(project_id, iid)

tests/test_messaging.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1683,7 +1683,8 @@ def _assert_request(self, request, expected_method, expected_url, expected_body=
16831683
assert request.url == expected_url
16841684
assert request.headers['X-GOOG-API-FORMAT-VERSION'] == '2'
16851685
assert request.headers['X-FIREBASE-CLIENT'] == self._CLIENT_VERSION
1686-
assert request.headers['X-GOOG-API-CLIENT'] == _utils.get_metrics_header()
1686+
expected_metrics_header = _utils.get_metrics_header() + ' mock-cred-metric-tag'
1687+
assert request.headers['x-goog-api-client'] == expected_metrics_header
16871688
if expected_body is None:
16881689
assert request.body is None
16891690
else:
@@ -2604,7 +2605,8 @@ def _assert_request(self, request, expected_method, expected_url):
26042605
assert request.method == expected_method
26052606
assert request.url == expected_url
26062607
assert request.headers['access_token_auth'] == 'true'
2607-
assert request.headers['X-GOOG-API-CLIENT'] == _utils.get_metrics_header()
2608+
expected_metrics_header = _utils.get_metrics_header() + ' mock-cred-metric-tag'
2609+
assert request.headers['x-goog-api-client'] == expected_metrics_header
26082610

26092611
def _get_url(self, path):
26102612
return '{0}/{1}'.format(messaging._MessagingService.IID_URL, path)

tests/test_ml.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,8 @@ def _assert_request(request, expected_method, expected_url):
339339
assert request.method == expected_method
340340
assert request.url == expected_url
341341
assert request.headers['X-FIREBASE-CLIENT'] == f'fire-admin-python/{firebase_admin.__version__}'
342-
assert request.headers['X-GOOG-API-CLIENT'] == _utils.get_metrics_header()
342+
expected_metrics_header = _utils.get_metrics_header() + ' mock-cred-metric-tag'
343+
assert request.headers['x-goog-api-client'] == expected_metrics_header
343344

344345
class _TestStorageClient:
345346
@staticmethod

0 commit comments

Comments
 (0)