rest-ftp-daemon 0.423.3 → 0.424.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|