Mercurial > hg > orthanc-tests
comparison Plugins/DicomWeb/Run.py @ 367:9d2a63afdb73
Test compliance with DICOM >= 2016c: WADO-RS Retrieve transcodes to Little Endian Explicit by default
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 18 Jan 2021 16:46:39 +0100 |
parents | 79ce0f7a9714 |
children | fd6d805eae37 |
comparison
equal
deleted
inserted
replaced
366:5083a686a8a9 | 367:9d2a63afdb73 |
---|---|
219 | 219 |
220 # Remove the "http://localhost:8042" prefix | 220 # Remove the "http://localhost:8042" prefix |
221 url = a['00081190']['Value'][0] | 221 url = a['00081190']['Value'][0] |
222 url = re.sub(r'(http|https)://[^/]+(/.*)', r'\2', url) | 222 url = re.sub(r'(http|https)://[^/]+(/.*)', r'\2', url) |
223 | 223 |
224 # Get the content-length of all the multiparts of this WADO-RS request | 224 # Get the content-length of all the multiparts of this WADO-RS |
225 b = DoGet(ORTHANC, url).decode('utf-8', 'ignore') | 225 # request (prevent transcoding by setting transfer-syntax to |
226 # "*", necessary since release 1.5 of the DICOMweb plugin) | |
227 b = DoGet(ORTHANC, url, headers = { | |
228 'Accept' : 'multipart/related;type=application/dicom;transfer-syntax=*' | |
229 }).decode('utf-8', 'ignore') | |
226 parts = re.findall(r'^Content-Length:\s*(\d+)\s*', b, re.IGNORECASE | re.MULTILINE) | 230 parts = re.findall(r'^Content-Length:\s*(\d+)\s*', b, re.IGNORECASE | re.MULTILINE) |
227 self.assertEqual(1, len(parts)) | 231 self.assertEqual(1, len(parts)) |
228 self.assertEqual(os.path.getsize(GetDatabasePath('Phenix/IM-0001-0001.dcm')), int(parts[0])) | 232 self.assertEqual(os.path.getsize(GetDatabasePath('Phenix/IM-0001-0001.dcm')), int(parts[0])) |
229 | 233 |
230 | 234 |
1287 | 1291 |
1288 | 1292 |
1289 def test_wado_transcoding(self): | 1293 def test_wado_transcoding(self): |
1290 uri = '/dicom-web%s' % UploadAndGetWadoPath('TransferSyntaxes/1.2.840.10008.1.2.4.50.dcm') | 1294 uri = '/dicom-web%s' % UploadAndGetWadoPath('TransferSyntaxes/1.2.840.10008.1.2.4.50.dcm') |
1291 | 1295 |
1296 compressedSize = os.path.getsize(GetDatabasePath('TransferSyntaxes/1.2.840.10008.1.2.4.50.dcm')) | |
1297 | |
1292 self.assertRaises(Exception, lambda: DoGetMultipart(ORTHANC, '%s' % uri, | 1298 self.assertRaises(Exception, lambda: DoGetMultipart(ORTHANC, '%s' % uri, |
1293 headers = { 'Accept' : 'nope' })) | 1299 headers = { 'Accept' : 'nope' })) |
1294 | 1300 |
1301 # Up to release 1.5 of the DICOMweb plugin, if no | |
1302 # transfer-syntax was specified, no transcoding occured. This | |
1303 # was because of an undefined behavior up to DICOM | |
1304 # 2016b. Starting with DICOM 2016c, the standard explicitly | |
1305 # states that the image should be transcoded to Little Endian | |
1306 # Explicit. | |
1295 a = DoGetMultipart(ORTHANC, '%s' % uri, | 1307 a = DoGetMultipart(ORTHANC, '%s' % uri, |
1296 headers = { }) | 1308 headers = { }) |
1297 self.assertEqual(1, len(a)) | 1309 self.assertEqual(1, len(a)) |
1298 self.assertEqual('1.2.840.10008.1.2.4.50', GetTransferSyntax(a[0])) | 1310 self.assertEqual('1.2.840.10008.1.2.1', GetTransferSyntax(a[0])) |
1299 s = len(a[0]) | 1311 self.assertTrue(10 * compressedSize < len(a[0])) |
1312 uncompressedSize = len(a[0]) | |
1300 | 1313 |
1301 a = DoGetMultipart(ORTHANC, '%s' % uri, | 1314 a = DoGetMultipart(ORTHANC, '%s' % uri, |
1302 headers = { 'Accept' : 'multipart/related' }) | 1315 headers = { 'Accept' : 'multipart/related' }) |
1303 self.assertEqual(1, len(a)) | 1316 self.assertEqual(1, len(a)) |
1304 self.assertEqual('1.2.840.10008.1.2.4.50', GetTransferSyntax(a[0])) | 1317 self.assertEqual('1.2.840.10008.1.2.1', GetTransferSyntax(a[0])) |
1318 self.assertEqual(uncompressedSize, len(a[0])) | |
1305 | 1319 |
1306 a = DoGetMultipart(ORTHANC, '%s' % uri, | 1320 a = DoGetMultipart(ORTHANC, '%s' % uri, |
1307 headers = { 'Accept' : 'multipart/related; type=application/dicom' }) | 1321 headers = { 'Accept' : 'multipart/related; type=application/dicom' }) |
1308 self.assertEqual(1, len(a)) | 1322 self.assertEqual(1, len(a)) |
1309 self.assertEqual('1.2.840.10008.1.2.4.50', GetTransferSyntax(a[0])) | 1323 self.assertEqual('1.2.840.10008.1.2.1', GetTransferSyntax(a[0])) |
1324 self.assertEqual(uncompressedSize, len(a[0])) | |
1310 | 1325 |
1311 a = DoGetMultipart(ORTHANC, '%s' % uri, | 1326 a = DoGetMultipart(ORTHANC, '%s' % uri, |
1312 headers = { 'Accept' : 'multipart/related; type=application/dicom; transfer-syntax=*' }) | 1327 headers = { 'Accept' : 'multipart/related; type=application/dicom; transfer-syntax=*' }) |
1313 self.assertEqual(1, len(a)) | 1328 self.assertEqual(1, len(a)) |
1314 self.assertEqual('1.2.840.10008.1.2.4.50', GetTransferSyntax(a[0])) | 1329 self.assertEqual('1.2.840.10008.1.2.4.50', GetTransferSyntax(a[0])) |
1315 self.assertEqual(s, len(a[0])) | 1330 self.assertEqual(compressedSize, len(a[0])) |
1316 | 1331 |
1332 # Use source transfer syntax | |
1317 a = DoGetMultipart(ORTHANC, '%s' % uri, | 1333 a = DoGetMultipart(ORTHANC, '%s' % uri, |
1318 headers = { 'Accept' : 'multipart/related; type=application/dicom; transfer-syntax=1.2.840.10008.1.2.4.50' }) | 1334 headers = { 'Accept' : 'multipart/related; type=application/dicom; transfer-syntax=1.2.840.10008.1.2.4.50' }) |
1319 self.assertEqual(1, len(a)) | 1335 self.assertEqual(1, len(a)) |
1320 self.assertEqual('1.2.840.10008.1.2.4.50', GetTransferSyntax(a[0])) | 1336 self.assertEqual('1.2.840.10008.1.2.4.50', GetTransferSyntax(a[0])) |
1337 self.assertEqual(compressedSize, len(a[0])) | |
1321 | 1338 |
1322 a = DoGetMultipart(ORTHANC, '%s' % uri, | 1339 a = DoGetMultipart(ORTHANC, '%s' % uri, |
1323 headers = { 'Accept' : 'multipart/related; type=application/dicom; transfer-syntax=1.2.840.10008.1.2.1' }) | 1340 headers = { 'Accept' : 'multipart/related; type=application/dicom; transfer-syntax=1.2.840.10008.1.2.1' }) |
1324 self.assertEqual(1, len(a)) | 1341 self.assertEqual(1, len(a)) |
1325 self.assertEqual('1.2.840.10008.1.2.1', GetTransferSyntax(a[0])) | 1342 self.assertEqual('1.2.840.10008.1.2.1', GetTransferSyntax(a[0])) |
1326 self.assertTrue(10 * s < len(a[0])) | 1343 self.assertEqual(uncompressedSize, len(a[0])) |
1327 | 1344 |
1328 | 1345 # Transcoding |
1346 a = DoGetMultipart(ORTHANC, '%s' % uri, | |
1347 headers = { 'Accept' : 'multipart/related; type=application/dicom; transfer-syntax=1.2.840.10008.1.2.4.57' }) | |
1348 self.assertEqual(1, len(a)) | |
1349 self.assertEqual('1.2.840.10008.1.2.4.57', GetTransferSyntax(a[0])) | |
1350 self.assertNotEqual(compressedSize, len(a[0])) | |
1351 self.assertNotEqual(uncompressedSize, len(a[0])) | |
1352 | |
1353 | |
1329 def test_compare_wado_uri_and_rs(self): | 1354 def test_compare_wado_uri_and_rs(self): |
1330 # https://groups.google.com/d/msg/orthanc-users/mKgr2QAKTCU/R7u4I1LvBAAJ | 1355 # https://groups.google.com/d/msg/orthanc-users/mKgr2QAKTCU/R7u4I1LvBAAJ |
1331 | 1356 |
1332 # Image "2020-08-12-Christopher.dcm" corresponds to the result of: | 1357 # Image "2020-08-12-Christopher.dcm" corresponds to the result of: |
1333 # $ gdcmconv --raw 1.2.840.113704.9.1000.16.2.20190613104005642000100010001.dcm 2020-08-12-Christopher.dcm | 1358 # $ gdcmconv --raw 1.2.840.113704.9.1000.16.2.20190613104005642000100010001.dcm 2020-08-12-Christopher.dcm |