diff options
-rw-r--r-- | platform/darwin/http_request_nsurl.mm | 36 | ||||
-rw-r--r-- | platform/default/http_request_curl.cpp | 55 | ||||
-rw-r--r-- | src/mbgl/storage/http_context.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/storage/http_context.hpp | 9 | ||||
-rw-r--r-- | src/mbgl/storage/http_request_base.hpp | 18 | ||||
-rw-r--r-- | src/mbgl/storage/request_base.hpp | 9 |
6 files changed, 74 insertions, 57 deletions
diff --git a/platform/darwin/http_request_nsurl.mm b/platform/darwin/http_request_nsurl.mm index 10774587c5..a1282cf45b 100644 --- a/platform/darwin/http_request_nsurl.mm +++ b/platform/darwin/http_request_nsurl.mm @@ -15,23 +15,23 @@ namespace mbgl { class HTTPNSURLContext; -class HTTPRequest : public RequestBase { +class HTTPNSURLRequest : public HTTPRequestBase { public: - HTTPRequest(HTTPNSURLContext*, + HTTPNSURLRequest(HTTPNSURLContext*, const Resource&, Callback, uv_loop_t*, std::shared_ptr<const Response>); - ~HTTPRequest(); + ~HTTPNSURLRequest(); - void cancel() override; - void retry() override; + void cancel() final; + void retry() final; private: void start(); void handleResult(NSData *data, NSURLResponse *res, NSError *error); void handleResponse(); - void retry(uint64_t timeout); + void retry(uint64_t timeout) final; HTTPNSURLContext *context = nullptr; bool cancelled = false; @@ -54,7 +54,7 @@ public: HTTPNSURLContext(uv_loop_t *loop); ~HTTPNSURLContext(); - RequestBase* createRequest(const Resource&, + HTTPRequestBase* createRequest(const Resource&, RequestBase::Callback, uv_loop_t*, std::shared_ptr<const Response>) override; @@ -91,17 +91,17 @@ HTTPNSURLContext::~HTTPNSURLContext() { userAgent = nullptr; } -RequestBase* HTTPNSURLContext::createRequest(const Resource& resource, +HTTPRequestBase* HTTPNSURLContext::createRequest(const Resource& resource, RequestBase::Callback callback, uv_loop_t* loop, std::shared_ptr<const Response> response) { - return new HTTPRequest(this, resource, callback, loop, response); + return new HTTPNSURLRequest(this, resource, callback, loop, response); } // ------------------------------------------------------------------------------------------------- -HTTPRequest::HTTPRequest(HTTPNSURLContext* context_, const Resource& resource_, Callback callback_, uv_loop_t *loop, std::shared_ptr<const Response> existingResponse_) - : RequestBase(resource_, callback_), +HTTPNSURLRequest::HTTPNSURLRequest(HTTPNSURLContext* context_, const Resource& resource_, Callback callback_, uv_loop_t *loop, std::shared_ptr<const Response> existingResponse_) + : HTTPRequestBase(resource_, callback_), context(context_), existingResponse(existingResponse_), async(loop, [this] { handleResponse(); }), @@ -110,7 +110,7 @@ HTTPRequest::HTTPRequest(HTTPNSURLContext* context_, const Resource& resource_, start(); } -HTTPRequest::~HTTPRequest() { +HTTPNSURLRequest::~HTTPNSURLRequest() { assert(!task); // Stop the backoff timer to avoid re-triggering this request. @@ -119,7 +119,7 @@ HTTPRequest::~HTTPRequest() { context->removeRequest(this); } -void HTTPRequest::start() { +void HTTPNSURLRequest::start() { assert(!task); attempts++; @@ -154,7 +154,7 @@ void HTTPRequest::start() { } } -void HTTPRequest::handleResponse() { +void HTTPNSURLRequest::handleResponse() { if (task) { [task release]; task = nullptr; @@ -182,7 +182,7 @@ void HTTPRequest::handleResponse() { delete this; } -void HTTPRequest::cancel() { +void HTTPNSURLRequest::cancel() { context->removeRequest(this); cancelled = true; @@ -213,7 +213,7 @@ int64_t parseCacheControl(const char *value) { return 0; } -void HTTPRequest::handleResult(NSData *data, NSURLResponse *res, NSError *error) { +void HTTPNSURLRequest::handleResult(NSData *data, NSURLResponse *res, NSError *error) { if (error) { if ([error code] == NSURLErrorCancelled) { status = ResponseStatus::Canceled; @@ -316,14 +316,14 @@ void HTTPRequest::handleResult(NSData *data, NSURLResponse *res, NSError *error) async.send(); } -void HTTPRequest::retry(uint64_t timeout) { +void HTTPNSURLRequest::retry(uint64_t timeout) { response.reset(); timer.stop(); timer.start(timeout, 0, [this] { start(); }); } -void HTTPRequest::retry() { +void HTTPNSURLRequest::retry() { // All batons get notified when the network status changed, but some of them // might not actually wait for the network to become available again. if (strategy == PreemptImmediately) { diff --git a/platform/default/http_request_curl.cpp b/platform/default/http_request_curl.cpp index cdd1de9dd6..62bf263ba1 100644 --- a/platform/default/http_request_curl.cpp +++ b/platform/default/http_request_curl.cpp @@ -35,7 +35,7 @@ void handleError(CURLcode code) { namespace mbgl { -class HTTPRequest; +class HTTPCURLRequest; class HTTPCURLContext : public HTTPContext { MBGL_STORE_THREAD(tid) @@ -44,7 +44,7 @@ public: explicit HTTPCURLContext(uv_loop_t *loop); ~HTTPCURLContext(); - RequestBase* createRequest(const Resource&, + HTTPRequestBase* createRequest(const Resource&, RequestBase::Callback, uv_loop_t*, std::shared_ptr<const Response>) override; @@ -79,19 +79,19 @@ public: std::queue<CURL *> handles; }; -class HTTPRequest : public RequestBase { +class HTTPCURLRequest : public HTTPRequestBase { MBGL_STORE_THREAD(tid) public: - HTTPRequest(HTTPCURLContext*, + HTTPCURLRequest(HTTPCURLContext*, const Resource&, Callback, uv_loop_t*, std::shared_ptr<const Response>); - ~HTTPRequest(); + ~HTTPCURLRequest(); - void cancel() override; - void retry() override; + void cancel() final; + void retry() final; void handleResult(CURLcode code); @@ -99,7 +99,7 @@ private: static size_t headerCallback(char *const buffer, const size_t size, const size_t nmemb, void *userp); static size_t writeCallback(void *const contents, const size_t size, const size_t nmemb, void *userp); - void retry(uint64_t timeout); + void retry(uint64_t timeout) final; #if UV_VERSION_MAJOR == 0 && UV_VERSION_MINOR <= 10 static void restart(uv_timer_t *timer, int); #else @@ -109,7 +109,6 @@ private: void start(); HTTPCURLContext *context = nullptr; - bool cancelled = false; // Will store the current response. std::unique_ptr<Response> response; @@ -203,11 +202,11 @@ HTTPCURLContext::~HTTPCURLContext() { uv::close(timeout); } -RequestBase* HTTPCURLContext::createRequest(const Resource& resource, +HTTPRequestBase* HTTPCURLContext::createRequest(const Resource& resource, RequestBase::Callback callback, uv_loop_t* loop_, std::shared_ptr<const Response> response) { - return new HTTPRequest(this, resource, callback, loop_, response); + return new HTTPCURLRequest(this, resource, callback, loop_, response); } CURL *HTTPCURLContext::getHandle() { @@ -233,7 +232,7 @@ void HTTPCURLContext::checkMultiInfo() { while ((message = curl_multi_info_read(multi, &pending))) { switch (message->msg) { case CURLMSG_DONE: { - HTTPRequest *baton = nullptr; + HTTPCURLRequest *baton = nullptr; curl_easy_getinfo(message->easy_handle, CURLINFO_PRIVATE, (char *)&baton); assert(baton); baton->handleResult(message->data.result); @@ -428,8 +427,8 @@ static CURLcode sslctx_function(CURL * /* curl */, void *sslctx, void * /* parm } #endif -HTTPRequest::HTTPRequest(HTTPCURLContext* context_, const Resource& resource_, Callback callback_, uv_loop_t*, std::shared_ptr<const Response> response_) - : RequestBase(resource_, callback_), +HTTPCURLRequest::HTTPCURLRequest(HTTPCURLContext* context_, const Resource& resource_, Callback callback_, uv_loop_t*, std::shared_ptr<const Response> response_) + : HTTPRequestBase(resource_, callback_), context(context_), existingResponse(response_), handle(context->getHandle()) { @@ -476,7 +475,7 @@ HTTPRequest::HTTPRequest(HTTPCURLContext* context_, const Resource& resource_, C start(); } -HTTPRequest::~HTTPRequest() { +HTTPCURLRequest::~HTTPCURLRequest() { MBGL_VERIFY_THREAD(tid); context->removeRequest(this); @@ -498,11 +497,11 @@ HTTPRequest::~HTTPRequest() { } } -void HTTPRequest::cancel() { +void HTTPCURLRequest::cancel() { delete this; } -void HTTPRequest::start() { +void HTTPCURLRequest::start() { // Count up the attempts. attempts++; @@ -512,9 +511,9 @@ void HTTPRequest::start() { // This function is called when we have new data for a request. We just append it to the string // containing the previous data. -size_t HTTPRequest::writeCallback(void *const contents, const size_t size, const size_t nmemb, void *userp) { +size_t HTTPCURLRequest::writeCallback(void *const contents, const size_t size, const size_t nmemb, void *userp) { assert(userp); - auto impl = reinterpret_cast<HTTPRequest *>(userp); + auto impl = reinterpret_cast<HTTPCURLRequest *>(userp); MBGL_VERIFY_THREAD(impl->tid); if (!impl->response) { @@ -556,9 +555,9 @@ int64_t parseCacheControl(const char *value) { return 0; } -size_t HTTPRequest::headerCallback(char *const buffer, const size_t size, const size_t nmemb, void *userp) { +size_t HTTPCURLRequest::headerCallback(char *const buffer, const size_t size, const size_t nmemb, void *userp) { assert(userp); - auto baton = reinterpret_cast<HTTPRequest *>(userp); + auto baton = reinterpret_cast<HTTPCURLRequest *>(userp); MBGL_VERIFY_THREAD(baton->tid); if (!baton->response) { @@ -585,7 +584,7 @@ size_t HTTPRequest::headerCallback(char *const buffer, const size_t size, const return length; } -void HTTPRequest::retry(uint64_t timeout) { +void HTTPCURLRequest::retry(uint64_t timeout) { handleError(curl_multi_remove_handle(context->multi, handle)); response.reset(); @@ -597,7 +596,7 @@ void HTTPRequest::retry(uint64_t timeout) { uv_timer_start(timer, restart, timeout, 0); } -void HTTPRequest::retry() { +void HTTPCURLRequest::retry() { // All batons get notified when the network status changed, but some of them // might not actually wait for the network to become available again. if (timer && strategy == PreemptImmediately) { @@ -608,12 +607,12 @@ void HTTPRequest::retry() { } #if UV_VERSION_MAJOR == 0 && UV_VERSION_MINOR <= 10 -void HTTPRequest::restart(uv_timer_t *timer, int) { +void HTTPCURLRequest::restart(uv_timer_t *timer, int) { #else -void HTTPRequest::restart(uv_timer_t *timer) { +void HTTPCURLRequest::restart(uv_timer_t *timer) { #endif // Restart the request. - auto baton = reinterpret_cast<HTTPRequest *>(timer->data); + auto baton = reinterpret_cast<HTTPCURLRequest *>(timer->data); // Get rid of the timer. baton->timer = nullptr; @@ -622,7 +621,7 @@ void HTTPRequest::restart(uv_timer_t *timer) { baton->start(); } -void HTTPRequest::finish(ResponseStatus status) { +void HTTPCURLRequest::finish(ResponseStatus status) { if (status == ResponseStatus::TemporaryError && attempts < maxAttempts) { strategy = ExponentialBackoff; return retry((1 << (attempts - 1)) * 1000); @@ -643,7 +642,7 @@ void HTTPRequest::finish(ResponseStatus status) { delete this; } -void HTTPRequest::handleResult(CURLcode code) { +void HTTPCURLRequest::handleResult(CURLcode code) { MBGL_VERIFY_THREAD(tid); if (cancelled) { diff --git a/src/mbgl/storage/http_context.cpp b/src/mbgl/storage/http_context.cpp index c747490804..969ff94d34 100644 --- a/src/mbgl/storage/http_context.cpp +++ b/src/mbgl/storage/http_context.cpp @@ -13,11 +13,11 @@ HTTPContext::~HTTPContext() { NetworkStatus::Unsubscribe(reachability.get()); } -void HTTPContext::addRequest(RequestBase* request) { +void HTTPContext::addRequest(HTTPRequestBase* request) { requests.insert(request); } -void HTTPContext::removeRequest(RequestBase* request) { +void HTTPContext::removeRequest(HTTPRequestBase* request) { requests.erase(request); } diff --git a/src/mbgl/storage/http_context.hpp b/src/mbgl/storage/http_context.hpp index 64a8afa6dd..3d5380cdc0 100644 --- a/src/mbgl/storage/http_context.hpp +++ b/src/mbgl/storage/http_context.hpp @@ -2,6 +2,7 @@ #define MBGL_STORAGE_DEFAULT_HTTP_CONTEXT #include <mbgl/storage/request_base.hpp> +#include <mbgl/storage/http_request_base.hpp> #include <mbgl/storage/network_status.hpp> #include <mbgl/util/uv_detail.hpp> @@ -16,13 +17,13 @@ public: HTTPContext(uv_loop_t*); virtual ~HTTPContext(); - virtual RequestBase* createRequest(const Resource&, + virtual HTTPRequestBase* createRequest(const Resource&, RequestBase::Callback, uv_loop_t*, std::shared_ptr<const Response>) = 0; - void addRequest(RequestBase*); - void removeRequest(RequestBase*); + void addRequest(HTTPRequestBase*); + void removeRequest(HTTPRequestBase*); private: void retryRequests(); @@ -32,7 +33,7 @@ private: // A list of all pending HTTPRequestImpls that we need to notify when the network status // changes. - std::set<RequestBase*> requests; + std::set<HTTPRequestBase*> requests; }; } diff --git a/src/mbgl/storage/http_request_base.hpp b/src/mbgl/storage/http_request_base.hpp index 2e976a856a..508095e3c1 100644 --- a/src/mbgl/storage/http_request_base.hpp +++ b/src/mbgl/storage/http_request_base.hpp @@ -1,6 +1,8 @@ #ifndef MBGL_STORAGE_HTTP_REQUEST_BASE #define MBGL_STORAGE_HTTP_REQUEST_BASE +#include <mbgl/storage/request_base.hpp> + namespace mbgl { enum class ResponseStatus : uint8_t { @@ -31,6 +33,22 @@ enum class ResponseStatus : uint8_t { NotModified, }; +class HTTPRequestBase : public RequestBase { +public: + HTTPRequestBase(const Resource& resource_, Callback notify_) + : RequestBase(resource_, notify_) + , cancelled(false) { + } + + virtual ~HTTPRequestBase() = default; + virtual void cancel() override { cancelled = true; }; + virtual void retry(uint64_t timeout) = 0; + virtual void retry() = 0; + +protected: + bool cancelled; +}; + } // namespace mbgl #endif // MBGL_STORAGE_HTTP_REQUEST_BASE diff --git a/src/mbgl/storage/request_base.hpp b/src/mbgl/storage/request_base.hpp index c8dfad4778..a147ccacf0 100644 --- a/src/mbgl/storage/request_base.hpp +++ b/src/mbgl/storage/request_base.hpp @@ -1,5 +1,5 @@ -#ifndef MBGL_STORAGE_REQUEST -#define MBGL_STORAGE_REQUEST +#ifndef MBGL_STORAGE_REQUEST_BASE +#define MBGL_STORAGE_REQUEST_BASE #include <mbgl/util/noncopyable.hpp> #include <mbgl/storage/file_cache.hpp> @@ -23,13 +23,12 @@ public: virtual ~RequestBase() = default; virtual void cancel() = 0; - virtual void retry() {}; protected: Resource resource; Callback notify; }; -} +} // namespace mbgl -#endif +#endif // MBGL_STORAGE_REQUEST_BASE |