diff --git a/extensions/cornerstone/src/init.tsx b/extensions/cornerstone/src/init.tsx index 4a07f4e635a..98f905ab900 100644 --- a/extensions/cornerstone/src/init.tsx +++ b/extensions/cornerstone/src/init.tsx @@ -166,7 +166,7 @@ export default async function init({ prefetch: appConfig?.maxNumRequests?.prefetch || 10, }; - initWADOImageLoader(userAuthenticationService, appConfig); + initWADOImageLoader(userAuthenticationService, appConfig, extensionManager); /* Measurement Service */ this.measurementServiceSource = connectToolsToMeasurementService( diff --git a/extensions/cornerstone/src/initWADOImageLoader.js b/extensions/cornerstone/src/initWADOImageLoader.js index f5884643dba..8b2aec1cc2c 100644 --- a/extensions/cornerstone/src/initWADOImageLoader.js +++ b/extensions/cornerstone/src/initWADOImageLoader.js @@ -5,7 +5,7 @@ import dicomImageLoader, { webWorkerManager, } from '@cornerstonejs/dicom-image-loader'; import dicomParser from 'dicom-parser'; -import { errorHandler } from '@ohif/core'; +import { errorHandler, utils } from '@ohif/core'; const { registerVolumeLoader } = volumeLoader; @@ -35,7 +35,8 @@ function initWebWorkers(appConfig) { export default function initWADOImageLoader( userAuthenticationService, - appConfig + appConfig, + extensionManager ) { dicomImageLoader.external.cornerstone = cornerstone; dicomImageLoader.external.dicomParser = dicomParser; @@ -55,18 +56,18 @@ export default function initWADOImageLoader( convertFloatPixelDataToInt: false, }, beforeSend: function(xhr) { + //TODO should be removed in the future and request emitted by DicomWebDataSource + const sourceConfig = + extensionManager.getActiveDataSource()?.[0].getConfig() ?? {}; const headers = userAuthenticationService.getAuthorizationHeader(); + const acceptHeader = utils.generateAcceptHeader( + sourceConfig.acceptHeader, + sourceConfig.requestTransferSyntaxUID, + sourceConfig.omitQuotationForMultipartRequest + ); - // Request: - // JPEG-LS Lossless (1.2.840.10008.1.2.4.80) if available, otherwise accept - // whatever transfer-syntax the origin server provides. - // For now we use image/jls and image/x-jls because some servers still use the old type - // http://dicom.nema.org/medical/dicom/current/output/html/part18.html const xhrRequestHeaders = { - Accept: appConfig.omitQuotationForMultipartRequest - ? 'multipart/related; type=application/octet-stream' - : 'multipart/related; type="application/octet-stream"', - // 'multipart/related; type="image/x-jls", multipart/related; type="image/jls"; transfer-syntax="1.2.840.10008.1.2.4.80", multipart/related; type="image/x-jls", multipart/related; type="application/octet-stream"; transfer-syntax=*', + Accept: acceptHeader, }; if (headers) { diff --git a/extensions/default/src/DicomWebDataSource/index.js b/extensions/default/src/DicomWebDataSource/index.js index 00f82841ed6..cc4fe162e0e 100644 --- a/extensions/default/src/DicomWebDataSource/index.js +++ b/extensions/default/src/DicomWebDataSource/index.js @@ -60,15 +60,42 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) { supportsReject, staticWado, singlepart, + omitQuotationForMultipartRequest, + acceptHeader, + requestTransferSyntaxUID, } = dicomWebConfig; const dicomWebConfigCopy = JSON.parse(JSON.stringify(dicomWebConfig)); + const getAuthrorizationHeader = () => { + const xhrRequestHeaders = {}; + const authHeaders = userAuthenticationService.getAuthorizationHeader(); + if (authHeaders && authHeaders.Authorization) { + xhrRequestHeaders.Authorization = authHeaders.Authorization; + } + return xhrRequestHeaders; + }; + + const generateWadoHeader = () => { + let authorizationHeader = getAuthrorizationHeader(); + //Generate accept header depending on config params + let formattedAcceptHeader = utils.generateAcceptHeader( + acceptHeader, + requestTransferSyntaxUID, + omitQuotationForMultipartRequest + ); + + return { + ...authorizationHeader, + Accept: formattedAcceptHeader, + }; + }; + const qidoConfig = { url: qidoRoot, staticWado, singlepart, - headers: userAuthenticationService.getAuthorizationHeader(), + headers: getAuthrorizationHeader(), errorInterceptor: errorHandler.getHTTPErrorHandler(), }; @@ -76,7 +103,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) { url: wadoRoot, staticWado, singlepart, - headers: userAuthenticationService.getAuthorizationHeader(), + headers: generateWadoHeader(), errorInterceptor: errorHandler.getHTTPErrorHandler(), }; @@ -110,11 +137,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) { studies: { mapParams: mapParams.bind(), search: async function(origParams) { - const headers = userAuthenticationService.getAuthorizationHeader(); - if (headers) { - qidoDicomWebClient.headers = headers; - } - + qidoDicomWebClient.headers = getAuthrorizationHeader(); const { studyInstanceUid, seriesInstanceUid, ...mappedParams } = mapParams(origParams, { supportsFuzzyMatching, @@ -135,11 +158,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) { series: { // mapParams: mapParams.bind(), search: async function(studyInstanceUid) { - const headers = userAuthenticationService.getAuthorizationHeader(); - if (headers) { - qidoDicomWebClient.headers = headers; - } - + qidoDicomWebClient.headers = getAuthrorizationHeader(); const results = await seriesInStudy( qidoDicomWebClient, studyInstanceUid @@ -151,11 +170,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) { }, instances: { search: (studyInstanceUid, queryParameters) => { - const headers = userAuthenticationService.getAuthorizationHeader(); - if (headers) { - qidoDicomWebClient.headers = headers; - } - + qidoDicomWebClient.headers = getAuthrorizationHeader(); qidoSearch.call( undefined, qidoDicomWebClient, @@ -182,6 +197,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) { return getDirectURL({ wadoRoot, singlepart }, params); }, bulkDataURI: async ({ StudyInstanceUID, BulkDataURI }) => { + qidoDicomWebClient.headers = getAuthrorizationHeader(); const options = { multipart: false, BulkDataURI, @@ -200,11 +216,6 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) { sortFunction, madeInClient = false, } = {}) => { - const headers = userAuthenticationService.getAuthorizationHeader(); - if (headers) { - wadoDicomWebClient.headers = headers; - } - if (!StudyInstanceUID) { throw new Error( 'Unable to query for SeriesMetadata without StudyInstanceUID' @@ -234,17 +245,12 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) { store: { dicom: async (dataset, request) => { - const headers = userAuthenticationService.getAuthorizationHeader(); - if (headers) { - wadoDicomWebClient.headers = headers; - } - + wadoDicomWebClient.headers = generateWadoHeader(); if (dataset instanceof ArrayBuffer) { const options = { datasets: [dataset], request, }; - await wadoDicomWebClient.storeInstances(options); } else { const meta = { @@ -282,7 +288,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) { madeInClient ) => { const enableStudyLazyLoad = false; - + wadoDicomWebClient.headers = generateWadoHeader(); // data is all SOPInstanceUIDs const data = await retrieveStudyMetadata( wadoDicomWebClient, @@ -353,6 +359,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) { madeInClient = false ) => { const enableStudyLazyLoad = true; + wadoDicomWebClient.headers = generateWadoHeader(); // Get Series const { preLoadData: seriesSummaryMetadata, diff --git a/platform/app/public/config/aws.js b/platform/app/public/config/aws.js index 35ffbde5ca6..cfd097d8aac 100644 --- a/platform/app/public/config/aws.js +++ b/platform/app/public/config/aws.js @@ -4,7 +4,7 @@ window.config = { modes: [], showStudyList: true, // below flag is for performance reasons, but it might not work for all servers - omitQuotationForMultipartRequest: true, + showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, @@ -30,6 +30,7 @@ window.config = { supportsFuzzyMatching: false, supportsWildcard: false, staticWado: true, + omitQuotationForMultipartRequest: true, }, }, { diff --git a/platform/app/public/config/default.js b/platform/app/public/config/default.js index 8ff91875b8d..11de5018ae6 100644 --- a/platform/app/public/config/default.js +++ b/platform/app/public/config/default.js @@ -11,7 +11,6 @@ window.config = { // some windows systems have issues with more than 3 web workers maxNumberOfWebWorkers: 3, // below flag is for performance reasons, but it might not work for all servers - omitQuotationForMultipartRequest: true, showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, @@ -51,7 +50,6 @@ window.config = { wadoUriRoot: 'https://d33do7qe4w26qo.cloudfront.net/dicomweb', qidoRoot: 'https://d33do7qe4w26qo.cloudfront.net/dicomweb', wadoRoot: 'https://d33do7qe4w26qo.cloudfront.net/dicomweb', - qidoSupportsIncludeField: false, supportsReject: false, imageRendering: 'wadors', @@ -68,6 +66,7 @@ window.config = { enabled: true, relativeResolution: 'studies', }, + omitQuotationForMultipartRequest: true, }, }, { diff --git a/platform/app/public/config/demo.js b/platform/app/public/config/demo.js index b4d43b86195..5c10b63d8db 100644 --- a/platform/app/public/config/demo.js +++ b/platform/app/public/config/demo.js @@ -4,7 +4,6 @@ window.config = { extensions: [], showStudyList: true, // below flag is for performance reasons, but it might not work for all servers - omitQuotationForMultipartRequest: true, showWarningMessageForCrossOrigin: true, strictZSpacingForVolumeViewport: true, showCPUFallbackMessage: true, @@ -25,6 +24,7 @@ window.config = { bulkDataURI: { enabled: false, }, + omitQuotationForMultipartRequest: true, }, }, ], diff --git a/platform/app/public/config/dicomweb-server.js b/platform/app/public/config/dicomweb-server.js index 4db99041765..0716e3da150 100644 --- a/platform/app/public/config/dicomweb-server.js +++ b/platform/app/public/config/dicomweb-server.js @@ -4,7 +4,6 @@ window.config = { modes: [], showStudyList: true, // below flag is for performance reasons, but it might not work for all servers - omitQuotationForMultipartRequest: true, showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, @@ -28,6 +27,7 @@ window.config = { enableStudyLazyLoad: true, supportsFuzzyMatching: false, supportsWildcard: false, + omitQuotationForMultipartRequest: true, }, }, { diff --git a/platform/app/public/config/dicomweb_relative.js b/platform/app/public/config/dicomweb_relative.js index af024abd70f..ce4d1724d0a 100644 --- a/platform/app/public/config/dicomweb_relative.js +++ b/platform/app/public/config/dicomweb_relative.js @@ -5,7 +5,6 @@ window.config = { showStudyList: true, maxNumberOfWebWorkers: 3, // below flag is for performance reasons, but it might not work for all servers - omitQuotationForMultipartRequest: true, showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, @@ -31,6 +30,7 @@ window.config = { supportsWildcard: true, staticWado: true, singlepart: 'bulkdata,video,pdf', + omitQuotationForMultipartRequest: true, }, }, { diff --git a/platform/app/public/config/docker_nginx-orthanc.js b/platform/app/public/config/docker_nginx-orthanc.js index 60d7f083ce4..a9fc8e4d747 100644 --- a/platform/app/public/config/docker_nginx-orthanc.js +++ b/platform/app/public/config/docker_nginx-orthanc.js @@ -4,7 +4,6 @@ window.config = { extensions: [], modes: [], // below flag is for performance reasons, but it might not work for all servers - omitQuotationForMultipartRequest: true, showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, @@ -23,6 +22,7 @@ window.config = { qidoSupportsIncludeField: false, imageRendering: 'wadors', thumbnailRendering: 'wadors', + omitQuotationForMultipartRequest: true, }, }, { diff --git a/platform/app/public/config/docker_openresty-orthanc-keycloak.js b/platform/app/public/config/docker_openresty-orthanc-keycloak.js index 07709a7ebef..31786e2626a 100644 --- a/platform/app/public/config/docker_openresty-orthanc-keycloak.js +++ b/platform/app/public/config/docker_openresty-orthanc-keycloak.js @@ -2,7 +2,6 @@ window.config = { routerBasename: '/', showStudyList: true, // below flag is for performance reasons, but it might not work for all servers - omitQuotationForMultipartRequest: true, showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, @@ -18,6 +17,7 @@ window.config = { qidoSupportsIncludeField: false, imageRendering: 'wadors', thumbnailRendering: 'wadors', + omitQuotationForMultipartRequest: true, // REQUIRED TAG: // TODO: Remove tag after https://github.com/OHIF/ohif-core/pull/19 is merged and we bump version // requestOptions: { diff --git a/platform/app/public/config/docker_openresty-orthanc.js b/platform/app/public/config/docker_openresty-orthanc.js index 33e41387792..08d61f00e15 100644 --- a/platform/app/public/config/docker_openresty-orthanc.js +++ b/platform/app/public/config/docker_openresty-orthanc.js @@ -4,7 +4,7 @@ window.config = { extensions: [], modes: [], // below flag is for performance reasons, but it might not work for all servers - omitQuotationForMultipartRequest: true, + showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, @@ -23,6 +23,7 @@ window.config = { qidoSupportsIncludeField: false, imageRendering: 'wadors', thumbnailRendering: 'wadors', + omitQuotationForMultipartRequest: true, }, }, { diff --git a/platform/app/public/config/e2e.js b/platform/app/public/config/e2e.js index 47903374cb2..88d64b439af 100644 --- a/platform/app/public/config/e2e.js +++ b/platform/app/public/config/e2e.js @@ -4,7 +4,6 @@ window.config = { modes: ['@ohif/mode-test'], showStudyList: true, // below flag is for performance reasons, but it might not work for all servers - omitQuotationForMultipartRequest: true, maxNumberOfWebWorkers: 3, showWarningMessageForCrossOrigin: false, showCPUFallbackMessage: false, @@ -31,6 +30,7 @@ window.config = { supportsFuzzyMatching: false, supportsWildcard: true, singlepart: 'video,thumbnail,pdf', + omitQuotationForMultipartRequest: true, }, }, { diff --git a/platform/app/public/config/google.js b/platform/app/public/config/google.js index 847e08ebbd0..86ec59daac6 100644 --- a/platform/app/public/config/google.js +++ b/platform/app/public/config/google.js @@ -6,7 +6,6 @@ window.config = { }, enableGoogleCloudAdapter: false, // below flag is for performance reasons, but it might not work for all servers - omitQuotationForMultipartRequest: true, showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, @@ -55,6 +54,7 @@ window.config = { supportsFuzzyMatching: true, supportsWildcard: false, dicomUploadEnabled: true, + omitQuotationForMultipartRequest: true, }, }, { diff --git a/platform/app/public/config/idc.js b/platform/app/public/config/idc.js index 6056962bd75..2760b60df01 100644 --- a/platform/app/public/config/idc.js +++ b/platform/app/public/config/idc.js @@ -2,7 +2,6 @@ window.config = { routerBasename: '/', enableGoogleCloudAdapter: true, // below flag is for performance reasons, but it might not work for all servers - omitQuotationForMultipartRequest: true, showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, diff --git a/platform/app/public/config/local_dcm4chee.js b/platform/app/public/config/local_dcm4chee.js index 763604ffdfd..45145000e6c 100644 --- a/platform/app/public/config/local_dcm4chee.js +++ b/platform/app/public/config/local_dcm4chee.js @@ -8,7 +8,6 @@ window.config = { extensions: [], modes: [], // below flag is for performance reasons, but it might not work for all servers - omitQuotationForMultipartRequest: true, showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, @@ -39,6 +38,7 @@ window.config = { bulkDataURI: { enabled: true, }, + omitQuotationForMultipartRequest: true, }, }, { diff --git a/platform/app/public/config/local_static.js b/platform/app/public/config/local_static.js index 6774e1b9a08..7b52732d212 100644 --- a/platform/app/public/config/local_static.js +++ b/platform/app/public/config/local_static.js @@ -8,7 +8,6 @@ window.config = { showStudyList: true, maxNumberOfWebWorkers: 4, // below flag is for performance reasons, but it might not work for all servers - omitQuotationForMultipartRequest: true, showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, @@ -33,6 +32,7 @@ window.config = { supportsWildcard: true, staticWado: true, singlepart: 'bulkdata,video,pdf', + omitQuotationForMultipartRequest: true, }, }, { diff --git a/platform/app/public/config/multiple.js b/platform/app/public/config/multiple.js index 07a28426444..552ba47bba9 100644 --- a/platform/app/public/config/multiple.js +++ b/platform/app/public/config/multiple.js @@ -16,7 +16,6 @@ window.config = { showStudyList: true, maxNumberOfWebWorkers: 4, // below flag is for performance reasons, but it might not work for all servers - omitQuotationForMultipartRequest: true, showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, @@ -42,6 +41,7 @@ window.config = { supportsWildcard: true, staticWado: true, singlepart: 'bulkdata,video,pdf', + omitQuotationForMultipartRequest: true, }, }, { diff --git a/platform/app/public/config/netlify.js b/platform/app/public/config/netlify.js index 1bc23c049d9..ec386500b98 100644 --- a/platform/app/public/config/netlify.js +++ b/platform/app/public/config/netlify.js @@ -4,7 +4,6 @@ window.config = { modes: [], showStudyList: true, // below flag is for performance reasons, but it might not work for all servers - omitQuotationForMultipartRequest: true, showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, @@ -38,6 +37,7 @@ window.config = { enabled: true, relativeResolution: 'studies', }, + omitQuotationForMultipartRequest: true, }, }, { diff --git a/platform/app/public/config/public_dicomweb.js b/platform/app/public/config/public_dicomweb.js index 322d8968465..2dc7503744f 100644 --- a/platform/app/public/config/public_dicomweb.js +++ b/platform/app/public/config/public_dicomweb.js @@ -2,7 +2,6 @@ window.config = { routerBasename: '/', showStudyList: true, // below flag is for performance reasons, but it might not work for all servers - omitQuotationForMultipartRequest: true, showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, @@ -18,6 +17,7 @@ window.config = { imageRendering: 'wadors', thumbnailRendering: 'wadors', supportsFuzzyMatching: true, + omitQuotationForMultipartRequest: true, }, ], }, diff --git a/platform/core/src/utils/generateAcceptHeader.ts b/platform/core/src/utils/generateAcceptHeader.ts new file mode 100644 index 00000000000..7de0607261f --- /dev/null +++ b/platform/core/src/utils/generateAcceptHeader.ts @@ -0,0 +1,58 @@ +const generateAcceptHeader = ( + configAcceptHeader = [], + requestTransferSyntaxUID = null, + omitQuotationForMultipartRequest = false +): string[] => { + //if acceptedHeader is passed by config use it as it. + if (configAcceptHeader.length > 0) { + return configAcceptHeader; + } + + let acceptHeader = ['multipart/related']; + if (requestTransferSyntaxUID && typeForTS[requestTransferSyntaxUID]) { + const type = typeForTS[requestTransferSyntaxUID]; + acceptHeader.push('type=' + type); + acceptHeader.push('transfer-syntax=' + requestTransferSyntaxUID); + } else { + acceptHeader.push('type=application/octet-stream'); + } + + if (!omitQuotationForMultipartRequest) { + //need to add quotation for each mime type of each accept entry + acceptHeader = acceptHeader.map(mime => { + if (mime.startsWith('type=')) { + const quotedParam = 'type="' + mime.substring(5, mime.length) + '"'; + return quotedParam; + } + if (mime.startsWith('transfer-syntax=')) { + const quotedParam = + 'transfer-syntax="' + mime.substring(16, mime.length) + '"'; + return quotedParam; + } else { + return mime; + } + }); + } + + return [acceptHeader.join('; ')]; +}; + +const typeForTS = { + '*': 'application/octet-stream', + '1.2.840.10008.1.2.1': 'application/octet-stream', + '1.2.840.10008.1.2': 'application/octet-stream', + '1.2.840.10008.1.2.2': 'application/octet-stream', + '1.2.840.10008.1.2.4.70': 'image/jpeg', + '1.2.840.10008.1.2.4.50': 'image/jpeg', + '1.2.840.10008.1.2.4.51': 'image/dicom+jpeg', + '1.2.840.10008.1.2.4.57': 'image/jpeg', + '1.2.840.10008.1.2.5': 'image/dicom-rle', + '1.2.840.10008.1.2.4.80': 'image/jls', + '1.2.840.10008.1.2.4.81': 'image/jls', + '1.2.840.10008.1.2.4.90': 'image/jp2', + '1.2.840.10008.1.2.4.91': 'image/jp2', + '1.2.840.10008.1.2.4.92': 'image/jpx', + '1.2.840.10008.1.2.4.93': 'image/jpx', +}; + +export default generateAcceptHeader; diff --git a/platform/core/src/utils/index.js b/platform/core/src/utils/index.js index 06e7537f3b1..4b801d05427 100644 --- a/platform/core/src/utils/index.js +++ b/platform/core/src/utils/index.js @@ -13,6 +13,7 @@ import Queue from './Queue'; import isDicomUid from './isDicomUid'; import formatDate from './formatDate'; import formatPN from './formatPN'; +import generateAcceptHeader from './generateAcceptHeader'; import resolveObjectPath from './resolveObjectPath'; import hierarchicalListUtils from './hierarchicalListUtils'; import progressTrackingUtils from './progressTrackingUtils'; @@ -74,6 +75,7 @@ const utils = { subscribeToNextViewportGridChange, splitComma, getSplitParam, + generateAcceptHeader, }; export { @@ -105,6 +107,7 @@ export { downloadCSVReport, splitComma, getSplitParam, + generateAcceptHeader, }; export default utils; diff --git a/platform/core/src/utils/index.test.js b/platform/core/src/utils/index.test.js index b3c3e1e26e8..5620a0fa2fd 100644 --- a/platform/core/src/utils/index.test.js +++ b/platform/core/src/utils/index.test.js @@ -24,6 +24,7 @@ describe('Top level exports', () => { 'b64toBlob', 'formatDate', 'formatPN', + 'generateAcceptHeader', 'isEqualWithin', //'loadAndCacheDerivedDisplaySets', 'isDisplaySetReconstructable', diff --git a/platform/docs/docs/configuration/configurationFiles.md b/platform/docs/docs/configuration/configurationFiles.md index b195e46f4cf..5b581553295 100644 --- a/platform/docs/docs/configuration/configurationFiles.md +++ b/platform/docs/docs/configuration/configurationFiles.md @@ -48,6 +48,7 @@ window.config = { enableStudyLazyLoad: true, supportsFuzzyMatching: true, supportsWildcard: true, + omitQuotationForMultipartRequest: true, }, }, ], @@ -97,6 +98,7 @@ window.config = ({ servicesManager } = {}) => { enableStudyLazyLoad: true, supportsFuzzyMatching: true, supportsWildcard: true, + omitQuotationForMultipartRequest: true, }, }, ], @@ -112,6 +114,8 @@ Here are a list of some options available: - `maxNumberOfWebWorkers`: The maximum number of web workers to use for decoding. Defaults to minimum of `navigator.hardwareConcurrency` and what is specified by `maxNumberOfWebWorkers`. Some windows machines require smaller values. +- `acceptHeader` : accept header to request specific dicom transfer syntax ex : [ 'multipart/related; type=image/jls; q=1', 'multipart/related; type=application/octet-stream; q=0.1' ] +- `requestTransferSyntaxUID` : Request a specific Tansfer syntax from dicom web server ex: 1.2.840.10008.1.2.4.80 (applyed only if acceptHeader is not set) - `omitQuotationForMultipartRequest`: Some servers (e.g., .NET) require the `multipart/related` request to be sent without quotation marks. Defaults to `false`. If your server doesn't require this, then setting this flag to `true` might improve performance (by removing the need for preflight requests). Also note that if auth headers are used, a preflight request is required. - `maxNumRequests`: The maximum number of requests to allow in parallel. It is an object with keys of `interaction`, `thumbnail`, and `prefetch`. You can specify a specific number for each type.