From b9074a9930fbf74a2099e9fc10ee6312662ddde4 Mon Sep 17 00:00:00 2001 From: Akinori MUSHA Date: Thu, 7 Aug 2014 18:11:20 +0900 Subject: [PATCH] Percent-encode unsafe characters in a filename when composing each URL. --- app/models/agents/ftpsite_agent.rb | 12 ++++++++++-- spec/models/agents/ftpsite_agent_spec.rb | 6 ++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/models/agents/ftpsite_agent.rb b/app/models/agents/ftpsite_agent.rb index 7cb27e81..8af1262d 100644 --- a/app/models/agents/ftpsite_agent.rb +++ b/app/models/agents/ftpsite_agent.rb @@ -174,8 +174,8 @@ module Agents new_files.sort_by { |filename| found_entries[filename] }.each { |filename| - create_event :payload => { - 'url' => "#{base_uri}#{filename}", + create_event payload: { + 'url' => (base_uri + uri_path_escape(filename)).to_s, 'filename' => filename, 'timestamp' => found_entries[filename], } @@ -192,5 +192,13 @@ module Agents rescue false end + + def uri_path_escape(string) + str = string.dup.force_encoding(Encoding::ASCII_8BIT) # string.b in Ruby >=2.0 + str.gsub!(/([^A-Za-z0-9\-._~!$&()*+,=@]+)/) { |m| + '%' + m.unpack('H2' * m.bytesize).join('%').upcase + } + str.force_encoding(Encoding::US_ASCII) + end end end diff --git a/spec/models/agents/ftpsite_agent_spec.rb b/spec/models/agents/ftpsite_agent_spec.rb index 5fd411ec..d340e363 100644 --- a/spec/models/agents/ftpsite_agent_spec.rb +++ b/spec/models/agents/ftpsite_agent_spec.rb @@ -76,6 +76,12 @@ describe Agents::FtpsiteAgent do 'timestamp' => '2014-04-02T10:00:00Z', } + Event.last.payload.should == { + 'url' => 'ftp://ftp.example.org/pub/releases/example%20latest.tar.gz', + 'filename' => 'example latest.tar.gz', + 'timestamp' => '2014-04-02T10:00:01Z', + } + lambda { @checker.check }.should_not change { Event.count } end end