diff options
Diffstat (limited to 'platform')
-rw-r--r-- | platform/android/src/http_file_source.cpp | 2 | ||||
-rw-r--r-- | platform/darwin/src/http_file_source.mm | 2 | ||||
-rw-r--r-- | platform/default/default_file_source.cpp | 4 | ||||
-rw-r--r-- | platform/default/http_file_source.cpp | 2 | ||||
-rw-r--r-- | platform/node/src/node_mapbox_gl_native.cpp | 27 | ||||
-rw-r--r-- | platform/node/src/node_request.cpp | 68 | ||||
-rw-r--r-- | platform/node/test/suite_implementation.js | 20 | ||||
-rw-r--r-- | platform/qt/src/http_request.cpp | 8 |
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: |