downspout 0.2.4 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +0 -15
- data/VERSION +1 -1
- data/lib/downspout/downloader.rb +34 -36
- data/test/fixtures/faux_headers.txt +10 -0
- data/test/unit/downloader_test.rb +25 -1
- metadata +4 -3
data/Rakefile
CHANGED
@@ -51,18 +51,3 @@ Rake::TestTask.new(:test) do |test|
|
|
51
51
|
end
|
52
52
|
|
53
53
|
task :default => :test
|
54
|
-
|
55
|
-
namespace :basic do
|
56
|
-
desc "Basic Steps to take when updating this gem via GemCutter"
|
57
|
-
task :steps do
|
58
|
-
puts "rake version:bump:patch"
|
59
|
-
puts "rake gemspec"
|
60
|
-
puts ">>> write code <<<"
|
61
|
-
puts "rake test"
|
62
|
-
puts "rake build"
|
63
|
-
puts "gem install pkg/downspout-{version}.gem"
|
64
|
-
puts ">>> manual tests <<<"
|
65
|
-
puts "git commit"
|
66
|
-
puts "gem push pkg/downspout-{version}.gem"
|
67
|
-
end
|
68
|
-
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.5
|
data/lib/downspout/downloader.rb
CHANGED
@@ -171,9 +171,7 @@ module Downspout
|
|
171
171
|
ftp = Net::FTP.open( @uri.host ) do |ftp|
|
172
172
|
ftp.login( cred.user_name, cred.pass_word ) unless cred.nil?
|
173
173
|
ftp.passive
|
174
|
-
ftp.chdir( File.dirname( @uri.path ) )
|
175
|
-
|
176
|
-
$logger.debug("downspout | downloader | net_ftp_download | Local Path : #{@path} ...")
|
174
|
+
ftp.chdir( File.dirname( @uri.path ) )
|
177
175
|
ftp.getbinaryfile( self.basename, @path )
|
178
176
|
end
|
179
177
|
rescue Exception => e
|
@@ -181,10 +179,12 @@ module Downspout
|
|
181
179
|
raise e
|
182
180
|
end
|
183
181
|
|
184
|
-
|
185
|
-
|
182
|
+
if !(File.exist?( @path )) then
|
183
|
+
$logger.error("downspout | downloader | net_ftp_download | #{basename} download failed.")
|
184
|
+
return false
|
185
|
+
end
|
186
186
|
|
187
|
-
return
|
187
|
+
return true
|
188
188
|
end
|
189
189
|
|
190
190
|
def net_http_download
|
@@ -193,12 +193,8 @@ module Downspout
|
|
193
193
|
begin
|
194
194
|
response = net_http_fetch( @url , 1)
|
195
195
|
open( @path, "wb" ) do |file|
|
196
|
-
|
197
196
|
file.write(response.body)
|
198
197
|
end
|
199
|
-
|
200
|
-
$logger.debug("downspout | downloader | net_http_download | Response Body : #{response.body[0..5].strip}")
|
201
|
-
|
202
198
|
rescue SocketError => dns_err
|
203
199
|
$logger.error("downspout | downloader | net_http_download | Net/HTTP DNS Error | #{@uri.host} | #{dns_err.inspect}")
|
204
200
|
remove_file_at_target_path
|
@@ -212,23 +208,19 @@ module Downspout
|
|
212
208
|
@response.each_header do |k,v|
|
213
209
|
new_header_str += "#{k}: #{v}\r\n"
|
214
210
|
end
|
215
|
-
|
216
|
-
|
211
|
+
parse_headers_from_string!( new_header_str )
|
217
212
|
|
218
213
|
if ((response.code.to_i != 200) and (response.code.to_i != 202)) then
|
219
214
|
# missing file, failed download - delete the response body [if downloaded]
|
220
215
|
remove_file_at_target_path
|
221
216
|
return false
|
222
217
|
end
|
223
|
-
|
224
|
-
$logger.debug("downspout | downloader | net_http_download | Headers : #{response.header}")
|
225
218
|
|
226
219
|
if !( File.exist?( @path ) ) then
|
227
220
|
$logger.error("downspout | downloader | net_http_download | Missing File at download path : #{@path}")
|
228
221
|
return false
|
229
222
|
end
|
230
223
|
|
231
|
-
$logger.debug("downspout | downloader | net_http_download | Successful.")
|
232
224
|
return true
|
233
225
|
end
|
234
226
|
|
@@ -244,19 +236,17 @@ module Downspout
|
|
244
236
|
# TODO : implement credentials for downloads via net_http_fetch
|
245
237
|
my_request.basic_auth 'account', 'p4ssw0rd'
|
246
238
|
|
247
|
-
$logger.debug("downspout | downloader | net_http_fetch | Firing...")
|
248
239
|
@response = Net::HTTP.start( u.host, u.port ) do |http|
|
249
240
|
http.request( my_request )
|
250
241
|
end
|
251
242
|
|
252
|
-
$logger.debug("downspout | downloader | net_http_fetch | Response : #{@response}")
|
253
|
-
|
254
243
|
case @response
|
255
244
|
when Net::HTTPSuccess
|
256
245
|
@response
|
257
246
|
when Net::HTTPRedirection
|
258
247
|
net_http_fetch( @response['location'], limit - 1 )
|
259
248
|
else
|
249
|
+
$logger.error("downspout | downloader | net_http_fetch | Response : #{@response}")
|
260
250
|
@response.error!
|
261
251
|
end
|
262
252
|
end
|
@@ -278,10 +268,8 @@ module Downspout
|
|
278
268
|
remove_file_at_target_path
|
279
269
|
end
|
280
270
|
|
281
|
-
$logger.debug("downspout | downloader | curb_http_download | Headers : #{curb.header_str}")
|
282
|
-
|
283
271
|
# populate the response headers from curb header string
|
284
|
-
|
272
|
+
parse_headers_from_string!( curb.header_str )
|
285
273
|
|
286
274
|
# populate a 'proxy' HTTPResponse object with the Curb data...
|
287
275
|
hr_klass = Net::HTTPResponse.send('response_class', curb.response_code.to_s)
|
@@ -291,19 +279,15 @@ module Downspout
|
|
291
279
|
curb.response_code,
|
292
280
|
@response_headers["HTTP"][:message] )
|
293
281
|
|
294
|
-
$logger.debug("downspout | downloader | curb_http_download | Response : #{@response.inspect}")
|
295
|
-
|
296
282
|
if !( File.exist?( @path ) ) then
|
297
283
|
$logger.error("downspout | downloader | curb_http_download | Missing File at download path : #{@path}")
|
298
284
|
return false
|
299
285
|
end
|
300
286
|
|
301
|
-
$logger.debug("downspout | downloader | curb_http_download | Successful.")
|
302
287
|
return true
|
303
288
|
end
|
304
289
|
|
305
|
-
def parse_headers_from_string( header_str )
|
306
|
-
$logger.debug("downspout | downloader | parse_headers_from_string | String : #{header_str}")
|
290
|
+
def parse_headers_from_string!( header_str )
|
307
291
|
header_hash = {}
|
308
292
|
http_hash = {}
|
309
293
|
headers = header_str.split("\r\n")
|
@@ -314,40 +298,54 @@ module Downspout
|
|
314
298
|
http_hash[:code] = (http_info.split("\r\n")[0].split(" ")[1]).to_i
|
315
299
|
http_hash[:message] = http_info.split("\r\n")[0].split(" ")[2]
|
316
300
|
|
317
|
-
$logger.debug("downspout | downloader | parse_headers_from_string | Response : #{http_hash[:version]}, #{http_hash[:code]}, #{http_hash[:message]}")
|
318
301
|
header_hash["HTTP"] = http_hash
|
319
302
|
|
320
303
|
headers[1..-1].each do |line|
|
321
304
|
header_name, header_value = line.match(/([\w\-\s]+)\:\s?(.*)/)[1..2]
|
322
305
|
header_hash[header_name] = header_value
|
323
306
|
end
|
324
|
-
|
325
|
-
|
307
|
+
|
308
|
+
@response_headers = header_hash
|
326
309
|
end
|
327
310
|
|
328
311
|
def generate_file_name
|
312
|
+
result = nil
|
313
|
+
|
314
|
+
result = file_name_from_content_disposition
|
315
|
+
result = file_name_from_content_type if result.nil?
|
316
|
+
|
317
|
+
return result
|
318
|
+
end
|
319
|
+
|
320
|
+
def file_name_from_content_disposition
|
321
|
+
file_name = nil
|
329
322
|
|
330
323
|
cd_key = response_headers.keys.select{|k| k =~ /content-disposition/i }.first
|
331
|
-
|
324
|
+
|
332
325
|
if cd_key then
|
333
326
|
disposition = @response_headers[cd_key]
|
334
327
|
if disposition then
|
335
|
-
|
336
|
-
|
328
|
+
# example : Content-Disposition: attachment; filename="iPad_User_Guide.pdf"
|
329
|
+
file_name = disposition.match("filename=\"?(.+)\"?")[1]
|
337
330
|
end
|
338
331
|
end
|
339
332
|
|
333
|
+
$logger.debug("downspout | downloader | file_name_from_content_disposition | #{file_name}")
|
334
|
+
return file_name
|
335
|
+
end
|
336
|
+
|
337
|
+
def file_name_from_content_type
|
340
338
|
ct_key = response_headers.keys.select{|k| k =~ /content-type/i }.first
|
341
339
|
return nil unless ct_key
|
342
340
|
|
343
341
|
file_type = @response_headers[ct_key]
|
344
342
|
return nil unless file_type
|
345
343
|
|
346
|
-
#
|
347
|
-
|
348
|
-
return "#{@basename || 'default'}.pdf" if file_type =~ /pdf/
|
344
|
+
file_name = "#{@basename || 'default'}.html" if (file_type =~ /html/)
|
345
|
+
file_name = "#{@basename || 'default'}.pdf" if (file_type =~ /pdf/) && file_name.nil?
|
349
346
|
|
350
|
-
|
347
|
+
$logger.debug("downspout | downloader | file_name_from_content_type | #{file_name}")
|
348
|
+
return file_name
|
351
349
|
end
|
352
350
|
|
353
351
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Date: Wed, 30 Mar 2011 19:40:11 GMT
|
3
|
+
Server: Apache/2.2.11 (Unix) DAV/2 PHP/5.3.1
|
4
|
+
Content-Length: 1181801
|
5
|
+
Content-Disposition: attachement; filename=0123456789_X.pdf
|
6
|
+
X-HP-CAM-COLOR: V=1;ServerAddr=wbO8IqKJzqoYjXdW+68u4A==;GUID=1|0-iccMJzdDzi5kYvyeH1L5A_QSAtcJxSoyASpOXx9kY.|L3ByaW1pczY0L2Rvd25sb2FkL2N1c3RvbWJvb2s.
|
7
|
+
X-Powered-By: Servlet/2.5 JSP/2.1
|
8
|
+
Vary: Accept-Encoding,User-Agent
|
9
|
+
Content-Type: application/pdf
|
10
|
+
Connection: close
|
@@ -2,7 +2,7 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class DownloaderTest < Test::Unit::TestCase
|
4
4
|
|
5
|
-
|
5
|
+
context "Downspout" do
|
6
6
|
context "Downloader" do
|
7
7
|
|
8
8
|
should "respond to URL" do
|
@@ -208,4 +208,28 @@ class DownloaderTest < Test::Unit::TestCase
|
|
208
208
|
assert g.response_headers.keys.include?('content-type') # Note case difference for Net/HTTP vs Curb
|
209
209
|
end
|
210
210
|
|
211
|
+
context "with content disposition header defining file name" do
|
212
|
+
setup do
|
213
|
+
@dlx = Downspout::Downloader.new()
|
214
|
+
@faux_headers = File.read( File.join( Test::App.root, "test", "fixtures", "faux_headers.txt" ) )
|
215
|
+
|
216
|
+
@dlx.send("parse_headers_from_string!", @faux_headers )
|
217
|
+
end
|
218
|
+
|
219
|
+
should "have expected keys parsed from headers" do
|
220
|
+
all_keys = @dlx.response_headers.keys
|
221
|
+
assert_equal 10, all_keys.size
|
222
|
+
end
|
223
|
+
|
224
|
+
should "have a key for the content dispositon header" do
|
225
|
+
all_keys = @dlx.response_headers.keys
|
226
|
+
the_key = all_keys.select{|k| k =~ /content-disposition/i }.first
|
227
|
+
assert the_key
|
228
|
+
end
|
229
|
+
|
230
|
+
should "extract the appropriate file name" do
|
231
|
+
assert_equal "0123456789_X.pdf", @dlx.send("generate_file_name")
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
211
235
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: downspout
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 29
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 5
|
10
|
+
version: 0.2.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Phi.Sanders
|
@@ -120,6 +120,7 @@ files:
|
|
120
120
|
- lib/downspout/logger.rb
|
121
121
|
- lib/downspout/tmp_file.rb
|
122
122
|
- test/downspout_test.rb
|
123
|
+
- test/fixtures/faux_headers.txt
|
123
124
|
- test/fixtures/ruby.png
|
124
125
|
- test/servlet.rb
|
125
126
|
- test/test_helper.rb
|