diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e8ea90d5..ad8cb3ee6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ ### Breaking Changes -_None_ +- Propose to retry when `gp_downloadmetadata` receives a `429 - Too Many Requests` error. [#406] ### New Features @@ -14,7 +14,7 @@ _None_ ### Bug Fixes -_None_ +- Update the URL used by `gp_downloadmetadata` to prevent consistent `301` responses. [#406] ### Internal Changes diff --git a/lib/fastlane/plugin/wpmreleasetoolkit/actions/common/gp_downloadmetadata_action.rb b/lib/fastlane/plugin/wpmreleasetoolkit/actions/common/gp_downloadmetadata_action.rb index 801c2c8a9..81d02a5e7 100644 --- a/lib/fastlane/plugin/wpmreleasetoolkit/actions/common/gp_downloadmetadata_action.rb +++ b/lib/fastlane/plugin/wpmreleasetoolkit/actions/common/gp_downloadmetadata_action.rb @@ -19,14 +19,14 @@ def self.run(params) params[:locales].each do |loc| if loc.is_a?(Array) - puts "Downloading language: #{loc[1]}" - complete_url = "#{params[:project_url]}#{loc[0]}/default/export-translations?filters[status]=current&format=json" + UI.message "Downloading language: #{loc[1]}" + complete_url = "#{params[:project_url]}#{loc[0]}/default/export-translations/?filters[status]=current&format=json" downloader.download(loc[1], complete_url, loc[1] == params[:source_locale]) end if loc.is_a?(String) - puts "Downloading language: #{loc}" - complete_url = "#{params[:project_url]}#{loc}/default/export-translations?filters[status]=current&format=json" + UI.message "Downloading language: #{loc}" + complete_url = "#{params[:project_url]}#{loc}/default/export-translations/?filters[status]=current&format=json" downloader.download(loc, complete_url, loc == params[:source_locale]) end end diff --git a/lib/fastlane/plugin/wpmreleasetoolkit/helper/metadata_download_helper.rb b/lib/fastlane/plugin/wpmreleasetoolkit/helper/metadata_download_helper.rb index 06ab2a571..5e108ecc8 100644 --- a/lib/fastlane/plugin/wpmreleasetoolkit/helper/metadata_download_helper.rb +++ b/lib/fastlane/plugin/wpmreleasetoolkit/helper/metadata_download_helper.rb @@ -16,12 +16,7 @@ def initialize(target_folder, target_files) def download(target_locale, glotpress_url, is_source) uri = URI(glotpress_url) response = Net::HTTP.get_response(uri) - response = Net::HTTP.get_response(URI.parse(response.header['location'])) if response.code == '301' - - @alternates.clear - loc_data = JSON.parse(response.body) rescue loc_data = nil - parse_data(target_locale, loc_data, is_source) - reparse_alternates(target_locale, loc_data, is_source) unless @alternates.length == 0 + handle_glotpress_download(response: response, locale: target_locale, is_source: is_source) end # Parse JSON data and update the local files @@ -100,6 +95,34 @@ def delete_existing_metadata(target_locale) def get_target_file_path(locale, file_name) "#{@target_folder}/#{locale}/#{file_name}" end + + private + + def handle_glotpress_download(response:, locale:, is_source:) + case response.code + when '200' + # All good, parse the result + UI.success("Successfully downloaded `#{locale}`.") + @alternates.clear + loc_data = JSON.parse(response.body) rescue loc_data = nil + parse_data(locale, loc_data, is_source) + reparse_alternates(target_locale, loc_data, is_source) unless @alternates.length == 0 + when '301' + # Follow the redirect + UI.message("Received 301 for `#{locale}`. Following redirect...") + download(locale, response.header['location'], is_source) + when '429' + # We got rate-limited, offer to try again + if UI.confirm("Retry downloading `#{locale}` after receiving 429 from the API?") + download(locale, response.uri, is_source) + else + UI.error("Abandoning `#{locale}` download as requested.") + end + else + message = "Received unexpected #{response.code} from request to URI #{response.uri}." + UI.abort_with_message!(message) unless UI.confirm("#{message} Continue anyway?") + end + end end end end