summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
Diffstat (limited to 'platform')
-rw-r--r--platform/android/src/http_file_source.cpp2
-rw-r--r--platform/darwin/src/http_file_source.mm2
-rw-r--r--platform/default/default_file_source.cpp4
-rw-r--r--platform/default/http_file_source.cpp2
-rw-r--r--platform/node/src/node_mapbox_gl_native.cpp27
-rw-r--r--platform/node/src/node_request.cpp68
-rw-r--r--platform/node/test/suite_implementation.js20
-rw-r--r--platform/qt/src/http_request.cpp8
8 files changed, 89 insertions, 44 deletions
diff --git a/platform/android/src/http_file_source.cpp b/platform/android/src/http_file_source.cpp
index 8a54b2917a..fd77f8ec85 100644
--- a/platform/android/src/http_file_source.cpp
+++ b/platform/android/src/http_file_source.cpp
@@ -132,7 +132,7 @@ void HTTPRequest::onResponse(jni::JNIEnv& env, int code,
} else {
response.data = std::make_shared<std::string>();
}
- } else if (code == 204 || (code == 404 && resource.kind == ResourceKind::Tile)) {
+ } else if (code == 204) {
response.noContent = true;
} else if (code == 304) {
response.notModified = true;
diff --git a/platform/darwin/src/http_file_source.mm b/platform/darwin/src/http_file_source.mm
index 7d42af16df..15fcdff608 100644
--- a/platform/darwin/src/http_file_source.mm
+++ b/platform/darwin/src/http_file_source.mm
@@ -286,7 +286,7 @@ std::unique_ptr<AsyncRequest> HTTPFileSource::request(const Resource& resource,
if (responseCode == 200) {
response.data = std::make_shared<std::string>((const char *)[data bytes], [data length]);
- } else if (responseCode == 204 || (responseCode == 404 && resource.kind == ResourceKind::Tile)) {
+ } else if (responseCode == 204) {
response.noContent = true;
} else if (responseCode == 304) {
response.notModified = true;
diff --git a/platform/default/default_file_source.cpp b/platform/default/default_file_source.cpp
index 10803a18a0..a2ca0de363 100644
--- a/platform/default/default_file_source.cpp
+++ b/platform/default/default_file_source.cpp
@@ -237,6 +237,10 @@ void DefaultFileSource::setResourceTransform(optional<ActorRef<ResourceTransform
}
std::unique_ptr<AsyncRequest> DefaultFileSource::request(const Resource& resource, Callback callback) {
+ if (resource.necessity == Resource::Optional) {
+
+ }
+
auto req = std::make_unique<FileSourceRequest>(std::move(callback));
req->onCancel([fs = impl->actor(), req = req.get()] () mutable { fs.invoke(&Impl::cancel, req); });
diff --git a/platform/default/http_file_source.cpp b/platform/default/http_file_source.cpp
index dc8018fb42..87cb269b3c 100644
--- a/platform/default/http_file_source.cpp
+++ b/platform/default/http_file_source.cpp
@@ -373,7 +373,7 @@ void HTTPRequest::handleResult(CURLcode code) {
} else {
response->data = std::make_shared<std::string>();
}
- } else if (responseCode == 204 || (responseCode == 404 && resource.kind == ResourceKind::Tile)) {
+ } else if (responseCode == 204) {
response->noContent = true;
} else if (responseCode == 304) {
response->notModified = true;
diff --git a/platform/node/src/node_mapbox_gl_native.cpp b/platform/node/src/node_mapbox_gl_native.cpp
index dddd74aece..a51e047b92 100644
--- a/platform/node/src/node_mapbox_gl_native.cpp
+++ b/platform/node/src/node_mapbox_gl_native.cpp
@@ -56,6 +56,33 @@ void RegisterModule(v8::Local<v8::Object> target, v8::Local<v8::Object> module)
Nan::New("Resource").ToLocalChecked(),
resource);
+ // Exports ResourceStatus constants.
+ v8::Local<v8::Object> errorCode = Nan::New<v8::Object>();
+
+ Nan::Set(errorCode,
+ Nan::New("NotFound").ToLocalChecked(),
+ Nan::New(static_cast<int32_t>(mbgl::ResourceStatus::NotFoundError)));
+
+ Nan::Set(errorCode,
+ Nan::New("Server").ToLocalChecked(),
+ Nan::New(static_cast<int32_t>(mbgl::ResourceStatus::ServerError)));
+
+ Nan::Set(errorCode,
+ Nan::New("Connection").ToLocalChecked(),
+ Nan::New(static_cast<int32_t>(mbgl::ResourceStatus::ConnectionError)));
+
+ Nan::Set(errorCode,
+ Nan::New("RateLimit").ToLocalChecked(),
+ Nan::New(static_cast<int32_t>(mbgl::ResourceStatus::RateLimitError)));
+
+ Nan::Set(errorCode,
+ Nan::New("Other").ToLocalChecked(),
+ Nan::New(static_cast<int32_t>(mbgl::ResourceStatus::OtherError)));
+
+ Nan::Set(target,
+ Nan::New("ErrorCode").ToLocalChecked(),
+ errorCode);
+
// Make the exported object inherit from EventEmitter
v8::Local<v8::Function> require = Nan::Get(module,
Nan::New("require").ToLocalChecked()).ToLocalChecked().As<v8::Function>();
diff --git a/platform/node/src/node_request.cpp b/platform/node/src/node_request.cpp
index 29aaa43cd4..4246b7fc2e 100644
--- a/platform/node/src/node_request.cpp
+++ b/platform/node/src/node_request.cpp
@@ -58,43 +58,47 @@ void NodeRequest::HandleCallback(const Nan::FunctionCallbackInfo<v8::Value>& inf
mbgl::Response response;
- if (info.Length() < 1) {
- response.noContent = true;
- } else if (info[0]->IsObject()) {
+ if (info.Length() >= 1 && info[0]->BooleanValue()) {
+ // First parameter is an error argument.
auto err = Nan::To<v8::Object>(info[0]).ToLocalChecked();
- auto msg = Nan::New("message").ToLocalChecked();
-
- if (Nan::Has(err, msg).FromJust()) {
- request->SetErrorMessage(*Nan::Utf8String(
- Nan::Get(err, msg).ToLocalChecked()));
- }
- } else if (info[0]->IsString()) {
- request->SetErrorMessage(*Nan::Utf8String(info[0]));
- } else if (info.Length() < 2 || !info[1]->IsObject()) {
- return Nan::ThrowTypeError("Second argument must be a response object");
- } else {
- auto res = Nan::To<v8::Object>(info[1]).ToLocalChecked();
- if (Nan::Has(res, Nan::New("modified").ToLocalChecked()).FromJust()) {
- const double modified = Nan::To<double>(Nan::Get(res, Nan::New("modified").ToLocalChecked()).ToLocalChecked()).FromJust();
- if (!std::isnan(modified)) {
- response.modified = mbgl::Timestamp{ mbgl::Seconds(
- static_cast<mbgl::Seconds::rep>(modified / 1000)) };
+ // Extract the status code from the Error object, if it has one.
+ mbgl::ResourceStatus status = mbgl::ResourceStatus::OtherError;
+ if (Nan::Has(err, Nan::New("code").ToLocalChecked()).FromJust()) {
+ status = static_cast<mbgl::ResourceStatus>(
+ Nan::To<uint32_t>(Nan::Get(err, Nan::New("code").ToLocalChecked()).ToLocalChecked())
+ .FromMaybe(static_cast<uint32_t>(mbgl::ResourceStatus::OtherError)));
+ // Validate the enum value.
+ switch (status) {
+ case mbgl::ResourceStatus::NotFoundError:
+ case mbgl::ResourceStatus::ServerError:
+ case mbgl::ResourceStatus::ConnectionError:
+ case mbgl::ResourceStatus::RateLimitError:
+ case mbgl::ResourceStatus::OtherError:
+ // Valid error enums.
+ break;
+ default:
+ // Invalid error enums.
+ return Nan::ThrowTypeError("Invalid error code. Must be one of NotFound, server, Connection, RateLimit, or Other");
}
}
- if (Nan::Has(res, Nan::New("expires").ToLocalChecked()).FromJust()) {
- const double expires = Nan::To<double>(Nan::Get(res, Nan::New("expires").ToLocalChecked()).ToLocalChecked()).FromJust();
- if (!std::isnan(expires)) {
- response.expires = mbgl::Timestamp{ mbgl::Seconds(
- static_cast<mbgl::Seconds::rep>(expires / 1000)) };
- }
+ // Extract the error message from the Error object.
+ std::string message;
+ if (Nan::Has(err, Nan::New("message").ToLocalChecked()).FromJust()) {
+ Nan::Utf8String string(
+ Nan::Get(err, Nan::New("message").ToLocalChecked()).ToLocalChecked());
+ message.assign(*string, string.length());
+ } else {
+ Nan::Utf8String string(err);
+ message.assign(*string, string.length());
}
- if (Nan::Has(res, Nan::New("etag").ToLocalChecked()).FromJust()) {
- const Nan::Utf8String etag(Nan::Get(res, Nan::New("etag").ToLocalChecked()).ToLocalChecked());
- response.etag = std::string { *etag, size_t(etag.length()) };
- }
+ response.error = std::make_unique<mbgl::Response::Error>(status, message);
+ } else if (info.Length() >= 2) {
+ // This is a successful response. It has an object as the second parameter that
+ // may contain data.
+ auto res = Nan::To<v8::Object>(info[1]).ToLocalChecked();
if (Nan::Has(res, Nan::New("data").ToLocalChecked()).FromJust()) {
auto data = Nan::Get(res, Nan::New("data").ToLocalChecked()).ToLocalChecked();
@@ -106,7 +110,11 @@ void NodeRequest::HandleCallback(const Nan::FunctionCallbackInfo<v8::Value>& inf
} else {
return Nan::ThrowTypeError("Response data must be a Buffer");
}
+ } else {
+ response.noContent = true;
}
+ } else {
+ response.noContent = true;
}
if (request->ErrorMessage()) {
diff --git a/platform/node/test/suite_implementation.js b/platform/node/test/suite_implementation.js
index b717ecd2b2..451f7d52e0 100644
--- a/platform/node/test/suite_implementation.js
+++ b/platform/node/test/suite_implementation.js
@@ -15,15 +15,25 @@ module.exports = function (style, options, callback) {
ratio: options.pixelRatio,
request: function(req, callback) {
request(req.url, {encoding: null}, function (err, response, body) {
+ var result;
if (err) {
- callback(err);
+ err.code = mbgl.ErrorCode.Connection;
+ } else if (response.statusCode == 200) {
+ result = { data: body };
+ } else if (response.statusCode == 204) {
+ result = {}; // no content
} else if (response.statusCode == 404) {
- callback();
- } else if (response.statusCode != 200) {
- callback(new Error(response.statusMessage));
+ err = new Error(response.statusMessage);
+ err.code = mbgl.ErrorCode.NotFound;
+ } else if (response.statusCode == 429) {
+ err = new Error(response.statusMessage);
+ err.code = mbgl.ErrorCode.RateLimit;
} else {
- callback(null, {data: body});
+ err = new Error(response.statusMessage);
+ err.code = (response.statusCode >= 500 && response.statusCode < 600) ?
+ mbgl.ErrorCode.ServerError : mbgl.ErrorCode.OtherError;
}
+ callback(err, result);
});
}
});
diff --git a/platform/qt/src/http_request.cpp b/platform/qt/src/http_request.cpp
index d74ed0e7ee..4805204382 100644
--- a/platform/qt/src/http_request.cpp
+++ b/platform/qt/src/http_request.cpp
@@ -111,12 +111,8 @@ void HTTPRequest::handleNetworkReply(QNetworkReply *reply)
response.notModified = true;
break;
case 404: {
- if (m_resource.kind == ResourceKind::Tile) {
- response.noContent = true;
- } else {
- response.error = std::make_unique<Error>(
- ResourceStatus::NotFoundError, "HTTP status code 404");
- }
+ response.error = std::make_unique<Error>(
+ ResourceStatus::NotFoundError, "HTTP status code 404");
break;
}
case 429: