diff options
Diffstat (limited to 'platform/darwin/http_request_nsurl.mm')
-rw-r--r-- | platform/darwin/http_request_nsurl.mm | 60 |
1 files changed, 17 insertions, 43 deletions
diff --git a/platform/darwin/http_request_nsurl.mm b/platform/darwin/http_request_nsurl.mm index 2421c69c66..0166564727 100644 --- a/platform/darwin/http_request_nsurl.mm +++ b/platform/darwin/http_request_nsurl.mm @@ -1,5 +1,6 @@ #include <mbgl/storage/http_context_base.hpp> #include <mbgl/storage/http_request_base.hpp> +#include <mbgl/storage/resource.hpp> #include <mbgl/storage/response.hpp> #include <mbgl/util/async_task.hpp> @@ -16,10 +17,7 @@ class HTTPNSURLContext; class HTTPNSURLRequest : public HTTPRequestBase { public: - HTTPNSURLRequest(HTTPNSURLContext*, - const std::string& url, - Callback, - std::shared_ptr<const Response>); + HTTPNSURLRequest(HTTPNSURLContext*, const Resource&, Callback); ~HTTPNSURLRequest(); void cancel() final; @@ -32,7 +30,6 @@ private: bool cancelled = false; NSURLSessionDataTask *task = nullptr; std::unique_ptr<Response> response; - const std::shared_ptr<const Response> existingResponse; util::AsyncTask async; }; @@ -43,9 +40,7 @@ public: HTTPNSURLContext(); ~HTTPNSURLContext(); - HTTPRequestBase* createRequest(const std::string& url, - HTTPRequestBase::Callback, - std::shared_ptr<const Response>) final; + HTTPRequestBase* createRequest(const Resource&, HTTPRequestBase::Callback) final; NSURLSession *session = nil; NSString *userAgent = nil; @@ -79,21 +74,17 @@ HTTPNSURLContext::~HTTPNSURLContext() { userAgent = nullptr; } -HTTPRequestBase* HTTPNSURLContext::createRequest(const std::string& url, - HTTPRequestBase::Callback callback, - std::shared_ptr<const Response> response) { - return new HTTPNSURLRequest(this, url, callback, response); +HTTPRequestBase* HTTPNSURLContext::createRequest(const Resource& resource, HTTPRequestBase::Callback callback) { + return new HTTPNSURLRequest(this, resource, callback); } // ------------------------------------------------------------------------------------------------- HTTPNSURLRequest::HTTPNSURLRequest(HTTPNSURLContext* context_, - const std::string& url_, - Callback callback_, - std::shared_ptr<const Response> existingResponse_) - : HTTPRequestBase(url_, callback_), + const Resource& resource_, + Callback callback_) + : HTTPRequestBase(resource_, callback_), context(context_), - existingResponse(existingResponse_), async([this] { handleResponse(); }) { // Hold the main loop alive until the request returns. This // is needed because completion handler runs in another @@ -101,7 +92,7 @@ HTTPNSURLRequest::HTTPNSURLRequest(HTTPNSURLContext* context_, util::RunLoop::Get()->ref(); @autoreleasepool { - NSURL* url = [NSURL URLWithString:@(url_.c_str())]; + NSURL* url = [NSURL URLWithString:@(resource.url.c_str())]; if (context->accountType == 0 && ([url.host isEqualToString:@"mapbox.com"] || [url.host hasSuffix:@".mapbox.com"])) { NSString* absoluteString = [url.absoluteString @@ -110,14 +101,12 @@ HTTPNSURLRequest::HTTPNSURLRequest(HTTPNSURLContext* context_, } NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL:url]; - if (existingResponse) { - if (existingResponse->etag) { - [req addValue:@((*existingResponse->etag).c_str()) - forHTTPHeaderField:@"If-None-Match"]; - } else if (existingResponse->modified) { - [req addValue:@(util::rfc1123(*existingResponse->modified).c_str()) - forHTTPHeaderField:@"If-Modified-Since"]; - } + if (resource.priorEtag) { + [req addValue:@(resource.priorEtag->c_str()) + forHTTPHeaderField:@"If-None-Match"]; + } else if (resource.priorModified) { + [req addValue:@(util::rfc1123(*resource.priorModified).c_str()) + forHTTPHeaderField:@"If-Modified-Since"]; } [req addValue:context->userAgent forHTTPHeaderField:@"User-Agent"]; @@ -145,7 +134,7 @@ void HTTPNSURLRequest::handleResponse() { if (!cancelled) { // Actually return the response. - notify(std::move(response)); + notify(*response); } delete this; @@ -232,22 +221,7 @@ void HTTPNSURLRequest::handleResult(NSData *data, NSURLResponse *res, NSError *e // Nothing to do; this is what we want. } else if (responseCode == 304) { response->notModified = true; - - if (existingResponse) { - response->data = existingResponse->data; - - if (!response->expires) { - response->expires = existingResponse->expires; - } - - if (!response->modified) { - response->modified = existingResponse->modified; - } - - if (!response->etag) { - response->etag = existingResponse->etag; - } - } + response->data.reset(); } else if (responseCode == 404) { response->error = std::make_unique<Error>(Error::Reason::NotFound, "HTTP status code 404"); |