em-midori 0.0.9.3 → 0.0.9.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/em-midori.rb +1 -0
- data/lib/em-midori/api.rb +1 -1
- data/lib/em-midori/const.rb +1 -1
- data/lib/em-midori/em_midori.rb +1 -0
- data/lib/em-midori/request.rb +12 -16
- data/lib/em-midori/server.rb +24 -23
- data/lib/em-midori/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e0d4d25a2e0b11d17de9055f366c3b25180e715e
|
4
|
+
data.tar.gz: 9b24a8c14b08619784257e9ff51262551a6c4253
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a5ba3204e2ce3337a61a5f5d6bae3efcfbf2616f852ad94960431f863e43322bece69d1df7886b896091ab0403ff32e2099575041d0c46061447d00cbbfa990
|
7
|
+
data.tar.gz: f9bfafd37017da3d73ac3aaf7aaa24b1abd68806d7daf660dc3d19cf40b92f37ab99feb9a2264b6bd159b7d7d613ea7d83b2b0e619492eff76e1fb7ba4adc80a
|
data/lib/em-midori.rb
CHANGED
data/lib/em-midori/api.rb
CHANGED
@@ -180,7 +180,7 @@ class Midori::API
|
|
180
180
|
result = -> { clean_room.instance_exec(*matched, &route.function) }.call
|
181
181
|
clean_room.body = result if body_accept.include?(result.class)
|
182
182
|
response = clean_room.raw_response
|
183
|
-
middlewares.
|
183
|
+
middlewares.reverse_each { |middleware| response = middleware.after(request, response) }
|
184
184
|
return response
|
185
185
|
end
|
186
186
|
end
|
data/lib/em-midori/const.rb
CHANGED
@@ -35,7 +35,7 @@ module Midori::Const
|
|
35
35
|
415 => '415 Unsupported Media Type',
|
36
36
|
416 => '416 Requested range not satisfiable',
|
37
37
|
417 => '417 Expectation Failed',
|
38
|
-
451 => '451 ',
|
38
|
+
451 => '451 Unavailable For Legal Reasons',
|
39
39
|
500 => '500 Internal Server Error',
|
40
40
|
501 => '501 Not Implemented',
|
41
41
|
502 => '502 Bad Gateway',
|
data/lib/em-midori/em_midori.rb
CHANGED
@@ -11,6 +11,7 @@ module Midori
|
|
11
11
|
# @return [nil] nil
|
12
12
|
def self.run(api = Midori::API, ip = '127.0.0.1', port = 8081, logger = ::Logger.new(STDOUT))
|
13
13
|
@logger = logger
|
14
|
+
EventMachine.set_simultaneous_accept_count(40)
|
14
15
|
EventMachine.run do
|
15
16
|
@logger.info "Midori #{Midori::VERSION} is now running on #{ip}:#{port}".blue
|
16
17
|
@midori_server = EventMachine.start_server ip, port, Midori::Server, api, logger
|
data/lib/em-midori/request.rb
CHANGED
@@ -18,26 +18,24 @@ class Midori::Request
|
|
18
18
|
@parsed = false
|
19
19
|
@is_websocket = false
|
20
20
|
@is_eventsource = false
|
21
|
+
@parser = Http::Parser.new
|
22
|
+
@parser.on_headers_complete = proc do
|
23
|
+
@protocol = @parser.http_version
|
24
|
+
@method = @parser.http_method
|
25
|
+
@path = @parser.request_url
|
26
|
+
@header = @parser.headers
|
27
|
+
:stop
|
28
|
+
end
|
21
29
|
end
|
22
30
|
|
23
31
|
# Init an request with StringIO data
|
24
|
-
# @param [StringIO+] data Request data
|
25
32
|
def parse(data)
|
26
|
-
@header = {}
|
27
33
|
|
28
|
-
|
29
|
-
|
30
|
-
@
|
31
|
-
@method = line[0]
|
32
|
-
@query_string = line[1].match(/\?(.*?)$/)
|
34
|
+
offset = @parser << data
|
35
|
+
@body = data[offset..-1]
|
36
|
+
@query_string = @path.match(/\?(.*?)$/)
|
33
37
|
@query_string = @query_string[1] unless @query_string.nil?
|
34
|
-
@path
|
35
|
-
|
36
|
-
# Parse header
|
37
|
-
while (line = data.gets) != "\r\n"
|
38
|
-
line = line.split
|
39
|
-
@header[line[0][0..-2]] = line[1..-1].join(' ')
|
40
|
-
end
|
38
|
+
@path.gsub!(/\?(.*?)$/, '')
|
41
39
|
|
42
40
|
# Deal with WebSocket
|
43
41
|
if @header['Upgrade'] == 'websocket' && @header['Connection'] == 'Upgrade'
|
@@ -51,8 +49,6 @@ class Midori::Request
|
|
51
49
|
@is_eventsource = true
|
52
50
|
end
|
53
51
|
|
54
|
-
# Parse body
|
55
|
-
@body = data.read
|
56
52
|
@parsed = true
|
57
53
|
end
|
58
54
|
|
data/lib/em-midori/server.rb
CHANGED
@@ -20,20 +20,21 @@ module Midori::Server
|
|
20
20
|
# Logics of receiving data
|
21
21
|
# @param [String] data raw data
|
22
22
|
def receive_data(data)
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
23
|
+
lambda do
|
24
|
+
async_internal(Fiber.new do
|
25
|
+
start_time = Time.now
|
26
|
+
port, ip = Socket.unpack_sockaddr_in(get_peername)
|
27
|
+
@request.ip = ip
|
28
|
+
@request.port = port
|
29
|
+
if @request.parsed?
|
30
|
+
websocket_request(StringIO.new(data))
|
31
|
+
else
|
32
|
+
receive_new_request(data)
|
33
|
+
end
|
34
|
+
now_time = Time.now
|
35
|
+
@logger.info "#{@request.ip} - - \"#{@request.method} #{@request.path}\" #{@response.status} #{(now_time.to_f - start_time.to_f).round(6)}".green
|
36
|
+
end)
|
37
|
+
end.call
|
37
38
|
end
|
38
39
|
|
39
40
|
# Logics of receiving new request
|
@@ -57,17 +58,17 @@ module Midori::Server
|
|
57
58
|
end
|
58
59
|
|
59
60
|
# Logics of receiving WebSocket request
|
60
|
-
# @param [
|
61
|
+
# @param [StringIO] data raw data
|
61
62
|
def websocket_request(data)
|
62
63
|
@websocket.decode(data)
|
63
64
|
case @websocket.opcode
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
65
|
+
when 0x1, 0x2
|
66
|
+
call_event(:message, [@websocket.msg])
|
67
|
+
when 0x9
|
68
|
+
@websocket.pong(@websocket.msg)
|
69
|
+
call_event(:ping)
|
70
|
+
when 0xA
|
71
|
+
call_event(:pong)
|
71
72
|
end
|
72
73
|
rescue Midori::Error::FrameEnd => _e
|
73
74
|
call_event(:close)
|
@@ -87,6 +88,6 @@ module Midori::Server
|
|
87
88
|
# @param [Symbol] event event name
|
88
89
|
# @param [Array] args arg list
|
89
90
|
def call_event(event, args = [])
|
90
|
-
|
91
|
+
-> { @websocket.instance_exec(*args, &@websocket.events[event]) }.call unless @websocket.events[event].nil?
|
91
92
|
end
|
92
93
|
end
|
data/lib/em-midori/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-midori
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.9.
|
4
|
+
version: 0.0.9.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- HeckPsi Lab
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-10-
|
11
|
+
date: 2016-10-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: eventmachine
|
@@ -30,6 +30,20 @@ dependencies:
|
|
30
30
|
- - ">"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 1.2.0.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: http_parser.rb
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0.6'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0.6'
|
33
47
|
description: EM Midori is an EventMachine-based Web Framework written in pure Ruby,
|
34
48
|
providing high performance and proper abstraction.
|
35
49
|
email: business@heckpsi.com
|