summaryrefslogtreecommitdiff
path: root/platform/darwin
diff options
context:
space:
mode:
Diffstat (limited to 'platform/darwin')
-rw-r--r--platform/darwin/src/http_file_source.mm43
-rw-r--r--platform/darwin/test/MGLResourceTests.mm74
2 files changed, 106 insertions, 11 deletions
diff --git a/platform/darwin/src/http_file_source.mm b/platform/darwin/src/http_file_source.mm
index 0d14c44c01..79810546b3 100644
--- a/platform/darwin/src/http_file_source.mm
+++ b/platform/darwin/src/http_file_source.mm
@@ -196,24 +196,45 @@ HTTPFileSource::HTTPFileSource()
HTTPFileSource::~HTTPFileSource() = default;
+MGL_EXPORT
+NSURL *resourceURLWithAccountType(const Resource& resource, NSInteger accountType) {
+
+ NSURL *url = [NSURL URLWithString:@(resource.url.c_str())];
+
+#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR
+ if (accountType == 0 &&
+ ([url.host isEqualToString:@"mapbox.com"] || [url.host hasSuffix:@".mapbox.com"])) {
+ NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
+ NSURLQueryItem *accountsQueryItem = [NSURLQueryItem queryItemWithName:@"sku" value:MGLAccountManager.skuToken];
+
+ NSMutableArray *queryItems = [NSMutableArray arrayWithObject:accountsQueryItem];
+
+ // offline here
+ if (resource.usage == Resource::Usage::Offline) {
+ [queryItems addObject:[NSURLQueryItem queryItemWithName:@"offline" value:@"true"]];
+ }
+
+ if (components.queryItems) {
+ [queryItems addObjectsFromArray:components.queryItems];
+ }
+
+ components.queryItems = queryItems;
+ url = components.URL;
+ }
+#else
+ (void)accountType;
+#endif
+ return url;
+}
+
std::unique_ptr<AsyncRequest> HTTPFileSource::request(const Resource& resource, Callback callback) {
auto request = std::make_unique<HTTPRequest>(callback);
auto shared = request->shared; // Explicit copy so that it also gets copied into the completion handler block below.
@autoreleasepool {
- NSURL *url = [NSURL URLWithString:@(resource.url.c_str())];
+ NSURL *url = resourceURLWithAccountType(resource, impl->accountType);
MGLLogDebug(@"Requesting URI: %@", url.relativePath);
-#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR
- if (impl->accountType == 0 &&
- ([url.host isEqualToString:@"mapbox.com"] || [url.host hasSuffix:@".mapbox.com"])) {
- NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
- NSURLQueryItem *accountsQueryItem = [NSURLQueryItem queryItemWithName:@"sku" value:MGLAccountManager.skuToken];
- components.queryItems = components.queryItems ? [components.queryItems arrayByAddingObject:accountsQueryItem] : @[accountsQueryItem];
- url = components.URL;
- }
-#endif
-
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
if (resource.priorEtag) {
[req addValue:@(resource.priorEtag->c_str())
diff --git a/platform/darwin/test/MGLResourceTests.mm b/platform/darwin/test/MGLResourceTests.mm
new file mode 100644
index 0000000000..0420997c39
--- /dev/null
+++ b/platform/darwin/test/MGLResourceTests.mm
@@ -0,0 +1,74 @@
+#import <Mapbox/Mapbox.h>
+#import <XCTest/XCTest.h>
+#import <mbgl/storage/resource.hpp>
+
+namespace mbgl {
+ extern NSURL *resourceURLWithAccountType(const Resource& resource, NSInteger accountType);
+}
+
+@interface MGLResourceTests : XCTestCase
+@end
+
+@implementation MGLResourceTests
+
+- (void)testOfflineQueryParameterIsAddedForOfflineResource {
+
+ using namespace mbgl;
+
+ std::string testURL = "test://mapbox.com/testing_offline_query?a=one&b=two";
+
+ // Is our test URL "correct" for subsequent checks?
+ {
+ NSURL *url = [NSURL URLWithString:@(testURL.c_str())];
+ NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
+ NSArray<NSURLQueryItem *> *items = components.queryItems;
+ XCTAssert(items.count == 2 );
+ }
+
+ Resource resource(Resource::Kind::Unknown, testURL);
+
+ // By default, resource are NOT offline
+ {
+ NSURL *url = resourceURLWithAccountType(resource, 0);
+ NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
+ for (NSURLQueryItem *item in components.queryItems) {
+ XCTAssertFalse([item.name isEqualToString:@"offline"]);
+ }
+ }
+
+ // Now check offline
+ resource.setUsage(Resource::Usage::Offline);
+
+ {
+ NSURL *url = resourceURLWithAccountType(resource, 0);
+ NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
+
+ // For offline, we expect a single offline param and a sku param
+ NSInteger foundCount = 0;
+
+#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR
+ for (NSURLQueryItem *item in components.queryItems) {
+ if (([item.name isEqualToString:@"offline"] && [item.value isEqualToString:@"true"]) ||
+ ([item.name isEqualToString:@"a"] && [item.value isEqualToString:@"one"]) ||
+ ([item.name isEqualToString:@"b"] && [item.value isEqualToString:@"two"]) ||
+ ([item.name isEqualToString:@"sku"])) {
+ foundCount++;
+ }
+ }
+
+ XCTAssert(foundCount == 4);
+#else
+ // NOTE: Currently the macOS SDK does not supply the sku or offline query parameters
+ for (NSURLQueryItem *item in components.queryItems) {
+ if (([item.name isEqualToString:@"a"] && [item.value isEqualToString:@"one"]) ||
+ ([item.name isEqualToString:@"b"] && [item.value isEqualToString:@"two"])) {
+ foundCount++;
+ }
+ }
+
+ XCTAssert(foundCount == 2);
+#endif
+ }
+}
+
+@end