angelo 0.1.0 → 0.1.1
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/lib/angelo/params_parser.rb +17 -4
- data/lib/angelo/responder.rb +8 -4
- data/lib/angelo/tilt/erb.rb +6 -1
- data/lib/angelo/version.rb +1 -1
- data/lib/angelo.rb +11 -1
- data/spec/angelo/params_spec.rb +9 -0
- data/spec/angelo_spec.rb +28 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c49fed8026c10ee370aea064b5be14c7a38848b1
|
4
|
+
data.tar.gz: b56899e2f4ac2310c414b09bb2838357e223df6c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bfcc2c164ab9d1908ff4f5c0557c115395d3ab48bd92c530d5040cac4e29c469c4a718cf15206e746d78da12d891bc01555a493b359b481bfed2c85987370a11
|
7
|
+
data.tar.gz: a586ff3c8271e29e7475b1c26a796240a0854e86f3c0449e7f099da02c95e725b0dd298623d9ecd7058bc4465c8061cee468cbf75bf12de32523ad35a64eca91
|
data/lib/angelo/params_parser.rb
CHANGED
@@ -2,14 +2,19 @@ require 'cgi'
|
|
2
2
|
|
3
3
|
module Angelo
|
4
4
|
|
5
|
+
class FormEncodingError < StandardError; end
|
6
|
+
|
5
7
|
module ParamsParser
|
6
8
|
|
7
9
|
EMPTY_JSON = '{}'
|
8
10
|
SEMICOLON = ';'
|
11
|
+
EQUALS = '='
|
12
|
+
AMPERSAND = '&'
|
9
13
|
|
10
14
|
def parse_formencoded str
|
11
|
-
str.
|
12
|
-
|
15
|
+
raise FormEncodingError unless str.empty? or str.index EQUALS
|
16
|
+
str.split(AMPERSAND).reduce(Responder.symhash) do |p, kv|
|
17
|
+
key, value = kv.split(EQUALS).map {|s| CGI.unescape s}
|
13
18
|
p[key] = value
|
14
19
|
p
|
15
20
|
end
|
@@ -21,14 +26,18 @@ module Angelo
|
|
21
26
|
|
22
27
|
def parse_post_body
|
23
28
|
body = request.body.to_s
|
29
|
+
qs = parse_query_string
|
24
30
|
case
|
25
31
|
when form_encoded?
|
26
32
|
body = parse_formencoded body
|
33
|
+
qs.merge! body
|
27
34
|
when json?
|
28
35
|
body = EMPTY_JSON if body.empty?
|
29
36
|
body = JSON.parse body
|
37
|
+
qs.merge! body
|
38
|
+
else
|
39
|
+
qs
|
30
40
|
end
|
31
|
-
parse_query_string.merge! body
|
32
41
|
end
|
33
42
|
|
34
43
|
def form_encoded?
|
@@ -40,7 +49,11 @@ module Angelo
|
|
40
49
|
end
|
41
50
|
|
42
51
|
def content_type? type
|
43
|
-
request.headers[CONTENT_TYPE_HEADER_KEY]
|
52
|
+
if request.headers[CONTENT_TYPE_HEADER_KEY]
|
53
|
+
request.headers[CONTENT_TYPE_HEADER_KEY].split(SEMICOLON).include? type
|
54
|
+
else
|
55
|
+
nil
|
56
|
+
end
|
44
57
|
end
|
45
58
|
|
46
59
|
end
|
data/lib/angelo/responder.rb
CHANGED
@@ -59,14 +59,18 @@ module Angelo
|
|
59
59
|
else
|
60
60
|
raise NotImplementedError
|
61
61
|
end
|
62
|
+
rescue JSON::ParserError => jpe
|
63
|
+
handle_error jpe, :bad_request, false
|
64
|
+
rescue FormEncodingError => fee
|
65
|
+
handle_error fee, :bad_request, false
|
62
66
|
rescue => e
|
63
67
|
handle_error e
|
64
68
|
end
|
65
69
|
|
66
|
-
def handle_error _error, report = true
|
70
|
+
def handle_error _error, type = :internal_server_error, report = true
|
67
71
|
err_msg = error_message _error
|
68
|
-
Angelo.log @connection, @request, nil,
|
69
|
-
@connection.respond
|
72
|
+
Angelo.log @connection, @request, nil, type, err_msg.size
|
73
|
+
@connection.respond type, headers, err_msg
|
70
74
|
@connection.close
|
71
75
|
if report
|
72
76
|
error "#{_error.class} - #{_error.message}"
|
@@ -121,7 +125,7 @@ module Angelo
|
|
121
125
|
Angelo.log @connection, @request, nil, :ok, @body.size
|
122
126
|
@connection.respond :ok, headers, @body
|
123
127
|
rescue => e
|
124
|
-
handle_error e, false
|
128
|
+
handle_error e, :internal_server_error, false
|
125
129
|
end
|
126
130
|
|
127
131
|
end
|
data/lib/angelo/tilt/erb.rb
CHANGED
@@ -52,7 +52,12 @@ module Angelo
|
|
52
52
|
|
53
53
|
def erb view, opts = {locals: {}}
|
54
54
|
locals = Hash === opts[:locals] ? opts[:locals] : {}
|
55
|
-
render =
|
55
|
+
render = case view
|
56
|
+
when String
|
57
|
+
->{ view }
|
58
|
+
when Symbol
|
59
|
+
->{self.class.templates[view].render self, locals}
|
60
|
+
end
|
56
61
|
case opts[:layout]
|
57
62
|
when false
|
58
63
|
render[]
|
data/lib/angelo/version.rb
CHANGED
data/lib/angelo.rb
CHANGED
@@ -35,8 +35,17 @@ module Angelo
|
|
35
35
|
LOG_FORMAT = '%s - - "%s %s%s HTTP/%s" %d %s'
|
36
36
|
|
37
37
|
def self.log connection, request, socket, status, body_size = '-'
|
38
|
+
|
39
|
+
remote_ip = ->{
|
40
|
+
if socket.nil?
|
41
|
+
connection.remote_ip rescue 'unknown'
|
42
|
+
else
|
43
|
+
socket.peeraddr(false)[3]
|
44
|
+
end
|
45
|
+
}
|
46
|
+
|
38
47
|
Celluloid::Logger.debug LOG_FORMAT % [
|
39
|
-
|
48
|
+
remote_ip[],
|
40
49
|
request.method,
|
41
50
|
request.path,
|
42
51
|
request.query_string.nil? ? nil : '?'+request.query_string,
|
@@ -44,6 +53,7 @@ module Angelo
|
|
44
53
|
Symbol === status ? HTTP::Response::SYMBOL_TO_STATUS_CODE[status] : status,
|
45
54
|
body_size
|
46
55
|
]
|
56
|
+
|
47
57
|
end
|
48
58
|
|
49
59
|
end
|
data/spec/angelo/params_spec.rb
CHANGED
@@ -68,4 +68,13 @@ describe Angelo::ParamsParser do
|
|
68
68
|
parser.parse_post_body.should eq post_params
|
69
69
|
end
|
70
70
|
|
71
|
+
it 'does not parse POST bodies if no Content-Type' do
|
72
|
+
parser.form_encoded = false
|
73
|
+
parser.json = false
|
74
|
+
parser.query_string = get_params
|
75
|
+
parser.body = nil
|
76
|
+
parser.parse_post_body.should eq params_s
|
77
|
+
parser.parse_query_string.should eq params_s
|
78
|
+
end
|
79
|
+
|
71
80
|
end
|
data/spec/angelo_spec.rb
CHANGED
@@ -37,8 +37,7 @@ describe Angelo::Base do
|
|
37
37
|
|
38
38
|
it 'responds to get requests with json properly' do
|
39
39
|
get '/json', obj
|
40
|
-
|
41
|
-
last_response_should_be_json string_vals
|
40
|
+
last_response_should_be_json obj_s
|
42
41
|
end
|
43
42
|
|
44
43
|
it 'responds to post requests with json properly' do
|
@@ -277,6 +276,33 @@ describe Angelo::Base do
|
|
277
276
|
end
|
278
277
|
|
279
278
|
describe 'params helper' do
|
279
|
+
|
280
|
+
define_app do
|
281
|
+
|
282
|
+
[:get, :post].each do |m|
|
283
|
+
__send__ m, '/json' do
|
284
|
+
content_type :json
|
285
|
+
params
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
end
|
290
|
+
|
291
|
+
it 'parses formencoded body when content-type is formencoded' do
|
292
|
+
post '/json', obj, {'Content-Type' => Angelo::FORM_TYPE}
|
293
|
+
last_response_should_be_json obj_s
|
294
|
+
end
|
295
|
+
|
296
|
+
it 'does not parse JSON body when content-type is formencoded' do
|
297
|
+
post '/json', obj.to_json, {'Content-Type' => Angelo::FORM_TYPE}
|
298
|
+
last_response.status.should eq 400
|
299
|
+
end
|
300
|
+
|
301
|
+
it 'does not parse body when request content-type not set' do
|
302
|
+
post '/json', obj, {'Content-Type' => ''}
|
303
|
+
last_response_should_be_json({})
|
304
|
+
end
|
305
|
+
|
280
306
|
end
|
281
307
|
|
282
308
|
describe 'websockets helper' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: angelo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenichi Nakamura
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-03-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: reel
|