From f85eef9bcdc35c69395ce457393e5c11868ae024 Mon Sep 17 00:00:00 2001 From: evazion Date: Sun, 21 Jun 2020 18:03:00 -0500 Subject: [PATCH] nijie: fix bug with retries returning cached responses. Bug: if a Nijie login failed with a 429 Too Many Requests error, the error would get cached, so when we retried the request, we would just get our own cached response back every time. The 429 error would eventually be passed up to the Nijie strategy, which caused random methods to fail because they couldn't get the html page. Fix: add the `retriable` feature *after* the `cache` feature so that retries don't go through the cache. This is a hack. We want retries to go at the bottom of the stack, below caching, but we can't enforce this ordering. --- app/logical/danbooru/http.rb | 1 - app/logical/danbooru/http/retriable.rb | 2 ++ app/logical/sources/strategies/nijie.rb | 5 ++++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/logical/danbooru/http.rb b/app/logical/danbooru/http.rb index 590271fe0..8e8655965 100644 --- a/app/logical/danbooru/http.rb +++ b/app/logical/danbooru/http.rb @@ -25,7 +25,6 @@ module Danbooru .headers("Accept-Encoding" => "gzip") .headers("User-Agent": "#{Danbooru.config.canonical_app_name}/#{Rails.application.config.x.git_hash}") .use(:auto_inflate) - .use(:retriable) .use(redirector: { max_redirects: MAX_REDIRECTS }) .use(:session) end diff --git a/app/logical/danbooru/http/retriable.rb b/app/logical/danbooru/http/retriable.rb index 681dd8bbe..23d5e865a 100644 --- a/app/logical/danbooru/http/retriable.rb +++ b/app/logical/danbooru/http/retriable.rb @@ -21,6 +21,8 @@ module Danbooru retries = max_retries while retriable?(response) && retries > 0 && retry_delay(response) <= max_delay + DanbooruLogger.info "Retrying url=#{request.uri} status=#{response.status} retries=#{retries} delay=#{retry_delay(response)}" + retries -= 1 sleep(retry_delay(response)) response = yield request diff --git a/app/logical/sources/strategies/nijie.rb b/app/logical/sources/strategies/nijie.rb index f3a15b576..b2a6fcc7a 100644 --- a/app/logical/sources/strategies/nijie.rb +++ b/app/logical/sources/strategies/nijie.rb @@ -180,7 +180,10 @@ module Sources http = Danbooru::Http.new form = { email: Danbooru.config.nijie_login, password: Danbooru.config.nijie_password } - response = http.cache(1.hour).post("https://nijie.info/login_int.php", form: form) + + # XXX `retriable` must come after `cache` so that retries don't return cached error responses. + response = http.cache(1.hour).use(:retriable).post("https://nijie.info/login_int.php", form: form) + DanbooruLogger.info "Nijie login failed (#{url}, #{response.status})" if response.status != 200 return nil unless response.status == 200 response = http.cookies(R18: 1).cache(1.minute).get(page_url)