rest-ftp-daemon 0.423.3 → 0.424.0
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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +30 -0
- data/Gemfile.lock +9 -8
- data/README.md +1 -5
- data/bin/rest-ftp-daemon +11 -5
- data/defaults.yml +16 -10
- data/lib/rest-ftp-daemon.rb +14 -10
- data/lib/rest-ftp-daemon/api/jobs.rb +42 -18
- data/lib/rest-ftp-daemon/api/root.rb +5 -1
- data/lib/rest-ftp-daemon/constants.rb +0 -1
- data/lib/rest-ftp-daemon/{api/entities → entities}/job.rb +0 -0
- data/lib/rest-ftp-daemon/{api/entities → entities}/location.rb +0 -0
- data/lib/rest-ftp-daemon/{api/entities → entities}/options.rb +0 -0
- data/lib/rest-ftp-daemon/exceptions.rb +1 -0
- data/lib/rest-ftp-daemon/helpers/views.rb +7 -2
- data/lib/rest-ftp-daemon/initialize.rb +3 -0
- data/lib/rest-ftp-daemon/job.rb +3 -0
- data/lib/rest-ftp-daemon/jobs/transfer.rb +4 -4
- data/lib/rest-ftp-daemon/location.rb +5 -0
- data/lib/rest-ftp-daemon/remote/base.rb +76 -0
- data/lib/rest-ftp-daemon/remote/ftp.rb +144 -0
- data/lib/rest-ftp-daemon/remote/s3.rb +78 -0
- data/lib/rest-ftp-daemon/remote/sftp.rb +147 -0
- data/lib/rest-ftp-daemon/static/images/feature_reload.png +0 -0
- data/lib/rest-ftp-daemon/static/images/feature_rollbar.png +0 -0
- data/lib/rest-ftp-daemon/static/swagger/css/print.css +2 -2
- data/lib/rest-ftp-daemon/static/swagger/css/screen.css +2 -2
- data/lib/rest-ftp-daemon/views/dashboard_footer.haml +3 -2
- data/lib/rest-ftp-daemon/views/dashboard_jobs.haml +3 -3
- data/lib/rest-ftp-daemon/views/dashboard_table.haml +5 -4
- data/lib/rest-ftp-daemon/workers/reporter.rb +2 -2
- data/rest-ftp-daemon.gemspec +4 -7
- metadata +28 -25
- data/lib/rest-ftp-daemon/remote.rb +0 -74
- data/lib/rest-ftp-daemon/remote_ftp.rb +0 -142
- data/lib/rest-ftp-daemon/remote_s3.rb +0 -76
- data/lib/rest-ftp-daemon/remote_sftp.rb +0 -145
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d4d6f823c82eb53007aceccb525111fce662019
|
4
|
+
data.tar.gz: b779d0afa8de9f3f4cf3e935574223f24883e331
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67fafa5d1998d4d1a7f9b28fdbfb20b6637e2f506eea4799a277caf3d326133d1e56a554991de05329fc44875268e5a6fb43283ec92c595bb50b98de205b166c
|
7
|
+
data.tar.gz: d0dbc285d27a26120887795803c35f250f415ecc1b9d8fd8a1937be313c1767f4b18d31e987a82c944c7374ea21f67cc218f01b7198c74edf344fc4cd3e60b03
|
data/.codeclimate.yml
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
engines:
|
2
|
+
rubocop:
|
3
|
+
enabled: true
|
4
|
+
#checks:
|
5
|
+
# Rubocop/Metrics/ClassLength:
|
6
|
+
# enabled: false
|
7
|
+
brakeman:
|
8
|
+
enabled: true
|
9
|
+
#exclude_fingerprints:
|
10
|
+
#- 08c185b3f764f262539a1f76997d3a89
|
11
|
+
eslint:
|
12
|
+
enabled: true
|
13
|
+
csslint:
|
14
|
+
enabled: true
|
15
|
+
duplication:
|
16
|
+
enabled: true
|
17
|
+
config:
|
18
|
+
languages:
|
19
|
+
- ruby
|
20
|
+
#mass_threshold: 30
|
21
|
+
- javascript
|
22
|
+
ratings:
|
23
|
+
paths:
|
24
|
+
- app/**
|
25
|
+
- lib/**
|
26
|
+
- "**.rb"
|
27
|
+
- "**.go"
|
28
|
+
exclude_paths:
|
29
|
+
- spec/**/*
|
30
|
+
- "**/swagger/**/*"
|
data/Gemfile.lock
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rest-ftp-daemon (0.
|
4
|
+
rest-ftp-daemon (0.424.0)
|
5
5
|
activesupport (~> 4.2)
|
6
6
|
api-auth
|
7
7
|
aws-sdk-resources (~> 2)
|
8
|
-
bmc-daemon-lib (~> 0.3.
|
8
|
+
bmc-daemon-lib (~> 0.3.8)
|
9
9
|
double-bag-ftps
|
10
10
|
facter
|
11
11
|
get_process_mem
|
@@ -19,7 +19,7 @@ PATH
|
|
19
19
|
net-sftp
|
20
20
|
newrelic_rpm
|
21
21
|
rest-client (~> 1.8)
|
22
|
-
|
22
|
+
rollbar
|
23
23
|
streamio-ffmpeg
|
24
24
|
sys-cpu
|
25
25
|
thin (~> 1.7)
|
@@ -39,15 +39,15 @@ GEM
|
|
39
39
|
ast (2.3.0)
|
40
40
|
astrolabe (1.3.1)
|
41
41
|
parser (~> 2.2)
|
42
|
-
aws-sdk-core (2.5.
|
42
|
+
aws-sdk-core (2.5.10)
|
43
43
|
jmespath (~> 1.0)
|
44
|
-
aws-sdk-resources (2.5.
|
45
|
-
aws-sdk-core (= 2.5.
|
44
|
+
aws-sdk-resources (2.5.10)
|
45
|
+
aws-sdk-core (= 2.5.10)
|
46
46
|
axiom-types (0.1.1)
|
47
47
|
descendants_tracker (~> 0.0.4)
|
48
48
|
ice_nine (~> 0.11.0)
|
49
49
|
thread_safe (~> 0.3, >= 0.3.1)
|
50
|
-
bmc-daemon-lib (0.3.
|
50
|
+
bmc-daemon-lib (0.3.8)
|
51
51
|
chamber (~> 2.9)
|
52
52
|
builder (3.2.2)
|
53
53
|
chamber (2.9.1)
|
@@ -140,6 +140,8 @@ GEM
|
|
140
140
|
http-cookie (>= 1.0.2, < 2.0)
|
141
141
|
mime-types (>= 1.16, < 3.0)
|
142
142
|
netrc (~> 0.7)
|
143
|
+
rollbar (2.12.0)
|
144
|
+
multi_json
|
143
145
|
rspec (3.5.0)
|
144
146
|
rspec-core (~> 3.5.0)
|
145
147
|
rspec-expectations (~> 3.5.0)
|
@@ -160,7 +162,6 @@ GEM
|
|
160
162
|
rainbow (>= 1.99.1, < 3.0)
|
161
163
|
ruby-progressbar (~> 1.4)
|
162
164
|
ruby-progressbar (1.8.1)
|
163
|
-
settingslogic (2.0.9)
|
164
165
|
slop (3.6.0)
|
165
166
|
streamio-ffmpeg (2.1.0)
|
166
167
|
multi_json (~> 1.8)
|
data/README.md
CHANGED
@@ -53,7 +53,7 @@ a while without any glitches at France Télévisions.
|
|
53
53
|
|
54
54
|
#### API Documentation
|
55
55
|
|
56
|
-
API documentation
|
56
|
+
API documentation is self-hosted on ```/swagger.html```
|
57
57
|
|
58
58
|
#### Expected features in a short-time range
|
59
59
|
|
@@ -279,10 +279,6 @@ logs:
|
|
279
279
|
TODO for this document
|
280
280
|
------------------------------------------------------------------------------------
|
281
281
|
|
282
|
-
* Update Apiary documentation
|
283
|
-
* Update Apiary documentation
|
284
|
-
* Update Apiary documentation
|
285
|
-
* Update Apiary documentation !
|
286
282
|
* Document /status
|
287
283
|
* Document /routes
|
288
284
|
* Document mkdir and overwrite options
|
data/bin/rest-ftp-daemon
CHANGED
@@ -24,6 +24,7 @@ begin
|
|
24
24
|
cmd_user = nil
|
25
25
|
cmd_group = nil
|
26
26
|
cmd_daemonize = nil
|
27
|
+
cmd_dump = nil
|
27
28
|
|
28
29
|
# Init Chamber-based configuration from Gemspec
|
29
30
|
Conf.init File.dirname(__FILE__) + "/../"
|
@@ -31,9 +32,10 @@ begin
|
|
31
32
|
# Parse options and check compliance
|
32
33
|
parser = OptionParser.new do |opts|
|
33
34
|
opts.banner = "Usage: #{File.basename $PROGRAM_NAME} [options] start|stop"
|
34
|
-
opts.on("-c", "--config CONFIGFILE")
|
35
|
-
opts.on("
|
36
|
-
opts.on("",
|
35
|
+
opts.on("-c", "--config CONFIGFILE") { |value| cmd_config = File.expand_path(value.to_s)}
|
36
|
+
opts.on("", "--dump", "Dump config as seen by the process") { |value| cmd_dump = true }
|
37
|
+
opts.on("-e", "--environment ENV") { |value| Conf.app_env = value }
|
38
|
+
opts.on("", "--dev") { Conf.app_env = "development" }
|
37
39
|
opts.on("-p", "--port PORT", "use PORT") { |value| cmd_port = value.to_i }
|
38
40
|
opts.on("-d", "--daemonize", "Run daemonized in the background") { cmd_daemonize = true }
|
39
41
|
opts.on("-f", "--foreground", "Run in the foreground") { cmd_daemonize = false }
|
@@ -120,10 +122,14 @@ puts
|
|
120
122
|
puts "Daemonize \t #{Conf[:daemonize]}"
|
121
123
|
puts "Network port \t #{Conf[:port]}"
|
122
124
|
puts "User:group \t #{Conf[:user]}:#{Conf[:group]}" if Conf[:user] && Conf[:group]
|
123
|
-
puts "Newrelic \t #{Conf.newrelic_enabled? ? Conf.at(:newrelic, :license) : 'no'}"
|
124
125
|
puts "PID file \t #{Conf[:pidfile]}"
|
125
126
|
puts
|
126
|
-
puts Conf.
|
127
|
+
puts "Newrelic \t #{Conf.feature?(:newrelic) || '-'}"
|
128
|
+
puts "Rollbar \t #{Conf.feature?(:rollbar) || '-'}"
|
129
|
+
if cmd_dump
|
130
|
+
puts
|
131
|
+
puts Conf.dump
|
132
|
+
end
|
127
133
|
puts
|
128
134
|
puts "--- Thin ARGV"
|
129
135
|
puts argv.flatten.join(" ")
|
data/defaults.yml
CHANGED
@@ -56,18 +56,24 @@ newrelic:
|
|
56
56
|
prefix: "rftpd" # app prefix to build app_name
|
57
57
|
# platform: "bigbusiness" # app platform to build app_name
|
58
58
|
|
59
|
+
rollbar:
|
60
|
+
debug: false
|
61
|
+
# token: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
62
|
+
|
59
63
|
logs:
|
60
64
|
path: "/tmp/"
|
65
|
+
level: debug
|
61
66
|
|
62
|
-
|
67
|
+
thin: "rftpd-thin.log"
|
68
|
+
default: "rftpd-core.log"
|
63
69
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
70
|
+
queue: "rftpd-core.log"
|
71
|
+
api: "rftpd-core.log"
|
72
|
+
workers: "rftpd-core.log"
|
73
|
+
transfer: "rftpd-workers.log"
|
74
|
+
conchita: "rftpd-workers.log"
|
75
|
+
reporter: "rftpd-workers.log"
|
76
|
+
notify: "rftpd-workers.log"
|
69
77
|
|
70
|
-
|
71
|
-
|
72
|
-
reporter: "rftpd-environment-workers.log"
|
73
|
-
notify: "rftpd-environment-workers.log"
|
78
|
+
newrelic: "rftpd-newrelic.log"
|
79
|
+
rollbar: "rftpd-rollbar.log"
|
data/lib/rest-ftp-daemon.rb
CHANGED
@@ -8,6 +8,7 @@ require "timeout"
|
|
8
8
|
require "syslog"
|
9
9
|
require "thread"
|
10
10
|
require "newrelic_rpm"
|
11
|
+
require "rollbar"
|
11
12
|
|
12
13
|
# Shared libs / monkey-patching
|
13
14
|
require_relative "shared/patch_array"
|
@@ -28,10 +29,10 @@ require_relative "rest-ftp-daemon/notification"
|
|
28
29
|
require_relative "rest-ftp-daemon/location"
|
29
30
|
|
30
31
|
# Remotes
|
31
|
-
require_relative "rest-ftp-daemon/remote"
|
32
|
-
require_relative "rest-ftp-daemon/
|
33
|
-
require_relative "rest-ftp-daemon/
|
34
|
-
require_relative "rest-ftp-daemon/
|
32
|
+
require_relative "rest-ftp-daemon/remote/base"
|
33
|
+
require_relative "rest-ftp-daemon/remote/ftp"
|
34
|
+
require_relative "rest-ftp-daemon/remote/sftp"
|
35
|
+
require_relative "rest-ftp-daemon/remote/s3"
|
35
36
|
|
36
37
|
# Jobs
|
37
38
|
require_relative "rest-ftp-daemon/job"
|
@@ -40,19 +41,18 @@ require_relative "rest-ftp-daemon/jobs/dummy"
|
|
40
41
|
require_relative "rest-ftp-daemon/jobs/transfer"
|
41
42
|
require_relative "rest-ftp-daemon/jobs/video"
|
42
43
|
|
43
|
-
require_relative "rest-ftp-daemon/worker_pool"
|
44
|
-
|
45
44
|
# Workers
|
46
45
|
# require_from :workers
|
46
|
+
require_relative "rest-ftp-daemon/worker_pool"
|
47
47
|
require_relative "rest-ftp-daemon/workers/worker"
|
48
48
|
require_relative "rest-ftp-daemon/workers/conchita"
|
49
49
|
require_relative "rest-ftp-daemon/workers/reporter"
|
50
50
|
require_relative "rest-ftp-daemon/workers/transfer"
|
51
51
|
|
52
|
-
# API
|
53
|
-
require_relative "rest-ftp-daemon/
|
54
|
-
require_relative "rest-ftp-daemon/
|
55
|
-
require_relative "rest-ftp-daemon/
|
52
|
+
# Entities and API
|
53
|
+
require_relative "rest-ftp-daemon/entities/location"
|
54
|
+
require_relative "rest-ftp-daemon/entities/options"
|
55
|
+
require_relative "rest-ftp-daemon/entities/job"
|
56
56
|
require_relative "rest-ftp-daemon/api/jobs"
|
57
57
|
require_relative "rest-ftp-daemon/api/dashboard"
|
58
58
|
require_relative "rest-ftp-daemon/api/status"
|
@@ -60,6 +60,10 @@ require_relative "rest-ftp-daemon/api/config"
|
|
60
60
|
require_relative "rest-ftp-daemon/api/debug"
|
61
61
|
require_relative "rest-ftp-daemon/api/root"
|
62
62
|
|
63
|
+
# Init
|
64
|
+
require_relative "rest-ftp-daemon/initialize"
|
65
|
+
|
66
|
+
|
63
67
|
# def require_from subdir
|
64
68
|
# path = sprintf(
|
65
69
|
# '%s/rest-ftp-daemon/%s/*.rb',
|
@@ -59,12 +59,30 @@ module RestFtpDaemon
|
|
59
59
|
end
|
60
60
|
|
61
61
|
desc "Create a new job"
|
62
|
-
|
63
|
-
|
64
|
-
|
62
|
+
# desc 'Creates a new app' do
|
63
|
+
# detail 'It is used to register a new app on the server and get the app_id'
|
64
|
+
# params Entities::AppsParamsEntity.documentation
|
65
|
+
# success Entities::AppsEntity
|
66
|
+
# failure [[400, 'Bad Request', Entities::ErrorEntity]]
|
67
|
+
# named 'create app'
|
68
|
+
# end
|
65
69
|
|
66
|
-
|
67
|
-
|
70
|
+
params do
|
71
|
+
requires :source,
|
72
|
+
type: String,
|
73
|
+
desc: "Source file pattern",
|
74
|
+
allow_blank: false
|
75
|
+
requires :target,
|
76
|
+
type: String,
|
77
|
+
desc: "Target remote path",
|
78
|
+
allow_blank: false
|
79
|
+
optional :label,
|
80
|
+
type: String,
|
81
|
+
desc: "Descriptive label (info only)"
|
82
|
+
optional :notify,
|
83
|
+
type: String,
|
84
|
+
desc: "URL to get POST'ed notifications back",
|
85
|
+
allow_blank: false
|
68
86
|
optional :type,
|
69
87
|
type: String,
|
70
88
|
desc: "Type of job",
|
@@ -81,19 +99,19 @@ module RestFtpDaemon
|
|
81
99
|
default: 0
|
82
100
|
|
83
101
|
optional :video_options, type: Hash, desc: "Options passed to FFMPEG encoder", default: {} do
|
84
|
-
optional :video_codec, type: String
|
85
|
-
optional :video_bitrate, type: String
|
86
|
-
optional :video_bitrate_tolerance, type: String
|
87
|
-
optional :frame_rate, type: Integer
|
88
|
-
optional :resolution, type: String
|
89
|
-
optional :aspect, type: String
|
90
|
-
optional :keyframe_interval, type: String
|
91
|
-
optional :x264_vprofile, type: String
|
92
|
-
optional :x264_preset, type: String
|
93
|
-
optional :audio_codec, type: String
|
94
|
-
optional :audio_bitrate, type: String
|
95
|
-
optional :audio_sample_rate, type: Integer
|
96
|
-
optional :audio_channels, type: String
|
102
|
+
optional :video_codec, type: String, desc: "video codec (ex: copy, libx264)"
|
103
|
+
optional :video_bitrate, type: String, desc: "nominal video bitrate"
|
104
|
+
optional :video_bitrate_tolerance, type: String, desc: "maximum video bitrate"
|
105
|
+
optional :frame_rate, type: Integer, desc: "output frames per second"
|
106
|
+
optional :resolution, type: String, desc: "output video resolution"
|
107
|
+
optional :aspect, type: String, desc: "output aspect ratio"
|
108
|
+
optional :keyframe_interval, type: String, desc: "group of pictures (GOP) size"
|
109
|
+
optional :x264_vprofile, type: String, desc: "h264 profile"
|
110
|
+
optional :x264_preset, type: String, desc: "h264 preset (fast, low..)"
|
111
|
+
optional :audio_codec, type: String, desc: "audio codec (ex: copy, libfaac, ibfdk_aac)"
|
112
|
+
optional :audio_bitrate, type: String, desc: "nominal audio bitrate"
|
113
|
+
optional :audio_sample_rate, type: Integer, desc: "audio sampling rate"
|
114
|
+
optional :audio_channels, type: String, desc: "number of audio channels"
|
97
115
|
end
|
98
116
|
|
99
117
|
optional :video_custom,
|
@@ -113,6 +131,12 @@ module RestFtpDaemon
|
|
113
131
|
type: Boolean,
|
114
132
|
desc: "Upload to a temp file before renaming it to the target filename",
|
115
133
|
default: Conf.at(:transfer, :tempfile)
|
134
|
+
# given :shelf_id do
|
135
|
+
# requires :bin_id, type: Integer
|
136
|
+
# end
|
137
|
+
# given category: ->(val) { val == 'foo' } do
|
138
|
+
# requires :description
|
139
|
+
# end
|
116
140
|
end
|
117
141
|
|
118
142
|
post "/" do
|
@@ -50,6 +50,11 @@ module RestFtpDaemon
|
|
50
50
|
put "-----"
|
51
51
|
end
|
52
52
|
|
53
|
+
## GLOBAL EXCEPTION HANDLING
|
54
|
+
rescue_from :all do |exception|
|
55
|
+
Rollbar.error exception
|
56
|
+
error_response(message: "Internal server error: #{exception}", status: 500)
|
57
|
+
end
|
53
58
|
|
54
59
|
### MOUNTPOINTS
|
55
60
|
mount RestFtpDaemon::API::Status => MOUNT_STATUS
|
@@ -71,7 +76,6 @@ module RestFtpDaemon
|
|
71
76
|
}
|
72
77
|
|
73
78
|
|
74
|
-
|
75
79
|
### INITIALIZATION
|
76
80
|
def initialize
|
77
81
|
super
|
File without changes
|
File without changes
|
File without changes
|
@@ -15,6 +15,7 @@ module RestFtpDaemon
|
|
15
15
|
class AttributeMissing < RestFtpDaemonException; end
|
16
16
|
class AssertionFailed < RestFtpDaemonException; end
|
17
17
|
class UnresolvedTokens < RestFtpDaemonException; end
|
18
|
+
class LocationMalformed < RestFtpDaemonException; end
|
18
19
|
class LocationParseError < RestFtpDaemonException; end
|
19
20
|
class UnsupportedScheme < RestFtpDaemonException; end
|
20
21
|
class MissingFfmpegLibraries < RestFtpDaemonException; end
|
@@ -68,10 +68,15 @@ module RestFtpDaemon
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def job_type job
|
71
|
+
# sprintf(
|
72
|
+
# '<span class="glyphicon glyphicon-%s" alt="%s"></span> %s',
|
73
|
+
# job_style(job),
|
74
|
+
# job.type,
|
75
|
+
# job.type
|
76
|
+
# )
|
71
77
|
sprintf(
|
72
|
-
'<span class="glyphicon glyphicon-%s" alt="%s"></span
|
78
|
+
'<span class="glyphicon glyphicon-%s" alt="%s"></span>',
|
73
79
|
job_style(job),
|
74
|
-
job.type,
|
75
80
|
job.type
|
76
81
|
)
|
77
82
|
end
|
data/lib/rest-ftp-daemon/job.rb
CHANGED
@@ -22,16 +22,16 @@ module RestFtpDaemon
|
|
22
22
|
case target_uri
|
23
23
|
when URI::FTP
|
24
24
|
log_info "JobTransfer.before target_method FTP"
|
25
|
-
@remote = RemoteFTP.new @target_loc, log_prefix, @config[:debug_ftp]
|
25
|
+
@remote = Remote::RemoteFTP.new @target_loc, log_prefix, @config[:debug_ftp]
|
26
26
|
when URI::FTPES, URI::FTPS
|
27
27
|
log_info "JobTransfer.before target_method FTPES/FTPS"
|
28
|
-
@remote = RemoteFTP.new @target_loc, log_prefix, @config[:debug_ftps], :ftpes
|
28
|
+
@remote = Remote::RemoteFTP.new @target_loc, log_prefix, @config[:debug_ftps], :ftpes
|
29
29
|
when URI::SFTP
|
30
30
|
log_info "JobTransfer.before target_method SFTP"
|
31
|
-
@remote = RemoteSFTP.new @target_loc, log_prefix, @config[:debug_sftp]
|
31
|
+
@remote = Remote::RemoteSFTP.new @target_loc, log_prefix, @config[:debug_sftp]
|
32
32
|
when URI::S3
|
33
33
|
log_info "JobTransfer.before target_method S3"
|
34
|
-
@remote = RemoteS3.new @target_loc, log_prefix, @config[:debug_s3]
|
34
|
+
@remote = Remote::RemoteS3.new @target_loc, log_prefix, @config[:debug_s3]
|
35
35
|
else
|
36
36
|
log_info "JobTransfer.before unknown scheme [#{@target_loc.scheme}]"
|
37
37
|
raise RestFtpDaemon::TargetNotSupported, @target_loc.scheme
|
@@ -27,6 +27,10 @@ module RestFtpDaemon
|
|
27
27
|
to: :uri
|
28
28
|
|
29
29
|
def initialize original
|
30
|
+
unless original.is_a? String
|
31
|
+
raise RestFtpDaemon::LocationMalformed, original.inspect
|
32
|
+
end
|
33
|
+
|
30
34
|
# Strip spaces before/after, copying original "path" at the same time
|
31
35
|
@original = original
|
32
36
|
location_uri = original.strip
|
@@ -102,6 +106,7 @@ module RestFtpDaemon
|
|
102
106
|
|
103
107
|
# Replace endpoints defined in config
|
104
108
|
vectors.each do |from, to|
|
109
|
+
next unless to.is_a? String
|
105
110
|
next if to.to_s.empty?
|
106
111
|
path.gsub! tokenize(from), to
|
107
112
|
end
|