Skip to content

Commit 9af0d5e

Browse files
committed
adding additional params to POST method (store_instances)
1 parent 0d3667c commit 9af0d5e

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

src/dicomweb_client/web.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2778,7 +2778,8 @@ def retrieve_instance(
27782778
def store_instances(
27792779
self,
27802780
datasets: Sequence[pydicom.dataset.Dataset],
2781-
study_instance_uid: Optional[str] = None
2781+
study_instance_uid: Optional[str] = None,
2782+
additional_params: Optional[Dict[str, Any]] = None
27822783
) -> pydicom.dataset.Dataset:
27832784
"""Store instances.
27842785
@@ -2788,6 +2789,8 @@ def store_instances(
27882789
Instances that should be stored
27892790
study_instance_uid: Union[str, None], optional
27902791
Study Instance UID
2792+
additional_params: Union[Dict[str, Any], None], optional
2793+
Additional HTTP POST query parameters
27912794
27922795
Returns
27932796
-------
@@ -2807,6 +2810,12 @@ def _iter_encoded_datasets(datasets):
28072810
message += f' of study "{study_instance_uid}"'
28082811
logger.info(message)
28092812
url = self._get_studies_url(_Transaction.STORE, study_instance_uid)
2813+
# Append query string if additional_params is provided
2814+
if additional_params:
2815+
additional_params_query_string = urlencode(
2816+
additional_params, doseq=True
2817+
)
2818+
url += f'?{additional_params_query_string}'
28102819
encoded_datasets = _iter_encoded_datasets(datasets)
28112820
return self._http_post_multipart_application_dicom(
28122821
url,

tests/test_web.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1307,6 +1307,36 @@ def test_store_instance_error_with_retries(httpserver, client, cache_dir):
13071307
)
13081308

13091309

1310+
def test_store_instance_error_with_retries_and_additional_params(
1311+
httpserver, client, cache_dir
1312+
):
1313+
dataset = pydicom.Dataset.from_json({})
1314+
dataset.is_little_endian = True
1315+
dataset.is_implicit_VR = True
1316+
max_attempts = 2
1317+
client.set_http_retry_params(
1318+
retry=True,
1319+
max_attempts=max_attempts,
1320+
wait_exponential_multiplier=10
1321+
)
1322+
httpserver.serve_content(
1323+
content='',
1324+
code=HTTPStatus.REQUEST_TIMEOUT,
1325+
headers=''
1326+
)
1327+
params = {"key1": ["value1", "value2"], "key2": "value3"}
1328+
with pytest.raises(RetryError):
1329+
client.store_instances([dataset], additional_params=params)
1330+
assert len(httpserver.requests) == max_attempts
1331+
request = httpserver.requests[0]
1332+
assert request.headers['Content-Type'].startswith(
1333+
'multipart/related; type="application/dicom"'
1334+
)
1335+
assert request.query_string.decode() == (
1336+
'key1=value1&key1=value2&key2=value3'
1337+
)
1338+
1339+
13101340
def test_store_instance_error_with_no_retries(httpserver, client, cache_dir):
13111341
dataset = pydicom.Dataset.from_json({})
13121342
dataset.is_little_endian = True
@@ -1326,6 +1356,31 @@ def test_store_instance_error_with_no_retries(httpserver, client, cache_dir):
13261356
)
13271357

13281358

1359+
def test_store_instance_error_with_no_retries_and_additional_params(
1360+
httpserver, client, cache_dir
1361+
):
1362+
dataset = pydicom.Dataset.from_json({})
1363+
dataset.is_little_endian = True
1364+
dataset.is_implicit_VR = True
1365+
client.set_http_retry_params(retry=False)
1366+
httpserver.serve_content(
1367+
content='',
1368+
code=HTTPStatus.REQUEST_TIMEOUT,
1369+
headers=''
1370+
)
1371+
params = {"key1": ["value1", "value2"], "key2": "value3"}
1372+
with pytest.raises(HTTPError):
1373+
client.store_instances([dataset], additional_params=params)
1374+
assert len(httpserver.requests) == 1
1375+
request = httpserver.requests[0]
1376+
assert request.headers['Content-Type'].startswith(
1377+
'multipart/related; type="application/dicom"'
1378+
)
1379+
assert request.query_string.decode() == (
1380+
'key1=value1&key1=value2&key2=value3'
1381+
)
1382+
1383+
13291384
def test_delete_study_error(httpserver, client, cache_dir):
13301385
study_instance_uid = '1.2.3'
13311386
httpserver.serve_content(

0 commit comments

Comments
 (0)