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