Mercurial > hg > orthanc
diff OrthancFramework/Sources/SystemToolbox.cpp @ 5406:aaf7c49a9ddc am-http-compression
tentative to implement smart HTTP compression with detection of transfer syntax
author | Alain Mazy <am@osimis.io> |
---|---|
date | Sat, 04 Nov 2023 13:42:30 +0100 |
parents | 303e930fff0f |
children |
line wrap: on
line diff
--- a/OrthancFramework/Sources/SystemToolbox.cpp Tue Oct 17 15:06:11 2023 +0200 +++ b/OrthancFramework/Sources/SystemToolbox.cpp Sat Nov 04 13:42:30 2023 +0100 @@ -725,6 +725,80 @@ } } + ContentCompression SystemToolbox::GuessContentCompression(MimeType mime) + { + switch (mime) + { + case MimeType_Css: + case MimeType_Html: + case MimeType_JavaScript: + case MimeType_Json: + case MimeType_Pam: + case MimeType_Pdf: + case MimeType_PlainText: + case MimeType_WebAssembly: + case MimeType_Xml: + case MimeType_PrometheusText: + case MimeType_DicomWebJson: + case MimeType_DicomWebXml: + return ContentCompression_NotCompressed; + case MimeType_Gif: + case MimeType_Jpeg: + case MimeType_Jpeg2000: + case MimeType_Png: + case MimeType_Svg: + case MimeType_Woff: + case MimeType_Woff2: + case MimeType_Zip: + return ContentCompression_AlreadyCompressed; + default: // for all other (DICOM, binary, ...) we actually don't know + return ContentCompression_Unknown; + } + } + + ContentCompression SystemToolbox::GuessContentCompression(const std::string& contentType) + { + if (contentType.empty()) + { + return ContentCompression_Unknown; + } + + if (contentType.find(MIME_JSON) != std::string::npos || + contentType.find(MIME_XML) != std::string::npos || + contentType.find(MIME_DICOM_WEB_JSON) != std::string::npos || + contentType.find(MIME_DICOM_WEB_XML) != std::string::npos || + contentType.find(MIME_PDF) != std::string::npos || + contentType.find(MIME_CSS) != std::string::npos || + contentType.find(MIME_HTML) != std::string::npos || + contentType.find(MIME_JAVASCRIPT) != std::string::npos || + contentType.find(MIME_PLAIN_TEXT) != std::string::npos || + contentType.find(MIME_WEB_ASSEMBLY) != std::string::npos || + contentType.find(MIME_XML_2) != std::string::npos || + contentType.find(MIME_ICO) != std::string::npos) + { + return ContentCompression_NotCompressed; + } + else if (contentType.find(MIME_DICOM) != std::string::npos || // this must happen after the test for MIME_DICOM_WEB_JSON since application/dicom is inside application/dicom+json + contentType.find(MIME_BINARY) != std::string::npos) + { + // For DICOM, it is impossible to know the transfer syntax at this point so we don't know if the data is compressed or not + return ContentCompression_Unknown; + } + else if (contentType.find(MIME_JPEG) != std::string::npos || + contentType.find(MIME_PNG) != std::string::npos || + contentType.find(MIME_GIF) != std::string::npos || + contentType.find(MIME_JPEG2000) != std::string::npos || + contentType.find(MIME_GZIP) != std::string::npos || + contentType.find(MIME_ZIP) != std::string::npos || + contentType.find(MIME_SVG) != std::string::npos || + contentType.find(MIME_WOFF) != std::string::npos || + contentType.find(MIME_WOFF2) != std::string::npos) + { + return ContentCompression_AlreadyCompressed; + } + + return ContentCompression_Unknown; + } MimeType SystemToolbox::AutodetectMimeType(const std::string& path) {