From 48eee03b263d55af5735a7df4351628b05687488 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Tue, 21 Jan 2025 15:18:50 -0500 Subject: [PATCH 1/3] Add requestHeaders to RasterOverlayOptions --- .../include/CesiumAsync/IAssetAccessor.h | 40 +++++++++++++++++++ .../CesiumRasterOverlays/RasterOverlay.h | 5 +++ .../TileMapServiceRasterOverlay.h | 3 +- .../WebMapServiceRasterOverlay.h | 3 +- .../WebMapTileServiceRasterOverlay.h | 3 +- .../src/BingMapsRasterOverlay.cpp | 9 +++-- CesiumRasterOverlays/src/IonRasterOverlay.cpp | 3 +- .../src/TileMapServiceRasterOverlay.cpp | 3 +- .../src/WebMapServiceRasterOverlay.cpp | 3 +- .../src/WebMapTileServiceRasterOverlay.cpp | 3 +- 10 files changed, 65 insertions(+), 10 deletions(-) diff --git a/CesiumAsync/include/CesiumAsync/IAssetAccessor.h b/CesiumAsync/include/CesiumAsync/IAssetAccessor.h index 6d5683c68..6536a037b 100644 --- a/CesiumAsync/include/CesiumAsync/IAssetAccessor.h +++ b/CesiumAsync/include/CesiumAsync/IAssetAccessor.h @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -70,4 +71,43 @@ class CESIUMASYNC_API IAssetAccessor { 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..bff3ef870 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( + CesiumAsync::mergeHeaders(overlayOptions.requestHeaders, headers)), _options(tmsOptions) {} TileMapServiceRasterOverlay::~TileMapServiceRasterOverlay() = default; diff --git a/CesiumRasterOverlays/src/WebMapServiceRasterOverlay.cpp b/CesiumRasterOverlays/src/WebMapServiceRasterOverlay.cpp index f610cd3ec..1fb37e2f2 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( + CesiumAsync::mergeHeaders(overlayOptions.requestHeaders, headers)), _options(wmsOptions) {} WebMapServiceRasterOverlay::~WebMapServiceRasterOverlay() = default; diff --git a/CesiumRasterOverlays/src/WebMapTileServiceRasterOverlay.cpp b/CesiumRasterOverlays/src/WebMapTileServiceRasterOverlay.cpp index bff293511..d604d42be 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( + CesiumAsync::mergeHeaders(overlayOptions.requestHeaders, headers)), _options(wmtsOptions) {} WebMapTileServiceRasterOverlay::~WebMapTileServiceRasterOverlay() = default; From 658543282f38437a6aa3f7c4f2c892752dafbf3f Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Tue, 21 Jan 2025 15:25:36 -0500 Subject: [PATCH 2/3] Move mergeHeaders into IAssetAccessor --- .../include/CesiumAsync/IAssetAccessor.h | 68 +++++++++---------- .../src/TileMapServiceRasterOverlay.cpp | 2 +- .../src/WebMapServiceRasterOverlay.cpp | 2 +- .../src/WebMapTileServiceRasterOverlay.cpp | 2 +- 4 files changed, 37 insertions(+), 37 deletions(-) diff --git a/CesiumAsync/include/CesiumAsync/IAssetAccessor.h b/CesiumAsync/include/CesiumAsync/IAssetAccessor.h index 6536a037b..eadadb268 100644 --- a/CesiumAsync/include/CesiumAsync/IAssetAccessor.h +++ b/CesiumAsync/include/CesiumAsync/IAssetAccessor.h @@ -69,45 +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())); + /** + * @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); - } + 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 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); - } + // Add override headers + for (auto& pair : overrideHeaders) { + headers.emplace_back(pair); + } - return headers; -} + return headers; + } +}; } // namespace CesiumAsync diff --git a/CesiumRasterOverlays/src/TileMapServiceRasterOverlay.cpp b/CesiumRasterOverlays/src/TileMapServiceRasterOverlay.cpp index bff3ef870..f0282f291 100644 --- a/CesiumRasterOverlays/src/TileMapServiceRasterOverlay.cpp +++ b/CesiumRasterOverlays/src/TileMapServiceRasterOverlay.cpp @@ -176,7 +176,7 @@ TileMapServiceRasterOverlay::TileMapServiceRasterOverlay( : RasterOverlay(name, overlayOptions), _url(url), _headers( - CesiumAsync::mergeHeaders(overlayOptions.requestHeaders, headers)), + IAssetAccessor::mergeHeaders(overlayOptions.requestHeaders, headers)), _options(tmsOptions) {} TileMapServiceRasterOverlay::~TileMapServiceRasterOverlay() = default; diff --git a/CesiumRasterOverlays/src/WebMapServiceRasterOverlay.cpp b/CesiumRasterOverlays/src/WebMapServiceRasterOverlay.cpp index 1fb37e2f2..8e1d2f690 100644 --- a/CesiumRasterOverlays/src/WebMapServiceRasterOverlay.cpp +++ b/CesiumRasterOverlays/src/WebMapServiceRasterOverlay.cpp @@ -260,7 +260,7 @@ WebMapServiceRasterOverlay::WebMapServiceRasterOverlay( : RasterOverlay(name, overlayOptions), _baseUrl(url), _headers( - CesiumAsync::mergeHeaders(overlayOptions.requestHeaders, headers)), + IAssetAccessor::mergeHeaders(overlayOptions.requestHeaders, headers)), _options(wmsOptions) {} WebMapServiceRasterOverlay::~WebMapServiceRasterOverlay() = default; diff --git a/CesiumRasterOverlays/src/WebMapTileServiceRasterOverlay.cpp b/CesiumRasterOverlays/src/WebMapTileServiceRasterOverlay.cpp index d604d42be..ed73172da 100644 --- a/CesiumRasterOverlays/src/WebMapTileServiceRasterOverlay.cpp +++ b/CesiumRasterOverlays/src/WebMapTileServiceRasterOverlay.cpp @@ -196,7 +196,7 @@ WebMapTileServiceRasterOverlay::WebMapTileServiceRasterOverlay( : RasterOverlay(name, overlayOptions), _url(url), _headers( - CesiumAsync::mergeHeaders(overlayOptions.requestHeaders, headers)), + IAssetAccessor::mergeHeaders(overlayOptions.requestHeaders, headers)), _options(wmtsOptions) {} WebMapTileServiceRasterOverlay::~WebMapTileServiceRasterOverlay() = default; From 81be1e54adc7b2bea7e20352f06babb7c2306de4 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Tue, 21 Jan 2025 15:33:51 -0500 Subject: [PATCH 3/3] Update CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) 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