diff --git a/CHANGES.md b/CHANGES.md index 8422951f3..a653d3cd9 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,7 @@ ##### Additions :tada: - Added `requestHeaders` field to `TilesetOptions` to allow per-tileset request headers to be specified. +- Added `requestHeaders` field to `RasterOverlayOptions` to allow per-raster-overlay request headers to be specified. ### v0.44.0 - 2025-02-03 diff --git a/CesiumAsync/include/CesiumAsync/IAssetAccessor.h b/CesiumAsync/include/CesiumAsync/IAssetAccessor.h index 6d5683c68..eadadb268 100644 --- a/CesiumAsync/include/CesiumAsync/IAssetAccessor.h +++ b/CesiumAsync/include/CesiumAsync/IAssetAccessor.h @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -68,6 +69,45 @@ class CESIUMASYNC_API IAssetAccessor { * dispatch requests, this method does not need to do anything. */ virtual void tick() noexcept = 0; + + /** + * @brief Merges two vectors of HTTP headers together, with one vector of + * headers overriding a base vector of headers if both contain headers with + * the same name. + * + * @param baseHeaders The base set of HTTP headers. + * @param overrideHeaders The override vector of HTTP headers. If any header + * names in this vector are also included in the `baseHeaders` vector, the + * values of the override headers will be used instead. + * + * @returns A new vector of headers combining headers from the two vectors + * passed in. + */ + static std::vector mergeHeaders( + const std::vector& baseHeaders, + const std::vector& overrideHeaders) { + std::vector headers; + headers.reserve(std::max(baseHeaders.size(), overrideHeaders.size())); + + std::set overrideHeaderNames; + for (auto& [name, value] : overrideHeaders) { + overrideHeaderNames.emplace(name); + } + + // Add all base headers that aren't overridden + for (auto& [name, value] : baseHeaders) { + if (!overrideHeaderNames.contains(name)) { + headers.emplace_back(name, value); + } + } + + // Add override headers + for (auto& pair : overrideHeaders) { + headers.emplace_back(pair); + } + + return headers; + } }; } // namespace CesiumAsync diff --git a/CesiumRasterOverlays/include/CesiumRasterOverlays/RasterOverlay.h b/CesiumRasterOverlays/include/CesiumRasterOverlays/RasterOverlay.h index de3143b2a..b82d855df 100644 --- a/CesiumRasterOverlays/include/CesiumRasterOverlays/RasterOverlay.h +++ b/CesiumRasterOverlays/include/CesiumRasterOverlays/RasterOverlay.h @@ -113,6 +113,11 @@ struct CESIUMRASTEROVERLAYS_API RasterOverlayOptions { * @brief The ellipsoid used for this raster overlay. */ CesiumGeospatial::Ellipsoid ellipsoid = CesiumGeospatial::Ellipsoid::WGS84; + + /** + * @brief HTTP headers to attach to requests made for this raster overlay. + */ + std::vector requestHeaders; }; /** diff --git a/CesiumRasterOverlays/include/CesiumRasterOverlays/TileMapServiceRasterOverlay.h b/CesiumRasterOverlays/include/CesiumRasterOverlays/TileMapServiceRasterOverlay.h index 3f82c373e..efa5e88ad 100644 --- a/CesiumRasterOverlays/include/CesiumRasterOverlays/TileMapServiceRasterOverlay.h +++ b/CesiumRasterOverlays/include/CesiumRasterOverlays/TileMapServiceRasterOverlay.h @@ -93,7 +93,8 @@ class CESIUMRASTEROVERLAYS_API TileMapServiceRasterOverlay final * @param name The user-given name of this overlay layer. * @param url The base URL. * @param headers The headers. This is a list of pairs of strings of the - * form (Key,Value) that will be inserted as request headers internally. + * form (Key,Value) that will be inserted as request headers internally. These + * headers will override values specified in `RasterOverlayOptions`. * @param tmsOptions The {@link TileMapServiceRasterOverlayOptions}. * @param overlayOptions The {@link RasterOverlayOptions} for this instance. */ diff --git a/CesiumRasterOverlays/include/CesiumRasterOverlays/WebMapServiceRasterOverlay.h b/CesiumRasterOverlays/include/CesiumRasterOverlays/WebMapServiceRasterOverlay.h index 6feaa0ba2..14ef3694e 100644 --- a/CesiumRasterOverlays/include/CesiumRasterOverlays/WebMapServiceRasterOverlay.h +++ b/CesiumRasterOverlays/include/CesiumRasterOverlays/WebMapServiceRasterOverlay.h @@ -75,7 +75,8 @@ class CESIUMRASTEROVERLAYS_API WebMapServiceRasterOverlay final * @param name The user-given name of this overlay layer. * @param url The base URL. * @param headers The headers. This is a list of pairs of strings of the - * form (Key,Value) that will be inserted as request headers internally. + * form (Key,Value) that will be inserted as request headers internally. These + * values will override headers specified in `overlayOptions`. * @param wmsOptions The {@link WebMapServiceRasterOverlayOptions}. * @param overlayOptions The {@link RasterOverlayOptions} for this instance. */ diff --git a/CesiumRasterOverlays/include/CesiumRasterOverlays/WebMapTileServiceRasterOverlay.h b/CesiumRasterOverlays/include/CesiumRasterOverlays/WebMapTileServiceRasterOverlay.h index bf41427c8..681229f91 100644 --- a/CesiumRasterOverlays/include/CesiumRasterOverlays/WebMapTileServiceRasterOverlay.h +++ b/CesiumRasterOverlays/include/CesiumRasterOverlays/WebMapTileServiceRasterOverlay.h @@ -127,7 +127,8 @@ class CESIUMRASTEROVERLAYS_API WebMapTileServiceRasterOverlay final * @param name The user-given name of this overlay layer. * @param url The base URL. * @param headers The headers. This is a list of pairs of strings of the - * form (Key,Value) that will be inserted as request headers internally. + * form (Key,Value) that will be inserted as request headers internally. These + * values will override headers specified in `overlayOptions`. * @param tmsOptions The {@link WebMapTileServiceRasterOverlayOptions}. * @param overlayOptions The {@link RasterOverlayOptions} for this instance. */ diff --git a/CesiumRasterOverlays/src/BingMapsRasterOverlay.cpp b/CesiumRasterOverlays/src/BingMapsRasterOverlay.cpp index 417cee679..9864d9997 100644 --- a/CesiumRasterOverlays/src/BingMapsRasterOverlay.cpp +++ b/CesiumRasterOverlays/src/BingMapsRasterOverlay.cpp @@ -133,7 +133,8 @@ class BingMapsTileProvider final : public QuadtreeRasterOverlayTileProvider { height), _credits(perTileCredits), _urlTemplate(urlTemplate), - _subdomains(subdomains) { + _subdomains(subdomains), + _headers(pOwner->getOptions().requestHeaders) { if (this->_urlTemplate.find("n=z") == std::string::npos) { this->_urlTemplate = CesiumUtility::Uri::addQuery(this->_urlTemplate, "n", "z"); @@ -208,7 +209,7 @@ class BingMapsTileProvider final : public QuadtreeRasterOverlayTileProvider { } } - return this->loadTileImageFromUrl(url, {}, std::move(options)); + return this->loadTileImageFromUrl(url, this->_headers, std::move(options)); } private: @@ -235,6 +236,7 @@ class BingMapsTileProvider final : public QuadtreeRasterOverlayTileProvider { std::vector _credits; std::string _urlTemplate; std::vector _subdomains; + std::vector _headers; }; BingMapsRasterOverlay::BingMapsRasterOverlay( @@ -467,7 +469,8 @@ BingMapsRasterOverlay::createTileProvider( handleResponse(nullptr, std::span(cacheResultIt->second))); } - return pAssetAccessor->get(asyncSystem, metadataUrl) + return pAssetAccessor + ->get(asyncSystem, metadataUrl, this->getOptions().requestHeaders) .thenInMainThread( [metadataUrl, handleResponse](std::shared_ptr&& pRequest) diff --git a/CesiumRasterOverlays/src/IonRasterOverlay.cpp b/CesiumRasterOverlays/src/IonRasterOverlay.cpp index e6fbc664c..813430348 100644 --- a/CesiumRasterOverlays/src/IonRasterOverlay.cpp +++ b/CesiumRasterOverlays/src/IonRasterOverlay.cpp @@ -123,7 +123,8 @@ IonRasterOverlay::createTileProvider( pOwner); } - return pAssetAccessor->get(asyncSystem, ionUrl) + return pAssetAccessor + ->get(asyncSystem, ionUrl, this->getOptions().requestHeaders) .thenImmediately( [](std::shared_ptr&& pRequest) -> nonstd::expected< diff --git a/CesiumRasterOverlays/src/TileMapServiceRasterOverlay.cpp b/CesiumRasterOverlays/src/TileMapServiceRasterOverlay.cpp index c7f569ca1..f0282f291 100644 --- a/CesiumRasterOverlays/src/TileMapServiceRasterOverlay.cpp +++ b/CesiumRasterOverlays/src/TileMapServiceRasterOverlay.cpp @@ -175,7 +175,8 @@ TileMapServiceRasterOverlay::TileMapServiceRasterOverlay( const RasterOverlayOptions& overlayOptions) : RasterOverlay(name, overlayOptions), _url(url), - _headers(headers), + _headers( + IAssetAccessor::mergeHeaders(overlayOptions.requestHeaders, headers)), _options(tmsOptions) {} TileMapServiceRasterOverlay::~TileMapServiceRasterOverlay() = default; diff --git a/CesiumRasterOverlays/src/WebMapServiceRasterOverlay.cpp b/CesiumRasterOverlays/src/WebMapServiceRasterOverlay.cpp index f610cd3ec..8e1d2f690 100644 --- a/CesiumRasterOverlays/src/WebMapServiceRasterOverlay.cpp +++ b/CesiumRasterOverlays/src/WebMapServiceRasterOverlay.cpp @@ -259,7 +259,8 @@ WebMapServiceRasterOverlay::WebMapServiceRasterOverlay( const RasterOverlayOptions& overlayOptions) : RasterOverlay(name, overlayOptions), _baseUrl(url), - _headers(headers), + _headers( + IAssetAccessor::mergeHeaders(overlayOptions.requestHeaders, headers)), _options(wmsOptions) {} WebMapServiceRasterOverlay::~WebMapServiceRasterOverlay() = default; diff --git a/CesiumRasterOverlays/src/WebMapTileServiceRasterOverlay.cpp b/CesiumRasterOverlays/src/WebMapTileServiceRasterOverlay.cpp index bff293511..ed73172da 100644 --- a/CesiumRasterOverlays/src/WebMapTileServiceRasterOverlay.cpp +++ b/CesiumRasterOverlays/src/WebMapTileServiceRasterOverlay.cpp @@ -195,7 +195,8 @@ WebMapTileServiceRasterOverlay::WebMapTileServiceRasterOverlay( const RasterOverlayOptions& overlayOptions) : RasterOverlay(name, overlayOptions), _url(url), - _headers(headers), + _headers( + IAssetAccessor::mergeHeaders(overlayOptions.requestHeaders, headers)), _options(wmtsOptions) {} WebMapTileServiceRasterOverlay::~WebMapTileServiceRasterOverlay() = default;