em-midori 0.0.9.3 → 0.0.9.4
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/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
|