summaryrefslogtreecommitdiff
path: root/platform/android/src/http_file_source.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/src/http_file_source.cpp')
-rw-r--r--platform/android/src/http_file_source.cpp195
1 files changed, 0 insertions, 195 deletions
diff --git a/platform/android/src/http_file_source.cpp b/platform/android/src/http_file_source.cpp
deleted file mode 100644
index 37f7307373..0000000000
--- a/platform/android/src/http_file_source.cpp
+++ /dev/null
@@ -1,195 +0,0 @@
-#include <mbgl/storage/http_file_source.hpp>
-#include <mbgl/storage/resource.hpp>
-#include <mbgl/storage/response.hpp>
-#include <mbgl/util/logging.hpp>
-
-#include <mbgl/util/async_request.hpp>
-#include <mbgl/util/async_task.hpp>
-#include <mbgl/util/http_header.hpp>
-#include <mbgl/util/string.hpp>
-#include <mbgl/util/util.hpp>
-
-#include <jni/jni.hpp>
-#include "attach_env.hpp"
-
-namespace mbgl {
-
-class HTTPFileSource::Impl {
-public:
- android::UniqueEnv env { android::AttachEnv() };
-};
-
-class HTTPRequest : public AsyncRequest {
-public:
- static constexpr auto Name() { return "com/mapbox/mapboxsdk/http/NativeHttpRequest"; };
-
- HTTPRequest(jni::JNIEnv&, const Resource&, FileSource::Callback);
- ~HTTPRequest();
-
- void onFailure(jni::JNIEnv&, int type, const jni::String& message);
- void onResponse(jni::JNIEnv&, int code,
- const jni::String& etag, const jni::String& modified,
- const jni::String& cacheControl, const jni::String& expires,
- const jni::String& retryAfter, const jni::String& xRateLimitReset,
- const jni::Array<jni::jbyte>& body);
-
- jni::Global<jni::Object<HTTPRequest>> javaRequest;
-
-private:
- Resource resource;
- FileSource::Callback callback;
- Response response;
-
- util::AsyncTask async { [this] {
- // Calling `callback` may result in deleting `this`. Copy data to temporaries first.
- auto callback_ = callback;
- auto response_ = response;
- callback_(response_);
- } };
-
- static const int connectionError = 0;
- static const int temporaryError = 1;
- static const int permanentError = 2;
-};
-
-namespace android {
-
-void RegisterNativeHTTPRequest(jni::JNIEnv& env) {
- static auto& javaClass = jni::Class<HTTPRequest>::Singleton(env);
-
- #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod<decltype(MethodPtr), (MethodPtr)>(name)
-
- jni::RegisterNativePeer<HTTPRequest>(env, javaClass, "nativePtr",
- METHOD(&HTTPRequest::onFailure, "nativeOnFailure"),
- METHOD(&HTTPRequest::onResponse, "nativeOnResponse"));
-}
-
-} // namespace android
-
-HTTPRequest::HTTPRequest(jni::JNIEnv& env, const Resource& resource_, FileSource::Callback callback_)
- : resource(resource_),
- callback(callback_) {
- std::string etagStr;
- std::string modifiedStr;
-
- if (resource.priorEtag) {
- etagStr = *resource.priorEtag;
- } else if (resource.priorModified) {
- modifiedStr = util::rfc1123(*resource.priorModified);
- }
-
- jni::UniqueLocalFrame frame = jni::PushLocalFrame(env, 10);
-
- static auto& javaClass = jni::Class<HTTPRequest>::Singleton(env);
- static auto constructor =
- javaClass.GetConstructor<jni::jlong, jni::String, jni::String, jni::String, jni::jboolean>(env);
-
- javaRequest = jni::NewGlobal(env,
- javaClass.New(env, constructor,
- reinterpret_cast<jlong>(this),
- jni::Make<jni::String>(env, resource.url),
- jni::Make<jni::String>(env, etagStr),
- jni::Make<jni::String>(env, modifiedStr),
- (jboolean) (resource_.usage == Resource::Usage::Offline)
- )
- );
-}
-
-HTTPRequest::~HTTPRequest() {
- android::UniqueEnv env = android::AttachEnv();
-
- static auto& javaClass = jni::Class<HTTPRequest>::Singleton(*env);
- static auto cancel = javaClass.GetMethod<void ()>(*env, "cancel");
-
- javaRequest.Call(*env, cancel);
-}
-
-void HTTPRequest::onResponse(jni::JNIEnv& env, int code,
- const jni::String& etag, const jni::String& modified,
- const jni::String& cacheControl, const jni::String& expires,
- const jni::String& jRetryAfter, const jni::String& jXRateLimitReset,
- const jni::Array<jni::jbyte>& body) {
-
- using Error = Response::Error;
-
- if (etag) {
- response.etag = jni::Make<std::string>(env, etag);
- }
-
- if (modified) {
- response.modified = util::parseTimestamp(jni::Make<std::string>(env, modified).c_str());
- }
-
- if (cacheControl) {
- const auto cc = http::CacheControl::parse(jni::Make<std::string>(env, cacheControl).c_str());
- response.expires = cc.toTimePoint();
- response.mustRevalidate = cc.mustRevalidate;
- }
-
- if (expires) {
- response.expires = util::parseTimestamp(jni::Make<std::string>(env, expires).c_str());
- }
-
- if (code == 200) {
- if (body) {
- auto data = std::make_shared<std::string>(body.Length(env), char());
- jni::GetArrayRegion(env, *body, 0, data->size(), reinterpret_cast<jbyte*>(&(*data)[0]));
- response.data = data;
- } else {
- response.data = std::make_shared<std::string>();
- }
- } else if (code == 204 || (code == 404 && resource.kind == Resource::Kind::Tile)) {
- response.noContent = true;
- } else if (code == 304) {
- response.notModified = true;
- } else if (code == 404) {
- response.error = std::make_unique<Error>(Error::Reason::NotFound, "HTTP status code 404");
- } else if (code == 429) {
- optional<std::string> retryAfter;
- optional<std::string> xRateLimitReset;
- if (jRetryAfter) {
- retryAfter = jni::Make<std::string>(env, jRetryAfter);
- }
- if (jXRateLimitReset) {
- xRateLimitReset = jni::Make<std::string>(env, jXRateLimitReset);
- }
- response.error = std::make_unique<Error>(Error::Reason::RateLimit, "HTTP status code 429", http::parseRetryHeaders(retryAfter, xRateLimitReset));
- } else if (code >= 500 && code < 600) {
- response.error = std::make_unique<Error>(Error::Reason::Server, std::string{ "HTTP status code " } + util::toString(code));
- } else {
- response.error = std::make_unique<Error>(Error::Reason::Other, std::string{ "HTTP status code " } + util::toString(code));
- }
-
- async.send();
-}
-
-void HTTPRequest::onFailure(jni::JNIEnv& env, int type, const jni::String& message) {
- std::string messageStr = jni::Make<std::string>(env, message);
-
- using Error = Response::Error;
-
- switch (type) {
- case connectionError:
- response.error = std::make_unique<Error>(Error::Reason::Connection, messageStr);
- break;
- case temporaryError:
- response.error = std::make_unique<Error>(Error::Reason::Server, messageStr);
- break;
- default:
- response.error = std::make_unique<Error>(Error::Reason::Other, messageStr);
- }
-
- async.send();
-}
-
-HTTPFileSource::HTTPFileSource()
- : impl(std::make_unique<Impl>()) {
-}
-
-HTTPFileSource::~HTTPFileSource() = default;
-
-std::unique_ptr<AsyncRequest> HTTPFileSource::request(const Resource& resource, Callback callback) {
- return std::make_unique<HTTPRequest>(*impl->env, resource, callback);
-}
-
-} // namespace mbgl