summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--platform/darwin/http_request_nsurl.mm36
-rw-r--r--platform/default/http_request_curl.cpp55
-rw-r--r--src/mbgl/storage/http_context.cpp4
-rw-r--r--src/mbgl/storage/http_context.hpp9
-rw-r--r--src/mbgl/storage/http_request_base.hpp18
-rw-r--r--src/mbgl/storage/request_base.hpp9
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