oaf 0.2.2 → 0.2.3
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 +8 -8
- data/.travis.yml +4 -2
- data/lib/oaf/http.rb +43 -13
- data/lib/oaf/util.rb +56 -36
- data/lib/oaf/version.rb +1 -1
- data/spec/oaf/util_spec.rb +6 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YWQyNWVmNjg3MTg0NjYwMzgyYzI1OTVhZGQ3ZDFiMWM3NzhhNzBjZQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NDdiZWMxMmYzMDI3NmZhYmNkY2VhYzVhZmEzZGQ5N2ZmNjVkNzRmNA==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NjY1ODU1NmM0N2NjYWZhMDZmMTg3MmIxNmY5MTFiNTUxZjgzOWU4ZDk3OWQ2
|
10
|
+
YzliNDgxMDM2ZGRlNWY5YjI2ZWM5ZmQ3NmI3OWNhZDAyNmJmOTZiYWYwMTE0
|
11
|
+
NzIwNmQ2ZDgxNjVkOTdjNWI5NDNiOTI0OWUxMDEzNjkwMWI2MWE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
OThmYWJkMTUwNDliZDYzMGFjMWM1NmI3ODUxMzIxNTIxMmQ1MTYxNWJjY2Rj
|
14
|
+
MjI0OTBlNDE2ZWQ4M2I3ZmVmMzE5MzU4MWZlNWUyNjllMjM3YzM4MTM4ZDA0
|
15
|
+
NmRhZjM0ZGFkMTIwZDZmMTI5MjA2YzliZDk1MDJhOTA3M2NiOWQ=
|
data/.travis.yml
CHANGED
data/lib/oaf/http.rb
CHANGED
@@ -48,6 +48,47 @@ module Oaf
|
|
48
48
|
[headers, status, body]
|
49
49
|
end
|
50
50
|
|
51
|
+
# Safely retrieves the request body, and assumes an empty string if it
|
52
|
+
# cannot be retrieved. This helps get around a nasty exception in WEBrick.
|
53
|
+
#
|
54
|
+
# == Parameters:
|
55
|
+
# req::
|
56
|
+
# A WEBrick::HTTPRequest object
|
57
|
+
#
|
58
|
+
# == Returns:
|
59
|
+
# A string containing the request body
|
60
|
+
#
|
61
|
+
def get_request_body req
|
62
|
+
if ['POST', 'PUT'].member? req.request_method
|
63
|
+
begin
|
64
|
+
result = req.body
|
65
|
+
rescue WEBrick::HTTPStatus::LengthRequired
|
66
|
+
result = '' # needs to be in rescue for coverage
|
67
|
+
end
|
68
|
+
end
|
69
|
+
result
|
70
|
+
end
|
71
|
+
|
72
|
+
# Consume HTTP response details and set them into a response object.
|
73
|
+
#
|
74
|
+
# == Parameters:
|
75
|
+
# res::
|
76
|
+
# A WEBrick::HTTPResponse object
|
77
|
+
# headers::
|
78
|
+
# A hash containing HTTP response headers
|
79
|
+
# body::
|
80
|
+
# A string containing the HTTP response body
|
81
|
+
# status::
|
82
|
+
# An integer indicating the response status
|
83
|
+
#
|
84
|
+
def set_response! res, headers, body, status
|
85
|
+
headers.each do |name, value|
|
86
|
+
res.header[name] = value
|
87
|
+
end
|
88
|
+
res.body = body
|
89
|
+
res.status = status
|
90
|
+
end
|
91
|
+
|
51
92
|
# Invokes the Webrick web server library to handle incoming requests, and
|
52
93
|
# routes them to the appropriate scripts if they exist on the filesystem.
|
53
94
|
#
|
@@ -60,24 +101,13 @@ module Oaf
|
|
60
101
|
def serve path, port
|
61
102
|
server = WEBrick::HTTPServer.new :Port => port
|
62
103
|
server.mount_proc '/' do |req, res|
|
63
|
-
req_body = ''
|
64
104
|
req_headers = req.header
|
65
105
|
req_query = req.query
|
66
|
-
|
67
|
-
begin
|
68
|
-
req_body = req.body
|
69
|
-
rescue WEBrick::HTTPStatus::LengthRequired
|
70
|
-
true # without this, coverage is not collected.
|
71
|
-
end
|
72
|
-
end
|
106
|
+
req_body = Oaf::HTTP::get_request_body req
|
73
107
|
file = Oaf::Util.get_request_file path, req.path, req.request_method
|
74
108
|
out = Oaf::Util.get_output file, req_headers, req_body, req_query
|
75
109
|
res_headers, res_status, res_body = Oaf::HTTP.parse_response out
|
76
|
-
|
77
|
-
res.header[name] = value
|
78
|
-
end
|
79
|
-
res.status = res_status
|
80
|
-
res.body = res_body
|
110
|
+
Oaf::HTTP.set_response! res, res_headers, res_body, res_status
|
81
111
|
end
|
82
112
|
trap 'INT' do server.shutdown end
|
83
113
|
server.start
|
data/lib/oaf/util.rb
CHANGED
@@ -20,8 +20,6 @@
|
|
20
20
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
21
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
22
|
|
23
|
-
require 'open3'
|
24
|
-
|
25
23
|
module Oaf
|
26
24
|
|
27
25
|
module Util
|
@@ -55,7 +53,7 @@ module Oaf
|
|
55
53
|
def get_http_header line
|
56
54
|
return nil if not is_http_header? line
|
57
55
|
parts = line.split(':')
|
58
|
-
|
56
|
+
{parts[0].strip => parts[1].strip}
|
59
57
|
end
|
60
58
|
|
61
59
|
# Retrieves the numeric value from a line of text as an HTTP status code.
|
@@ -101,31 +99,47 @@ module Oaf
|
|
101
99
|
#
|
102
100
|
def prepare_environment headers, query, body
|
103
101
|
result = Hash.new
|
104
|
-
headers.each do |
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
query.each do |name, value|
|
109
|
-
name = Oaf::Util.prepare_key name
|
110
|
-
result["oaf_query_#{name}"] = Oaf::Util.flatten value
|
102
|
+
{'header' => headers, 'query' => query}.each do |prefix, data|
|
103
|
+
data.each do |name, value|
|
104
|
+
result.merge! Oaf::Util.environment_item prefix, name, value
|
105
|
+
end
|
111
106
|
end
|
112
|
-
result
|
113
|
-
result
|
107
|
+
result.merge Oaf::Util.environment_item 'request', 'body', body
|
114
108
|
end
|
115
109
|
|
116
|
-
#
|
117
|
-
#
|
118
|
-
#
|
110
|
+
# Prepares a key for placement in the execution environment. This includes
|
111
|
+
# namespacing variables and converting characters to predictable and
|
112
|
+
# easy-to-use names.
|
119
113
|
#
|
120
114
|
# == Parameters:
|
115
|
+
# prefix::
|
116
|
+
# A prefix for the key. This helps with separation.
|
121
117
|
# key::
|
122
118
|
# The key to sanitize
|
123
119
|
#
|
124
120
|
# == Returns:
|
125
121
|
# A string with the prepared value
|
126
122
|
#
|
127
|
-
def prepare_key key
|
128
|
-
key.gsub('-', '_').downcase
|
123
|
+
def prepare_key prefix, key
|
124
|
+
"oaf_#{prefix}_#{key.gsub('-', '_').downcase}"
|
125
|
+
end
|
126
|
+
|
127
|
+
# Formats a single environment item into a hash, which can be merged into a
|
128
|
+
# collective environment mapping later on.
|
129
|
+
#
|
130
|
+
# == Parameters:
|
131
|
+
# prefix::
|
132
|
+
# The prefix for the type of item being added.
|
133
|
+
# key::
|
134
|
+
# The key name of the environment property
|
135
|
+
# value::
|
136
|
+
# The value for the environment property
|
137
|
+
#
|
138
|
+
# == Returns:
|
139
|
+
# A hash with prepared values ready to merge into an environment hash
|
140
|
+
#
|
141
|
+
def environment_item prefix, key, value
|
142
|
+
{Oaf::Util.prepare_key(prefix, key) => Oaf::Util.flatten(value)}
|
129
143
|
end
|
130
144
|
|
131
145
|
# Flatten a hash or array into a string. This is useful for preparing some
|
@@ -176,21 +190,16 @@ module Oaf
|
|
176
190
|
headers = {}
|
177
191
|
status = 200
|
178
192
|
size = 0
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
elsif Oaf::Util.is_http_status? part
|
188
|
-
status = Oaf::Util.get_http_status part
|
189
|
-
else
|
190
|
-
next
|
191
|
-
end
|
192
|
-
size += size == 0 ? 2 : 1 # compensate for delimiter
|
193
|
+
parts = text.split /^---$/
|
194
|
+
if parts.length > 1
|
195
|
+
for part in parts.last.split "\n"
|
196
|
+
if Oaf::Util.is_http_header? part
|
197
|
+
headers.merge! Oaf::Util.get_http_header part
|
198
|
+
elsif Oaf::Util.is_http_status? part
|
199
|
+
status = Oaf::Util.get_http_status part
|
200
|
+
else next
|
193
201
|
end
|
202
|
+
size += size == 0 ? 2 : 1 # compensate for delimiter
|
194
203
|
end
|
195
204
|
end
|
196
205
|
[headers, status, size]
|
@@ -232,11 +241,14 @@ module Oaf
|
|
232
241
|
File.exist?(file) ? file : nil
|
233
242
|
end
|
234
243
|
|
235
|
-
#
|
236
|
-
#
|
237
|
-
#
|
244
|
+
# Fork a new process, in which we can safely modify the running environment
|
245
|
+
# and run a command, sending data back to the parent process using an IO
|
246
|
+
# pipe. This can be done in a single line in ruby >= 1.9, but we will do it
|
247
|
+
# the hard way to maintain compatibility with older rubies.
|
238
248
|
#
|
239
249
|
# == Parameters:
|
250
|
+
# env::
|
251
|
+
# The environment data to use in the subprocess.
|
240
252
|
# command::
|
241
253
|
# The command to execute against the server
|
242
254
|
#
|
@@ -244,8 +256,16 @@ module Oaf
|
|
244
256
|
# A string of stderr concatenated to stdout.
|
245
257
|
#
|
246
258
|
def run_buffered env, command
|
247
|
-
|
248
|
-
|
259
|
+
out, wout = IO.pipe
|
260
|
+
pid = fork do
|
261
|
+
out.close
|
262
|
+
ENV.replace env
|
263
|
+
wout.write %x(#{command} 2>&1)
|
264
|
+
at_exit { exit! }
|
265
|
+
end
|
266
|
+
wout.close
|
267
|
+
Process.wait pid
|
268
|
+
out.read
|
249
269
|
end
|
250
270
|
|
251
271
|
# Executes a file, or reads its contents if it is not executable, passing
|
data/lib/oaf/version.rb
CHANGED
data/spec/oaf/util_spec.rb
CHANGED
@@ -36,7 +36,7 @@ module Oaf
|
|
36
36
|
|
37
37
|
it "should parse a name and value from a header line" do
|
38
38
|
result = Oaf::Util.get_http_header 'x-powered-by: oaf'
|
39
|
-
result.should eq(
|
39
|
+
result.should eq('x-powered-by' => 'oaf')
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should detect an invalid header line during header parsing" do
|
@@ -82,17 +82,17 @@ module Oaf
|
|
82
82
|
|
83
83
|
describe "Argument Sanitizers" do
|
84
84
|
it "should replace dashes with underscores in key names" do
|
85
|
-
result = Oaf::Util.prepare_key 'x-powered-by'
|
86
|
-
result.should eq('
|
85
|
+
result = Oaf::Util.prepare_key 'header', 'x-powered-by'
|
86
|
+
result.should eq('oaf_header_x_powered_by')
|
87
87
|
end
|
88
88
|
|
89
89
|
it "should convert all letters to lowercase in key names" do
|
90
|
-
result = Oaf::Util.prepare_key 'X-Powered-By'
|
91
|
-
result.should eq('
|
90
|
+
result = Oaf::Util.prepare_key 'header', 'X-Powered-By'
|
91
|
+
result.should eq('oaf_header_x_powered_by')
|
92
92
|
end
|
93
93
|
|
94
94
|
it "should flatten a hash into a string" do
|
95
|
-
result = Oaf::Util.flatten(
|
95
|
+
result = Oaf::Util.flatten('item1' => 'value1')
|
96
96
|
result.should eq('item1value1')
|
97
97
|
end
|
98
98
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oaf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Uber
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-08-
|
11
|
+
date: 2013-08-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|