diff --git a/app/logical/danbooru/http.rb b/app/logical/danbooru/http.rb index 43530522e..6147218f7 100644 --- a/app/logical/danbooru/http.rb +++ b/app/logical/danbooru/http.rb @@ -120,11 +120,17 @@ module Danbooru def request(method, url, **options) http.send(method, url, **options) + rescue OpenSSL::SSL::SSLError + fake_response(590, "") rescue ValidatingSocket::ProhibitedIpError - fake_response(597, "") + fake_response(591, "") rescue HTTP::Redirector::TooManyRedirectsError - fake_response(598, "") + fake_response(596, "") rescue HTTP::TimeoutError + fake_response(597, "") + rescue HTTP::ConnectionError + fake_response(598, "") + rescue HTTP::Error fake_response(599, "") end diff --git a/test/unit/danbooru_http_test.rb b/test/unit/danbooru_http_test.rb index 08ad71f64..a981bc0ea 100644 --- a/test/unit/danbooru_http_test.rb +++ b/test/unit/danbooru_http_test.rb @@ -19,21 +19,31 @@ class DanbooruHttpTest < ActiveSupport::TestCase should "fail if redirected too many times" do skip "Skipping test (https://github.com/postmanlabs/httpbin/issues/617)" response = Danbooru::Http.get("https://httpbin.org/absolute-redirect/10") - assert_equal(598, response.status) + assert_equal(596, response.status) end should "fail if the request takes too long to connect" do response = Danbooru::Http.timeout(1).get("https://httpbin.org/delay/5") - assert_equal(599, response.status) + assert_equal(597, response.status) end should "fail if the request takes too long to download" do - # XXX should return status 599 instead + # XXX should return status 597 instead assert_raises(HTTP::TimeoutError) do response = Danbooru::Http.timeout(1).get("https://httpbin.org/drip?duration=10&numbytes=10").flush end end + should "return a 5xx error if the domain can't be resolved" do + response = Danbooru::Http.get("http://doesnotexist.donmai.us") + assert_equal(598, response.status) + end + + should "return a 5xx error if the SSL certificate is expired" do + response = Danbooru::Http.get("https://expired.badssl.com") + assert_equal(590, response.status) + end + should "automatically decompress gzipped responses" do response = Danbooru::Http.get("https://httpbin.org/gzip") assert_equal(200, response.status)