oaf 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.md +1 -0
- data/bin/oaf +1 -1
- data/lib/oaf.rb +2 -1
- data/lib/oaf/http/handler.rb +97 -0
- data/lib/oaf/{http.rb → http/server.rb} +5 -11
- data/lib/oaf/version.rb +1 -1
- data/spec/oaf/http_spec.rb +27 -19
- data/spec/webrick-mocks.rb +10 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MDU1ZjY5NGMxZTlkYzViNjQ5ZmFiYTUxZDdjZjdkYzU0ODkxZTVkMg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MTU4MGZlZjE5NjY1YmEwMmZiNDUzZWY3OGRkYmNiZjQ1ZTk4NmM4MA==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YjI5ZWVlNDM4YmEzNWZlMGM1Mzc5NjIzN2RiZTczOWQyZDk3YmIxYTA3ZDMz
|
10
|
+
MTMzMjlmODlmZWVhODI4YjNhMGNhMzBmZDU5OWMwODY3OWQ3NjVkMzQ2MmE3
|
11
|
+
OGVjN2RlNWI3NTQ1M2UzMjE0YjIzNmE0MDUwNmIwOGQwMTQ3NGI=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YTY4MTA0YmE3YmUxODNhNTRhMTRmMDc1ZTcwZTQ5MWU5NzkzNDU0NTViYWJm
|
14
|
+
YzkzZTBiY2NjNzc2OTA3NzVkZDk0NmZkODBhZjIzZGFjYzVlOWY4YTA1MzZh
|
15
|
+
ZGRhMDUxNWQ1NTcyZWU2MmI5YTE1ZjlhOWRhYzA3Y2U2ZTU3NmM=
|
data/README.md
CHANGED
@@ -56,6 +56,7 @@ Hello, world!
|
|
56
56
|
|
57
57
|
### HTTP Methods
|
58
58
|
Files must carry the extension of the HTTP method used to invoke them.
|
59
|
+
Oaf should support any HTTP method, including custom methods.
|
59
60
|
|
60
61
|
### Headers and Status
|
61
62
|
You can indicate HTTP headers and status using stdout from your script.
|
data/bin/oaf
CHANGED
data/lib/oaf.rb
CHANGED
@@ -0,0 +1,97 @@
|
|
1
|
+
# oaf - Care-free web app prototyping using files and scripts
|
2
|
+
# Copyright 2013 Ryan Uber <ru@ryanuber.com>
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
23
|
+
require 'oaf/util'
|
24
|
+
require 'oaf/http/server'
|
25
|
+
require 'webrick'
|
26
|
+
|
27
|
+
module Oaf::HTTP
|
28
|
+
|
29
|
+
# Provides all required handlers to WEBrick for serving all basic HTTP
|
30
|
+
# methods. WEBrick handles GET, POST, HEAD, and OPTIONS out of the box,
|
31
|
+
# but to mock most RESTful applications we are going to want PUT and
|
32
|
+
# DELETE undoubtedly.
|
33
|
+
class Handler < WEBrick::HTTPServlet::AbstractServlet
|
34
|
+
|
35
|
+
# Creates a new abstract server object and allows passing in the root
|
36
|
+
# path of the server via an argument.
|
37
|
+
#
|
38
|
+
# == Parameters:
|
39
|
+
# server::
|
40
|
+
# A WEBrick::HTTPServer object
|
41
|
+
# path::
|
42
|
+
# A string containing the root path
|
43
|
+
#
|
44
|
+
def initialize server, path
|
45
|
+
super server
|
46
|
+
@path = path
|
47
|
+
end
|
48
|
+
|
49
|
+
# Main server method. Oaf does not really differentiate between different
|
50
|
+
# HTTP methods, but needs to at least support passing them all.
|
51
|
+
#
|
52
|
+
# == Parameters:
|
53
|
+
# req::
|
54
|
+
# A WEBrick::HTTPRequest object
|
55
|
+
# res::
|
56
|
+
# A WEBrick::HTTPResponse object
|
57
|
+
#
|
58
|
+
def process_request req, res
|
59
|
+
req_headers = req.header
|
60
|
+
req_query = req.query
|
61
|
+
req_body = Oaf::HTTP::Server.get_request_body req
|
62
|
+
file = Oaf::Util.get_request_file @path, req.path, req.request_method
|
63
|
+
out = Oaf::Util.get_output file, req_headers, req_body, req_query
|
64
|
+
res_headers, res_status, res_body = Oaf::HTTP::Server.parse_response out
|
65
|
+
Oaf::HTTP::Server.set_response! res, res_headers, res_body, res_status
|
66
|
+
end
|
67
|
+
|
68
|
+
# A magic respond_to? implementation to trick WEBrick into thinking that any
|
69
|
+
# do_* methods are already defined. This allows method_missing to do its job
|
70
|
+
# once WEBrick makes its call to the method.
|
71
|
+
#
|
72
|
+
# == Parameters:
|
73
|
+
# method::
|
74
|
+
# The name of the class method being checked
|
75
|
+
#
|
76
|
+
# == Returns:
|
77
|
+
# Boolean, true if the method name matches do_[A-Z]+, else super.
|
78
|
+
#
|
79
|
+
def respond_to? method
|
80
|
+
method.to_s =~ /^do_[A-Z]+$/ ? true : super
|
81
|
+
end
|
82
|
+
|
83
|
+
# A magic method to handle any and all do_* methods. This allows Oaf to
|
84
|
+
# claim some degree of support for any HTTP method, be it a known and
|
85
|
+
# commonly used method such as PUT or DELETE, or custom methods.
|
86
|
+
#
|
87
|
+
# == Parameters:
|
88
|
+
# method::
|
89
|
+
# The name of the method being called
|
90
|
+
# *opt::
|
91
|
+
# A list of arguments to pass along to the processing method
|
92
|
+
#
|
93
|
+
def method_missing method, *opt
|
94
|
+
method.to_s =~ /^do_[A-Z]+$/ ? process_request(*opt) : super
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -20,11 +20,13 @@
|
|
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 'oaf/util'
|
24
|
+
require 'oaf/http/handler'
|
23
25
|
require 'webrick'
|
24
26
|
|
25
|
-
module Oaf
|
27
|
+
module Oaf::HTTP
|
26
28
|
|
27
|
-
module
|
29
|
+
module Server
|
28
30
|
extend Oaf
|
29
31
|
extend self
|
30
32
|
|
@@ -100,15 +102,7 @@ module Oaf
|
|
100
102
|
#
|
101
103
|
def serve path, port
|
102
104
|
server = WEBrick::HTTPServer.new :Port => port
|
103
|
-
server.
|
104
|
-
req_headers = req.header
|
105
|
-
req_query = req.query
|
106
|
-
req_body = Oaf::HTTP::get_request_body req
|
107
|
-
file = Oaf::Util.get_request_file path, req.path, req.request_method
|
108
|
-
out = Oaf::Util.get_output file, req_headers, req_body, req_query
|
109
|
-
res_headers, res_status, res_body = Oaf::HTTP.parse_response out
|
110
|
-
Oaf::HTTP.set_response! res, res_headers, res_body, res_status
|
111
|
-
end
|
105
|
+
server.mount '/', Oaf::HTTP::Handler, path
|
112
106
|
trap 'INT' do server.shutdown end
|
113
107
|
server.start
|
114
108
|
end
|
data/lib/oaf/version.rb
CHANGED
data/spec/oaf/http_spec.rb
CHANGED
@@ -25,7 +25,7 @@ require 'spec_helper'
|
|
25
25
|
module Oaf
|
26
26
|
describe "Returning HTTP Responses" do
|
27
27
|
it "should return safe defaults if output is empty" do
|
28
|
-
headers, status, body = Oaf::HTTP.parse_response ''
|
28
|
+
headers, status, body = Oaf::HTTP::Server.parse_response ''
|
29
29
|
headers.should eq({})
|
30
30
|
status.should eq(200)
|
31
31
|
body.should eq("\n")
|
@@ -33,7 +33,7 @@ module Oaf
|
|
33
33
|
|
34
34
|
it "should return safe defaults when only body is present" do
|
35
35
|
text = "This is a test\n"
|
36
|
-
headers, status, body = Oaf::HTTP.parse_response text
|
36
|
+
headers, status, body = Oaf::HTTP::Server.parse_response text
|
37
37
|
headers.should eq({})
|
38
38
|
status.should eq(200)
|
39
39
|
body.should eq("This is a test\n")
|
@@ -41,25 +41,25 @@ module Oaf
|
|
41
41
|
|
42
42
|
it "should return headers correctly" do
|
43
43
|
text = "---\nx-powered-by: oaf"
|
44
|
-
headers, status, body = Oaf::HTTP.parse_response text
|
44
|
+
headers, status, body = Oaf::HTTP::Server.parse_response text
|
45
45
|
headers.should eq({'x-powered-by' => 'oaf'})
|
46
46
|
end
|
47
47
|
|
48
48
|
it "should return status correctly" do
|
49
49
|
text = "---\n201"
|
50
|
-
headers, status, body = Oaf::HTTP.parse_response text
|
50
|
+
headers, status, body = Oaf::HTTP::Server.parse_response text
|
51
51
|
status.should eq(201)
|
52
52
|
end
|
53
53
|
|
54
54
|
it "should return body correctly" do
|
55
55
|
text = "This is a test\n---\n200"
|
56
|
-
headers, status, body = Oaf::HTTP.parse_response text
|
56
|
+
headers, status, body = Oaf::HTTP::Server.parse_response text
|
57
57
|
body.should eq("This is a test\n")
|
58
58
|
end
|
59
59
|
|
60
60
|
it "should return body correctly when no metadata is present" do
|
61
61
|
text = "This is a test"
|
62
|
-
headers, status, body = Oaf::HTTP.parse_response text
|
62
|
+
headers, status, body = Oaf::HTTP::Server.parse_response text
|
63
63
|
body.should eq("This is a test\n")
|
64
64
|
end
|
65
65
|
end
|
@@ -85,24 +85,21 @@ module Oaf
|
|
85
85
|
Dir.delete @tempdir1
|
86
86
|
end
|
87
87
|
|
88
|
-
|
88
|
+
it "should start an HTTP server" do
|
89
89
|
@webrick = double()
|
90
90
|
@webrick.should_receive(:start).once.and_return(true)
|
91
91
|
WEBrick::HTTPServer.stub(:new).and_return(@webrick)
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
.and_yield(Oaf::FakeReq.new, Oaf::FakeRes.new)
|
97
|
-
Oaf::HTTP.serve '/tmp', 9000
|
92
|
+
@webrick.should_receive(:mount) \
|
93
|
+
.with('/', Oaf::HTTP::Handler, '/tmp').once \
|
94
|
+
.and_return(true)
|
95
|
+
Oaf::HTTP::Server.serve '/tmp', 9000
|
98
96
|
end
|
99
97
|
|
100
98
|
it "should parse the request properly" do
|
101
99
|
req = Oaf::FakeReq.new :path => @f1request
|
102
100
|
res = Oaf::FakeRes.new
|
103
|
-
|
104
|
-
|
105
|
-
Oaf::HTTP.serve @tempdir1, 9000
|
101
|
+
handler = Oaf::HTTP::Handler.new Oaf::FakeServlet.new, @tempdir1
|
102
|
+
handler.process_request req, res
|
106
103
|
res.body.should eq("This is a test.\n")
|
107
104
|
res.status.should eq(201)
|
108
105
|
res.header.should eq('x-powered-by' => 'oaf')
|
@@ -111,12 +108,23 @@ module Oaf
|
|
111
108
|
it "should accept containable methods properly" do
|
112
109
|
req = Oaf::FakeReq.new({:path => @f2request, :method => 'PUT'})
|
113
110
|
res = Oaf::FakeRes.new
|
114
|
-
|
115
|
-
|
116
|
-
Oaf::HTTP.serve(@tempdir1, 9000)
|
111
|
+
handler = Oaf::HTTP::Handler.new Oaf::FakeServlet.new, @tempdir1
|
112
|
+
handler.process_request req, res
|
117
113
|
res.body.should eq("Containable Test\n")
|
118
114
|
res.status.should eq(202)
|
119
115
|
res.header.should eq('x-powered-by' => 'oaf')
|
120
116
|
end
|
117
|
+
|
118
|
+
it "should respond to any HTTP method" do
|
119
|
+
req = Oaf::FakeReq.new :path => @f1request
|
120
|
+
res = Oaf::FakeRes.new
|
121
|
+
Oaf::HTTP::Handler.any_instance.stub(:process_request).and_return(true)
|
122
|
+
handler = Oaf::HTTP::Handler.new Oaf::FakeServlet.new, @tempdir1
|
123
|
+
handler.should_receive(:process_request).with(req, res).once
|
124
|
+
handler.respond_to?(:do_GET).should be_true
|
125
|
+
handler.respond_to?(:do_get).should be_false
|
126
|
+
handler.respond_to?(:nonexistent).should be_false
|
127
|
+
handler.do_PUT(req, res)
|
128
|
+
end
|
121
129
|
end
|
122
130
|
end
|
data/spec/webrick-mocks.rb
CHANGED
@@ -9,7 +9,7 @@ module Oaf
|
|
9
9
|
@body = @path = @request_method = @query = nil
|
10
10
|
@header = Hash.new
|
11
11
|
|
12
|
-
def initialize opts={}
|
12
|
+
def initialize opts={}, *args
|
13
13
|
@body = opts[:body] ? opts[:body] : nil
|
14
14
|
@path, @query = opts[:path] ? opts[:path].split('?') : ['/']
|
15
15
|
@request_method = opts[:method] ? opts[:method] : 'GET'
|
@@ -43,4 +43,13 @@ module Oaf
|
|
43
43
|
@header[field] = value
|
44
44
|
end
|
45
45
|
end
|
46
|
+
|
47
|
+
class FakeServlet
|
48
|
+
|
49
|
+
def [](field)
|
50
|
+
end
|
51
|
+
|
52
|
+
def []=(field, value)
|
53
|
+
end
|
54
|
+
end
|
46
55
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Uber
|
@@ -95,7 +95,8 @@ files:
|
|
95
95
|
- Rakefile
|
96
96
|
- bin/oaf
|
97
97
|
- lib/oaf.rb
|
98
|
-
- lib/oaf/http.rb
|
98
|
+
- lib/oaf/http/handler.rb
|
99
|
+
- lib/oaf/http/server.rb
|
99
100
|
- lib/oaf/util.rb
|
100
101
|
- lib/oaf/version.rb
|
101
102
|
- oaf.gemspec
|