chore: Correct x-goog-api-client header logic (#876) · firebase/firebase-admin-python@70013c8

14 files changed

lines changed

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

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):

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):

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
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')

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
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(

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)

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)

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