Skip to content

Commit

Permalink
Merge pull request #6212 from empty-codes/fix-request-uri-too-long
Browse files Browse the repository at this point in the history
Fix: Prevents `414 request-uri too long` for `import_articles_by_title` by using a POST request
  • Loading branch information
ragesoss authored Feb 25, 2025
2 parents d0d5411 + f4fe9d6 commit 34d4669
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 5 deletions.
2 changes: 1 addition & 1 deletion app/models/wiki.rb
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ def ensure_valid_project

def ensure_wiki_exists
return if errors.any? # Skip this check if the wiki had a validation error.
site_info = WikiApi.new(self).query(meta: :siteinfo)
site_info = WikiApi.new(self).meta(:siteinfo)
raise InvalidWikiError, domain if site_info.nil?
servername = site_info.data.dig('general', 'servername')
raise InvalidWikiError, domain unless base_url == "https://#{servername}"
Expand Down
2 changes: 1 addition & 1 deletion lib/importers/article_importer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def import_articles_by_title(titles)
# 40 is too much for some languages, such as bn.wipedia.org
titles.each_slice(30) do |some_article_titles|
query = { prop: 'info', titles: some_article_titles }
response = WikiApi.new(@wiki).query(query)
response = WikiApi.new(@wiki).query(query, http_method: :post)
results = response&.data
next if results.blank?
results = results['pages']
Expand Down
9 changes: 7 additions & 2 deletions lib/wiki_api.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,13 @@ def initialize(wiki = nil, update_service = nil)
################

# General entry point for making arbitrary queries of a MediaWiki wiki's API
def query(query_parameters)
mediawiki('query', query_parameters)
def query(query_parameters= {}, http_method: :get)
mediawiki('query', query_parameters.merge(http_method:))
end

def meta(type, params = {})
@mediawiki = api_client
@mediawiki.meta(type, params)
end

# Returns nil if it cannot get any info from the wiki, but returns
Expand Down
54 changes: 54 additions & 0 deletions spec/lib/importers/article_importer_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

let(:en_wiki) { Wiki.default_wiki }
let(:es_wiki) { create(:wiki, language: 'es', project: 'wikipedia') }
let(:kn_wiki) { create(:wiki, language: 'kn', project: 'wikipedia') }

describe '.import_articles' do
it 'creates an Article from a English Wikipedia page_id' do
Expand Down Expand Up @@ -67,5 +68,58 @@
expect(Article.find_by(title: 'Istanbul').mw_page_id).to eq(3391396)
end
end

it 'returns the correct number of titles without raising error 414' do
VCR.use_cassette 'article_importer/some_article_titles' do
# Non-ASCII characters like those in the Kannada language shown
# below use 2 to 4 bytes per character in UTF-8 compared to the
# 1 byte of ASCII characters. If the titles below are appended
# to a GET request url as a parameter, the error '414 request uri too long'
# occurs. The fix is using a POST request instead and passing the titles
# as parameters in the request body.
titles = %w[
ವಿಕಿಪೀಡಿಯ:ಬದಲಿ
ವಿಕಿಪೀಡಿಯ:Talk_page_templates
ವಿಕಿಪೀಡಿಯ:ಸ್ಪಾಯ್ಲರ್
ವಿಕಿಪೀಡಿಯ:Revision_deletion
ವಿಕಿಪೀಡಿಯ:Open_proxies
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಭಾರತೀಯ)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಖಗೋಳ_ವಸ್ತುಗಳು)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಪುಸ್ತಕಗಳು)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಪ್ರಸಾರ)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ರಸಾಯನಶಾಸ್ತ್ರ)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಪಾದ್ರಿಗಳು)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಕಾಮಿಕ್ಸ್)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಕಂಪನಿಗಳು)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ದೇಶ-ನಿರ್ದಿಷ್ಟ_ವಿಷಯಗಳು)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿನ_ಸಂಪ್ರದಾಯಗಳು_(ನಿರ್ದಿಷ್ಟ_ಅಥವಾ_ಅನಿರ್ದಿಷ್ಟ_ಲೇಖನ_ಹೆಸರಿನ_ಆರಂಭದಲ್ಲಿ)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಜನಾಂಗೀಯಗಳು_ಮತ್ತು_ಬುಡಕಟ್ಟುಗಳು)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಪ್ರಾಣಿ)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಚಲನಚಿತ್ರಗಳು)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಭೌಗೋಳಿಕ_ಹೆಸರುಗಳು)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಸರ್ಕಾರ_ಮತ್ತು_ಕಾನೂನು)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಐಸ್_ಹಾಕಿ)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಭಾಷೆಗಳು)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಕಾನೂನು_ಜಾರಿ_ಏಜೆನ್ಸಿ_ವರ್ಗಗಳು)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಪಟ್ಟಿಗಳು)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಹಸ್ತಪ್ರತಿಗಳು)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಸಂಗೀತ)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಸಂಖ್ಯೆಗಳು_ಮತ್ತು_ದಿನಾಂಕಗಳು)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಜನರು)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ಬಹುವಚನಗಳು)
ವಿಕಿಪೀಡಿಯ:ಹೆಸರಿಸುವ_ಸಂಪ್ರದಾಯಗಳು_(ರಾಜಕೀಯ_ಪಕ್ಷಗಳು)
]

described_class.new(kn_wiki).import_articles_by_title(titles)

response = VCR.current_cassette.serializable_hash.dig('http_interactions', 0, 'response')
expect(response['status']['code']).not_to eq(414)

# Multiple titles could belong to a single article
# so count number of titles instead of articles
title_count_in_response = response['body']['string'].scan(/"title":/).count
expect(title_count_in_response).to eq(titles.count)
end
end
end
end
3 changes: 2 additions & 1 deletion spec/support/request_helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,8 @@ def stub_wiki_validation
'gl.wikipedia.org',
'nl.wikipedia.org',
'sv.wikipedia.org',
'uk.wikipedia.org'
'uk.wikipedia.org',
'kn.wikipedia.org'
]

wikis.each do |wiki|
Expand Down

0 comments on commit 34d4669

Please sign in to comment.