Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: Prevents 414 request-uri too long for import_articles_by_title by using a POST request #6212

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading