diff --git a/platform/android/http_request_android.cpp b/platform/android/http_request_android.cpp index 5c5805906..6e44db4b1 100644 --- a/platform/android/http_request_android.cpp +++ b/platform/android/http_request_android.cpp @@ -292,6 +292,9 @@ void HTTPAndroidRequest::onResponse(int code, std::string message, std::string e } else if (code == 200) { response->status = Response::Successful; status = ResponseStatus::Successful; + } else if (responseCode == 404) { + response->status = Response::NotFound; + status = ResponseStatus::Successful; } else if (code >= 500 && code < 600) { response->status = Response::Error; response->message = "HTTP status code " + util::toString(code); diff --git a/platform/darwin/http_request_nsurl.mm b/platform/darwin/http_request_nsurl.mm index 33f5f043e..f1f6e3fbb 100644 --- a/platform/darwin/http_request_nsurl.mm +++ b/platform/darwin/http_request_nsurl.mm @@ -294,6 +294,9 @@ void HTTPNSURLRequest::handleResult(NSData *data, NSURLResponse *res, NSError *e } else if (responseCode == 200) { response->status = Response::Successful; status = ResponseStatus::Successful; + } else if (responseCode == 404) { + response->status = Response::NotFound; + status = ResponseStatus::Successful; } else if (responseCode >= 500 && responseCode < 600) { // Server errors may be temporary, so back off exponentially. response->status = Response::Error; diff --git a/platform/default/http_request_curl.cpp b/platform/default/http_request_curl.cpp index 0f7f8c0ac..7ea920855 100644 --- a/platform/default/http_request_curl.cpp +++ b/platform/default/http_request_curl.cpp @@ -703,6 +703,9 @@ void HTTPCURLRequest::handleResult(CURLcode code) { } else if (responseCode == 200) { response->status = Response::Successful; return finish(ResponseStatus::Successful); + } else if (responseCode == 404) { + response->status = Response::NotFound; + return finish(ResponseStatus::Successful); } else if (responseCode >= 500 && responseCode < 600) { // Server errors may be temporary, so back off exponentially. response->status = Response::Error; diff --git a/test/storage/http_reading.cpp b/test/storage/http_reading.cpp index b322bbf2a..78f69cae3 100644 --- a/test/storage/http_reading.cpp +++ b/test/storage/http_reading.cpp @@ -9,6 +9,7 @@ TEST_F(Storage, HTTPReading) { SCOPED_TEST(HTTPTest) SCOPED_TEST(HTTP404) + SCOPED_TEST(HTTP500) using namespace mbgl; @@ -31,14 +32,25 @@ TEST_F(Storage, HTTPReading) { fs.request({ Resource::Unknown, "http://127.0.0.1:3000/doesnotexist" }, uv_default_loop(), [&](const Response &res) { EXPECT_EQ(uv_thread_self(), mainThread); - EXPECT_EQ(Response::Error, res.status); - EXPECT_EQ("HTTP status code 404", res.message); + EXPECT_EQ(Response::NotFound, res.status); + EXPECT_EQ("", res.message); EXPECT_EQ(0, res.expires); EXPECT_EQ(0, res.modified); EXPECT_EQ("", res.etag); HTTP404.finish(); }); + fs.request({ Resource::Unknown, "http://127.0.0.1:3000/permanent-error" }, uv_default_loop(), + [&](const Response &res) { + EXPECT_EQ(uv_thread_self(), mainThread); + EXPECT_EQ(Response::Error, res.status); + EXPECT_EQ("HTTP status code 500", res.message); + EXPECT_EQ(0, res.expires); + EXPECT_EQ(0, res.modified); + EXPECT_EQ("", res.etag); + HTTP500.finish(); + }); + uv_run(uv_default_loop(), UV_RUN_DEFAULT); } diff --git a/test/storage/server.js b/test/storage/server.js index 9f6def9c0..342a61cdc 100755 --- a/test/storage/server.js +++ b/test/storage/server.js @@ -73,6 +73,9 @@ app.get('/revalidate-etag', function(req, res) { revalidateEtagCounter++; }); +app.get('/permanent-error', function(req, res) { + res.status(500).end(); +}); var temporaryErrorCounter = 0; app.get('/temporary-error', function(req, res) {