Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow specifying request headers in RasterOverlayOptions #1076

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
40 changes: 40 additions & 0 deletions CesiumAsync/include/CesiumAsync/IAssetAccessor.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#include <cstddef>
#include <memory>
#include <set>
#include <span>
#include <string>
#include <vector>
Expand Down Expand Up @@ -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<IAssetAccessor::THeader> mergeHeaders(
const std::vector<IAssetAccessor::THeader>& baseHeaders,
const std::vector<IAssetAccessor::THeader>& overrideHeaders) {
std::vector<IAssetAccessor::THeader> headers;
headers.reserve(std::max(baseHeaders.size(), overrideHeaders.size()));

std::set<std::string> 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
Original file line number Diff line number Diff line change
Expand Up @@ -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<CesiumAsync::IAssetAccessor::THeader> requestHeaders;
};

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*/
Expand Down
9 changes: 6 additions & 3 deletions CesiumRasterOverlays/src/BingMapsRasterOverlay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down Expand Up @@ -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:
Expand All @@ -235,6 +236,7 @@ class BingMapsTileProvider final : public QuadtreeRasterOverlayTileProvider {
std::vector<CreditAndCoverageAreas> _credits;
std::string _urlTemplate;
std::vector<std::string> _subdomains;
std::vector<IAssetAccessor::THeader> _headers;
};

BingMapsRasterOverlay::BingMapsRasterOverlay(
Expand Down Expand Up @@ -467,7 +469,8 @@ BingMapsRasterOverlay::createTileProvider(
handleResponse(nullptr, std::span<std::byte>(cacheResultIt->second)));
}

return pAssetAccessor->get(asyncSystem, metadataUrl)
return pAssetAccessor
->get(asyncSystem, metadataUrl, this->getOptions().requestHeaders)
.thenInMainThread(
[metadataUrl,
handleResponse](std::shared_ptr<IAssetRequest>&& pRequest)
Expand Down
3 changes: 2 additions & 1 deletion CesiumRasterOverlays/src/IonRasterOverlay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,8 @@ IonRasterOverlay::createTileProvider(
pOwner);
}

return pAssetAccessor->get(asyncSystem, ionUrl)
return pAssetAccessor
->get(asyncSystem, ionUrl, this->getOptions().requestHeaders)
.thenImmediately(
[](std::shared_ptr<IAssetRequest>&& pRequest)
-> nonstd::expected<
Expand Down
3 changes: 2 additions & 1 deletion CesiumRasterOverlays/src/TileMapServiceRasterOverlay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion CesiumRasterOverlays/src/WebMapServiceRasterOverlay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion CesiumRasterOverlays/src/WebMapTileServiceRasterOverlay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down