Percent-encode unsafe characters in a filename when composing each URL.

Akinori MUSHA преди 9 години
родител
ревизия
01dbb1a94a
променени са 2 файла, в които са добавени 16 реда и са изтрити 2 реда
  1. 10 2
      app/models/agents/ftpsite_agent.rb
  2. 6 0
      spec/models/agents/ftpsite_agent_spec.rb

+ 10 - 2
app/models/agents/ftpsite_agent.rb

@@ -174,8 +174,8 @@ module Agents
174 174
       new_files.sort_by { |filename|
175 175
         found_entries[filename]
176 176
       }.each { |filename|
177
-        create_event :payload => {
178
-          'url' => "#{base_uri}#{filename}",
177
+        create_event payload: {
178
+          'url' => (base_uri + uri_path_escape(filename)).to_s,
179 179
           'filename' => filename,
180 180
           'timestamp' => found_entries[filename],
181 181
         }
@@ -192,5 +192,13 @@ module Agents
192 192
     rescue
193 193
       false
194 194
     end
195
+
196
+    def uri_path_escape(string)
197
+      str = string.dup.force_encoding(Encoding::ASCII_8BIT)  # string.b in Ruby >=2.0
198
+      str.gsub!(/([^A-Za-z0-9\-._~!$&()*+,=@]+)/) { |m|
199
+        '%' + m.unpack('H2' * m.bytesize).join('%').upcase
200
+      }
201
+      str.force_encoding(Encoding::US_ASCII)
202
+    end
195 203
   end
196 204
 end

+ 6 - 0
spec/models/agents/ftpsite_agent_spec.rb

@@ -76,6 +76,12 @@ describe Agents::FtpsiteAgent do
76 76
           'timestamp' => '2014-04-02T10:00:00Z',
77 77
         }
78 78
 
79
+        Event.last.payload.should == {
80
+          'url' => 'ftp://ftp.example.org/pub/releases/example%20latest.tar.gz',
81
+          'filename' => 'example latest.tar.gz',
82
+          'timestamp' => '2014-04-02T10:00:01Z',
83
+        }
84
+
79 85
         lambda { @checker.check }.should_not change { Event.count }
80 86
       end
81 87
     end