Fix kiwix proxy 502ing on article links with non-ASCII titles
CI / check (push) Successful in 40s
CI / deploy (push) Successful in 12s

Sinatra decodes a route's splat before handing it to the block, so an
article link like /kiwix/content/wikipedia/Dlhé_diely arrived as raw
UTF-8, not percent-encoded. URI#path= rejects that outright
(URI::InvalidComponentError) rather than escaping it, which .proxy's
rescue turned into a silent nil -> every article link 502'd, while the
search results page linking to them worked fine (its own path,
/kiwix/search, is plain ASCII).
This commit is contained in:
randy committed 2026-09-09 15:55:48 +02:00
1 parent 5ff9b113d9
commit 2b49eda7cb
2 files changed
+33 -1

No files matched your search

+25
View File
@@ -45,4 +45,29 @@ class KiwixTest < Minitest::Test
def test_proxy_returns_nil_when_nothing_is_listening
assert_nil Maptool::Kiwix.proxy("http://127.0.0.1:1", "/kiwix/search", "", open_timeout: 1)
end
# A path with non-ASCII characters, e.g. an article title like
# "/kiwix/content/wikipedia/Dlhé_diely" — exactly what Sinatra's splat
# hands .proxy for a real article link, already URL-*decoded*. Used to
# raise URI::InvalidComponentError (caught, so this returned nil — every
# article link 502'd) since URI#path= rejects raw UTF-8 bytes outright
# instead of escaping them.
def test_proxy_escapes_non_ascii_characters_in_the_path
server = TCPServer.new("127.0.0.1", 0)
port = server.addr[1]
request_line = nil
thread = Thread.new do
client = server.accept
request_line = client.gets
client.print("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: 0\r\n\r\n")
client.close
end
response = Maptool::Kiwix.proxy("http://127.0.0.1:#{port}", "/kiwix/content/wikipedia/Dlhé_diely", "")
thread.join
server.close
assert_equal "GET /kiwix/content/wikipedia/Dlh%C3%A9_diely HTTP/1.1\r\n", request_line
assert_equal "200", response.code
end
end