Skip to content

Commit ac48c65

Browse files
Aaron Gabriel Neyerbusunkim96
andauthored
feat: allow extra_api_info to be passed to api request (#183)
* feat: allow extra_api_info to be passed to api request * add doc string Co-authored-by: Bu Sun Kim <8822365+busunkim96@users.noreply.github.com>
1 parent 7c575c0 commit ac48c65

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

packages/google-cloud-core/google/cloud/_http/__init__.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ def _make_request(
282282
headers=None,
283283
target_object=None,
284284
timeout=_DEFAULT_TIMEOUT,
285+
extra_api_info=None,
285286
):
286287
"""A low level method to send a request to the API.
287288
@@ -317,6 +318,10 @@ def _make_request(
317318
Can also be passed as a tuple (connect_timeout, read_timeout).
318319
See :meth:`requests.Session.request` documentation for details.
319320
321+
:type extra_api_info: string
322+
:param extra_api_info: (optional) Extra api info to be appended to
323+
the X-Goog-API-Client header
324+
320325
:rtype: :class:`requests.Response`
321326
:returns: The HTTP response.
322327
"""
@@ -327,7 +332,10 @@ def _make_request(
327332
if content_type:
328333
headers["Content-Type"] = content_type
329334

330-
headers[CLIENT_INFO_HEADER] = self.user_agent
335+
if extra_api_info:
336+
headers[CLIENT_INFO_HEADER] = f"{self.user_agent} {extra_api_info}"
337+
else:
338+
headers[CLIENT_INFO_HEADER] = self.user_agent
331339
headers["User-Agent"] = self.user_agent
332340

333341
return self._do_request(
@@ -385,6 +393,7 @@ def api_request(
385393
expect_json=True,
386394
_target_object=None,
387395
timeout=_DEFAULT_TIMEOUT,
396+
extra_api_info=None,
388397
):
389398
"""Make a request over the HTTP transport to the API.
390399
@@ -446,6 +455,10 @@ def api_request(
446455
Can also be passed as a tuple (connect_timeout, read_timeout).
447456
See :meth:`requests.Session.request` documentation for details.
448457
458+
:type extra_api_info: string
459+
:param extra_api_info: (optional) Extra api info to be appended to
460+
the X-Goog-API-Client header
461+
449462
:raises ~google.cloud.exceptions.GoogleCloudError: if the response code
450463
is not 200 OK.
451464
:raises ValueError: if the response content type is not JSON.
@@ -474,6 +487,7 @@ def api_request(
474487
headers=headers,
475488
target_object=_target_object,
476489
timeout=timeout,
490+
extra_api_info=extra_api_info,
477491
)
478492

479493
if not 200 <= response.status_code < 300:

packages/google-cloud-core/tests/unit/test__http.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,31 @@ def test_api_request_w_timeout(self):
575575
timeout=(2.2, 3.3),
576576
)
577577

578+
def test_api_request_w_extra_api_info(self):
579+
from google.cloud._http import CLIENT_INFO_HEADER
580+
581+
session = make_requests_session([self.EMPTY_JSON_RESPONSE])
582+
client = mock.Mock(_http=session, spec=["_http"])
583+
conn = self._make_mock_one(client)
584+
585+
EXTRA_API_INFO = "gccl-invocation-id/testing-id-123"
586+
result = conn.api_request("GET", "/", extra_api_info=EXTRA_API_INFO)
587+
588+
self.assertEqual(result, {})
589+
590+
expected_headers = {
591+
"Accept-Encoding": "gzip",
592+
"User-Agent": conn.user_agent,
593+
CLIENT_INFO_HEADER: f"{conn.user_agent} {EXTRA_API_INFO}",
594+
}
595+
session.request.assert_called_once_with(
596+
method="GET",
597+
url=mock.ANY,
598+
headers=expected_headers,
599+
data=None,
600+
timeout=self._get_default_timeout(),
601+
)
602+
578603
def test_api_request_w_404(self):
579604
from google.cloud import exceptions
580605

0 commit comments

Comments
 (0)