Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add content/accept headers to appropriate http requests #2088

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions qiskit_ibm_runtime/api/rest/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ class RestAdapterBase:

_HEADER_JSON_CONTENT = {"Content-Type": "application/json"}

_HEADER_JSON_ACCEPT = {"Accept": "application/json"}

_HEADER_API_VERSION = {"IBM-API-Version": "2024-01-01"}

def __init__(self, session: RetrySession, prefix_url: str = "") -> None:
"""RestAdapterBase constructor.

Expand All @@ -31,6 +35,7 @@ def __init__(self, session: RetrySession, prefix_url: str = "") -> None:
prefix_url: String to be prepend to all URLs.
"""
self.session = session
self.session.headers = self._HEADER_API_VERSION
self.prefix_url = prefix_url

def get_url(self, identifier: str) -> str:
Expand Down
8 changes: 4 additions & 4 deletions qiskit_ibm_runtime/api/rest/cloud_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def configuration(self) -> Dict[str, Any]:
JSON response of backend configuration.
"""
url = self.get_url("configuration")
return self.session.get(url).json()
return self.session.get(url, headers=self._HEADER_JSON_ACCEPT).json()

def properties(self, datetime: Optional[python_datetime] = None) -> Dict[str, Any]:
"""Return backend properties.
Expand All @@ -61,7 +61,7 @@ def properties(self, datetime: Optional[python_datetime] = None) -> Dict[str, An
if datetime:
params["updated_before"] = datetime.isoformat()

response = self.session.get(url, params=params).json()
response = self.session.get(url, params=params, headers=self._HEADER_JSON_ACCEPT).json()
# Adjust name of the backend.
if response:
response["backend_name"] = self.backend_name
Expand All @@ -74,7 +74,7 @@ def pulse_defaults(self) -> Dict[str, Any]:
JSON response of pulse defaults.
"""
url = self.get_url("pulse_defaults")
return self.session.get(url).json()
return self.session.get(url, headers=self._HEADER_JSON_ACCEPT).json()

def status(self) -> Dict[str, Any]:
"""Return backend status.
Expand All @@ -83,7 +83,7 @@ def status(self) -> Dict[str, Any]:
JSON response of backend status.
"""
url = self.get_url("status")
response = self.session.get(url).json()
response = self.session.get(url, headers=self._HEADER_JSON_ACCEPT).json()
# Adjust fields according to the specs (BackendStatus).
ret = {
"backend_name": self.backend_name,
Expand Down
11 changes: 8 additions & 3 deletions qiskit_ibm_runtime/api/rest/program_job.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,10 @@ def get(self, exclude_params: bool = None) -> Dict:
payload = {}
if exclude_params:
payload["exclude_params"] = "true"
return self.session.get(self.get_url("self"), params=payload).json(cls=RuntimeDecoder)

return self.session.get(
self.get_url("self"), params=payload, headers=self._HEADER_JSON_ACCEPT
).json(cls=RuntimeDecoder)

def delete(self) -> None:
"""Delete program job."""
Expand Down Expand Up @@ -98,12 +101,14 @@ def metadata(self) -> Dict:
Returns:
Job Metadata.
"""
return self.session.get(self.get_url("metrics")).json()
return self.session.get(self.get_url("metrics"), headers=self._HEADER_JSON_ACCEPT).json()

def update_tags(self, tags: list) -> Response:
"""Update job tags.

Returns:
API Response.
"""
return self.session.put(self.get_url("tags"), data=json.dumps({"tags": tags}))
return self.session.put(
self.get_url("tags"), data=json.dumps({"tags": tags}), headers=self._HEADER_JSON_CONTENT
)
12 changes: 8 additions & 4 deletions qiskit_ibm_runtime/api/rest/root.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ def hubs(self) -> List[Dict[str, Any]]:
JSON response.
"""
url = self.get_url("hubs")
return self.session.get(url).json()

return self.session.get(url, headers=self._HEADER_JSON_ACCEPT).json()

def version(self) -> Dict[str, Union[str, bool]]:
"""Return the version information.
Expand All @@ -69,7 +70,7 @@ def version(self) -> Dict[str, Union[str, bool]]:
* ``api-*`` (str): The versions of each individual API component
"""
url = self.get_url("version")
response = self.session.get(url)
response = self.session.get(url, headers=self._HEADER_JSON_ACCEPT)

try:
version_info = response.json()
Expand All @@ -89,7 +90,9 @@ def login(self, api_token: str) -> Dict[str, Any]:
JSON response.
"""
url = self.get_url("login")
return self.session.post(url, json={"apiToken": api_token}).json()
return self.session.post(
url, json={"apiToken": api_token}, headers=self._HEADER_JSON_CONTENT
).json()

def user_info(self) -> Dict[str, Any]:
"""Return user information.
Expand All @@ -98,6 +101,7 @@ def user_info(self) -> Dict[str, Any]:
JSON response of user information.
"""
url = self.get_url("user_info")
response = self.session.get(url).json()

response = self.session.get(url, headers=self._HEADER_JSON_ACCEPT).json()

return response
12 changes: 8 additions & 4 deletions qiskit_ibm_runtime/api/rest/runtime.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,9 @@ def program_run(
if private:
payload["private"] = True
data = json.dumps(payload, cls=RuntimeEncoder)
return self.session.post(url, data=data, timeout=900).json()
return self.session.post(
url, data=data, timeout=900, headers=self._HEADER_JSON_CONTENT
).json()

def jobs_get(
self,
Expand Down Expand Up @@ -195,7 +197,7 @@ def jobs_get(
payload["sort"] = "ASC"
if all([hub, group, project]):
payload["provider"] = f"{hub}/{group}/{project}"
return self.session.get(url, params=payload).json()
return self.session.get(url, params=payload, headers=self._HEADER_JSON_ACCEPT).json()

def backend(self, backend_name: str) -> CloudBackend:
"""Return an adapter for the IBM backend.
Expand Down Expand Up @@ -226,7 +228,9 @@ def backends(
params = {}
if hgp:
params["provider"] = hgp
return self.session.get(url, params=params, timeout=timeout).json()
return self.session.get(
url, params=params, timeout=timeout, headers=self._HEADER_JSON_ACCEPT
).json()

def usage(self) -> Dict[str, Any]:
"""Return monthly open plan usage information.
Expand All @@ -235,4 +239,4 @@ def usage(self) -> Dict[str, Any]:
JSON response.
"""
url = self.get_url("usage")
return self.session.get(url).json()
return self.session.get(url, headers=self._HEADER_JSON_ACCEPT).json()
7 changes: 4 additions & 3 deletions qiskit_ibm_runtime/api/rest/runtime_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ def create(
payload["max_session_ttl"] = max_time # type: ignore[assignment]
else:
payload["max_ttl"] = max_time # type: ignore[assignment]
return self.session.post(url, json=payload).json()
return self.session.post(url, json=payload, headers=self._HEADER_JSON_CONTENT).json()

def cancel(self) -> None:
"""Cancel all jobs in the session."""
Expand All @@ -74,7 +74,7 @@ def close(self) -> None:
payload = {"accepting_jobs": False}
url = self.get_url("self")
try:
self.session.patch(url, json=payload)
self.session.patch(url, json=payload, headers=self._HEADER_JSON_CONTENT)
except RequestsApiError as ex:
if ex.status_code == 404:
pass
Expand All @@ -83,4 +83,5 @@ def close(self) -> None:

def details(self) -> Dict[str, Any]:
"""Return the details of this session."""
return self.session.get(self.get_url("self")).json()

return self.session.get(self.get_url("self"), headers=self._HEADER_JSON_ACCEPT).json()
5 changes: 5 additions & 0 deletions test/unit/test_runtime_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,8 @@ def test_custom_client_app_header(self):
client._session.custom_header = None
client._session._set_custom_header()
self.assertNotIn(custom_header, client._session.headers["X-Qx-Client-Application"])

def test_header_api_version(self):
"""Test IBM-API-Version is in header."""
client = self._get_client()
self.assertIn("IBM-API-Version", client._session.headers)
Loading