wouter 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/wouter.rb +29 -64
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 83e0fd10fd5d4cfd564ab573dc0602bc7752f8fc9219e7b4ef988ce8879e0902
|
4
|
+
data.tar.gz: 6e7613daede1879b938dbf481827b27ad15b52905a72c5742c1b16b8935f5ce0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d73792353400cd5de74b1da3b57eace57bba19e7cb517401a3d09416a8be22e5c3b6a36a6ab8090af85334282c8bf2d8aece9299fc79fc7135ee37f8235f4560
|
7
|
+
data.tar.gz: ad2264f42d38ad8f02465a1e235125e3815306d868b53a37a7209880177b7a1844d85423f16879cbe5d50fc1b2f02f28a3287ea698bbe4ae7e05e55017ada17d
|
data/lib/wouter.rb
CHANGED
@@ -5,37 +5,11 @@ require "rack"
|
|
5
5
|
class Wouter
|
6
6
|
|
7
7
|
# Incoming HTTP Request Wrapper
|
8
|
-
class Request
|
9
|
-
attr_reader :params
|
10
|
-
|
11
|
-
def initialize(params:)
|
12
|
-
@params = params
|
13
|
-
end
|
8
|
+
class Request < Rack::Request
|
14
9
|
end
|
15
10
|
|
16
11
|
# Outgoing HTTP Response Wrapper
|
17
|
-
class Response
|
18
|
-
attr_accessor :headers
|
19
|
-
|
20
|
-
def initialize
|
21
|
-
@headers = {'Content-Type' => 'text/html'}
|
22
|
-
@body = ""
|
23
|
-
@status = 200
|
24
|
-
end
|
25
|
-
|
26
|
-
def body(b)
|
27
|
-
@body = b
|
28
|
-
self
|
29
|
-
end
|
30
|
-
|
31
|
-
def status(s)
|
32
|
-
@status = s
|
33
|
-
self
|
34
|
-
end
|
35
|
-
|
36
|
-
def build_response
|
37
|
-
[@status, @headers, [@body]]
|
38
|
-
end
|
12
|
+
class Response < Rack::Response
|
39
13
|
end
|
40
14
|
|
41
15
|
# HTTP Endpoint Helper class
|
@@ -44,8 +18,9 @@ class Wouter
|
|
44
18
|
attr_reader :params
|
45
19
|
|
46
20
|
def initialize
|
47
|
-
@request =
|
48
|
-
@response =
|
21
|
+
@request = nil
|
22
|
+
@response = nil
|
23
|
+
@params = nil
|
49
24
|
end
|
50
25
|
|
51
26
|
def call(req, res)
|
@@ -53,30 +28,33 @@ class Wouter
|
|
53
28
|
@params = req.params
|
54
29
|
@response = res
|
55
30
|
r = respond
|
56
|
-
@response.
|
31
|
+
@response.write r
|
32
|
+
@response
|
57
33
|
end
|
58
34
|
|
59
35
|
def json(body)
|
60
|
-
@response.
|
36
|
+
@response.set_header('Content-Type', 'application/json')
|
61
37
|
body
|
62
38
|
end
|
63
39
|
|
64
40
|
def status(code)
|
65
|
-
@response.status code
|
41
|
+
@response.status = code
|
66
42
|
""
|
67
43
|
end
|
68
44
|
end
|
69
45
|
|
70
|
-
##
|
46
|
+
## Internal Data
|
71
47
|
|
72
|
-
|
48
|
+
def self.routes
|
49
|
+
@routes ||= []
|
50
|
+
end
|
73
51
|
|
74
52
|
## DSL
|
75
53
|
|
76
54
|
class <<self
|
77
55
|
%i[get post put delete].each do |m|
|
78
56
|
define_method(m) do |path, route_class|
|
79
|
-
|
57
|
+
routes.push({
|
80
58
|
method: m.to_s.upcase.to_sym,
|
81
59
|
path: path,
|
82
60
|
route_class: route_class
|
@@ -88,13 +66,12 @@ class Wouter
|
|
88
66
|
## Rack API
|
89
67
|
|
90
68
|
def self.call(env)
|
91
|
-
|
92
|
-
method = env["REQUEST_METHOD"].to_sym
|
69
|
+
request = Request.new(env)
|
93
70
|
|
94
71
|
route_params = {}
|
95
72
|
|
96
|
-
route =
|
97
|
-
if route[:method] ==
|
73
|
+
route = routes.find do |route|
|
74
|
+
if route[:method] == request.request_method.to_sym
|
98
75
|
if route[:path].include?(":")
|
99
76
|
split_path = route[:path].split("/")
|
100
77
|
# Find all the named parameters in the route, drop the ":" so we have the names: ":id" => "id"
|
@@ -102,8 +79,8 @@ class Wouter
|
|
102
79
|
# Turn the route into a regex: "/hello/:name" => "\/hello\/(\w*)"
|
103
80
|
path_regex_string = split_path.map { |s| s[0] == ":" ? "(\\w*)" : s }.join("\/")
|
104
81
|
r = Regexp.new(path_regex_string)
|
105
|
-
if r.match?(path)
|
106
|
-
match_data = r.match(path)
|
82
|
+
if r.match?(request.path)
|
83
|
+
match_data = r.match(request.path)
|
107
84
|
# Match the match data with the named params, ex { "id" => 123 }
|
108
85
|
route_param_names.each_with_index do |n, i|
|
109
86
|
route_params[n] = match_data[i+1]
|
@@ -113,21 +90,22 @@ class Wouter
|
|
113
90
|
false
|
114
91
|
end
|
115
92
|
else
|
116
|
-
route[:path] == path
|
93
|
+
route[:path] == request.path
|
117
94
|
end
|
118
95
|
end
|
119
96
|
end
|
120
97
|
|
121
98
|
if route
|
122
|
-
|
99
|
+
route_params.each do |k, v|
|
100
|
+
request.update_param(k, v)
|
101
|
+
end
|
123
102
|
|
124
|
-
request = Request.new(params: params)
|
125
103
|
response = Response.new
|
126
104
|
|
127
|
-
|
128
|
-
|
105
|
+
rack_response = route[:route_class].new.call(request, response)
|
106
|
+
rack_response.finish
|
129
107
|
else
|
130
|
-
|
108
|
+
not_found.finish
|
131
109
|
end
|
132
110
|
end
|
133
111
|
|
@@ -135,22 +113,9 @@ class Wouter
|
|
135
113
|
|
136
114
|
def self.not_found
|
137
115
|
resp = Response.new
|
138
|
-
resp.status 404
|
139
|
-
resp.
|
116
|
+
resp.status = 404
|
117
|
+
resp.write "Not Found"
|
118
|
+
resp
|
140
119
|
end
|
141
120
|
|
142
|
-
# Query string comes in as "key=value&key=value" and we turn it into { "key" => "value", "key" => "value" }
|
143
|
-
def self.generate_params(params)
|
144
|
-
return {} if params.nil? || params.empty?
|
145
|
-
params_hash = {}
|
146
|
-
params.split("&").each do |param_pair|
|
147
|
-
key, value = param_pair.split("=")
|
148
|
-
params_hash[key] = value
|
149
|
-
end
|
150
|
-
params_hash
|
151
|
-
end
|
152
|
-
|
153
|
-
def self.response(route_response)
|
154
|
-
route_response.build_response
|
155
|
-
end
|
156
121
|
end
|