diff --git a/tests/workers/purge_cache_worker_tests.rb b/tests/workers/purge_cache_worker_tests.rb index 834261bb..48b5ee3f 100644 --- a/tests/workers/purge_cache_worker_tests.rb +++ b/tests/workers/purge_cache_worker_tests.rb @@ -6,34 +6,50 @@ describe PurgeCacheWorker do end it 'throws exception without 200 or 404 http status' do - stub_request(:get, "http://#{@test_ip}/:cache/purgetest.jpg"). + stub_request(:get, "http://#{@test_ip}/:cache/purge/test.jpg"). with(headers: {'Host' => 'kyledrake.neocities.org'}) .to_return(status: 503) worker = PurgeCacheWorker.new proc { - worker.perform @test_ip, 'kyledrake', 'test.jpg' + worker.perform @test_ip, 'kyledrake', '/test.jpg' }.must_raise RestClient::ServiceUnavailable end it 'handles 404 without exception' do - stub_request(:get, "http://#{@test_ip}/:cache/purgetest.jpg"). + stub_request(:get, "http://#{@test_ip}/:cache/purge/test.jpg"). with(headers: {'Host' => 'kyledrake.neocities.org'}) .to_return(status: 404) worker = PurgeCacheWorker.new - worker.perform @test_ip, 'kyledrake', 'test.jpg' + worker.perform @test_ip, 'kyledrake', '/test.jpg' end it 'sends a purge request' do - stub_request(:get, "http://#{@test_ip}/:cache/purgetest.jpg"). + stub_request(:get, "http://#{@test_ip}/:cache/purge/test.jpg"). with(headers: {'Host' => 'kyledrake.neocities.org'}) .to_return(status: 200) worker = PurgeCacheWorker.new - worker.perform @test_ip, 'kyledrake', 'test.jpg' + worker.perform @test_ip, 'kyledrake', '/test.jpg' - assert_requested :get, "http://#{@test_ip}/:cache/purgetest.jpg" + assert_requested :get, "http://#{@test_ip}/:cache/purge/test.jpg" + end + + it 'handles spaces correctly' do + stub_request(:get, "http://#{@test_ip}/:cache/purge/te st.jpg"). + with(headers: {'Host' => 'kyledrake.neocities.org'}) + .to_return(status: 200) + + url = Addressable::URI.encode_component( + "http://#{@test_ip}/:cache/purge/te st.jpg", + Addressable::URI::CharacterClasses::QUERY + ) + + worker = PurgeCacheWorker.new + worker.perform @test_ip, 'kyledrake', '/te st.jpg' + + assert_requested :get, url end end diff --git a/workers/purge_cache_worker.rb b/workers/purge_cache_worker.rb index 2d42b0b4..5f03af6d 100644 --- a/workers/purge_cache_worker.rb +++ b/workers/purge_cache_worker.rb @@ -1,3 +1,5 @@ +require 'open-uri' + class PurgeCacheWorker include Sidekiq::Worker sidekiq_options queue: :purgecache, retry: 1000, backtrace: false, average_scheduled_poll_interval: 1 @@ -8,9 +10,12 @@ class PurgeCacheWorker end def perform(proxy_ip, username, path) - url = "http://#{proxy_ip}/:cache/purge#{path}" + url = Addressable::URI.encode_component( + "http://#{proxy_ip}/:cache/purge#{path}", + Addressable::URI::CharacterClasses::QUERY + ) begin - RestClient.get(url, host: "#{username}.neocities.org") + RestClient.get(url, host: URI::encode("#{username}.neocities.org")) rescue RestClient::ResourceNotFound end end