midori.rb 0.5.4 → 0.6.0
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/midori/configure.rb +3 -1
- data/lib/midori/connection.rb +7 -3
- data/lib/midori/server.rb +46 -27
- data/lib/midori/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ccffda67e06a88ed46a9e81ac52823498d331a147869f54a3c520bc70946f469
|
4
|
+
data.tar.gz: 2abeba1e323655b28a547814eccc536773b35316075b3852897ec109b4272719
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d68c112f68c228a79b46f2983e0bd4ba9b0ff25b8aa9025eca7893909719e7213a8236fca26d78ba2aad12926481d7f989d920148e00b866f9f86c8a6b3cff20
|
7
|
+
data.tar.gz: 6eae1c01af1fa93acf6bf817ce1c04121918a53d1f849815778eed0f974c36259bd1ee6df3901b86128d247b77dfca5c81e04e5e1477836aa2dd31c0c2a1061e
|
data/lib/midori/configure.rb
CHANGED
@@ -4,7 +4,6 @@ class Midori::Configure
|
|
4
4
|
extend Configurable
|
5
5
|
|
6
6
|
set :logger, ::Logger.new(STDOUT)
|
7
|
-
set :protocol, :http
|
8
7
|
set :bind, '127.0.0.1'
|
9
8
|
set :port, 8080
|
10
9
|
set :route_type, :sinatra
|
@@ -14,4 +13,7 @@ class Midori::Configure
|
|
14
13
|
set :trusted_proxies, /\A127\.0\.0\.1\Z|\A(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.|
|
15
14
|
\A::1\Z|\Afd[0-9a-f]{2}:.+|\Alocalhost\Z|\Aunix\Z|\Aunix:/ix
|
16
15
|
set :tcp_fast_open, true
|
16
|
+
set :keep_alive, true
|
17
|
+
set :keep_alive_timeout, 75
|
18
|
+
set :keep_alive_requests, 1000
|
17
19
|
end
|
data/lib/midori/connection.rb
CHANGED
@@ -23,9 +23,7 @@ class Midori::Connection
|
|
23
23
|
def listen(socket)
|
24
24
|
EventLoop.register(socket, :rw) do |monitor|
|
25
25
|
@monitor = monitor
|
26
|
-
if monitor.readable?
|
27
|
-
receive_data(monitor)
|
28
|
-
end
|
26
|
+
receive_data(monitor) if monitor.readable?
|
29
27
|
if monitor.writable?
|
30
28
|
if !@buffer.empty?
|
31
29
|
send_buffer
|
@@ -45,6 +43,7 @@ class Midori::Connection
|
|
45
43
|
end
|
46
44
|
|
47
45
|
# Send buffer immediately
|
46
|
+
# @return [nil] nil
|
48
47
|
private def send_buffer
|
49
48
|
if @monitor.writable?
|
50
49
|
written = @socket.write_nonblock(@buffer)
|
@@ -59,13 +58,18 @@ class Midori::Connection
|
|
59
58
|
end
|
60
59
|
|
61
60
|
# Close the connection
|
61
|
+
# @return [nil] nil
|
62
62
|
def close_connection
|
63
|
+
EventLoop.remove_timer(@keep_alive_timer) unless @keep_alive_timer.nil? # Be sure to remove timer for memory safety
|
63
64
|
EventLoop.deregister @socket
|
64
65
|
@socket.close
|
66
|
+
nil
|
65
67
|
end
|
66
68
|
|
67
69
|
# Close the connection after writing
|
70
|
+
# @return [nil] nil
|
68
71
|
def close_connection_after_writing
|
69
72
|
@close_flag = true
|
73
|
+
nil
|
70
74
|
end
|
71
75
|
end
|
data/lib/midori/server.rb
CHANGED
@@ -17,40 +17,41 @@ module Midori::Server
|
|
17
17
|
def server_initialize(api, logger)
|
18
18
|
@api = api
|
19
19
|
@logger = logger
|
20
|
+
|
20
21
|
@request = Midori::Request.new
|
21
22
|
@websocket = Midori::WebSocket.new(self)
|
22
23
|
@eventsource = Midori::EventSource.new(self)
|
24
|
+
|
25
|
+
# Add keep-alive parameters
|
26
|
+
@keep_alive_timer = nil
|
27
|
+
@keep_alive_count = 1
|
23
28
|
end
|
24
29
|
|
25
30
|
# Logic of receiving data
|
26
|
-
# @param [
|
31
|
+
# @param [NIO::Monitor] monitor the socket able to read
|
27
32
|
def receive_data(monitor)
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
else
|
39
|
-
@request.parse(data)
|
40
|
-
receive_new_request if @request.parsed && @request.body_parsed?
|
41
|
-
end
|
42
|
-
rescue EOFError, Errno::ENOTCONN => _e
|
43
|
-
close_connection
|
44
|
-
# Ignore client's disconnection
|
45
|
-
rescue => e
|
46
|
-
# :nocov:
|
47
|
-
# Leave for corner cases
|
48
|
-
close_connection
|
49
|
-
@logger.warn "#{@request.ip} - - #{e.class} #{e.backtrace.join("\n")}".yellow
|
50
|
-
# :nocov:
|
33
|
+
async_fiber(Fiber.new do
|
34
|
+
begin
|
35
|
+
_sock_domain, remote_port, _remote_hostname, remote_ip = monitor.io.peeraddr
|
36
|
+
@request.ip, @request.port = remote_port, remote_ip
|
37
|
+
data = monitor.io.read_nonblock(16_384)
|
38
|
+
if @request.parsed? && @request.body_parsed?
|
39
|
+
websocket_request(StringIO.new(data))
|
40
|
+
else
|
41
|
+
@request.parse(data)
|
42
|
+
receive_new_request if @request.parsed && @request.body_parsed?
|
51
43
|
end
|
52
|
-
|
53
|
-
|
44
|
+
rescue EOFError, Errno::ENOTCONN => _e
|
45
|
+
close_connection
|
46
|
+
# Ignore client's disconnection
|
47
|
+
rescue => e
|
48
|
+
# :nocov:
|
49
|
+
# Leave for corner cases
|
50
|
+
close_connection
|
51
|
+
@logger.warn "#{@request.ip} - - #{e.class} #{e.backtrace.join("\n")}".yellow
|
52
|
+
# :nocov:
|
53
|
+
end
|
54
|
+
end)
|
54
55
|
end
|
55
56
|
|
56
57
|
# Logic of receiving new request
|
@@ -68,9 +69,10 @@ module Midori::Server
|
|
68
69
|
@logger.error e.inspect.red
|
69
70
|
@logger.warn e.backtrace.join("\n").yellow
|
70
71
|
end
|
72
|
+
|
71
73
|
unless @request.websocket? || @request.eventsource?
|
72
74
|
send_data @response
|
73
|
-
|
75
|
+
proceed_keep_alive
|
74
76
|
end
|
75
77
|
end
|
76
78
|
|
@@ -109,4 +111,21 @@ module Midori::Server
|
|
109
111
|
def call_event(event, args = [])
|
110
112
|
-> { @websocket.instance_exec(*args, &@websocket.events[event]) }.call unless @websocket.events[event].nil?
|
111
113
|
end
|
114
|
+
|
115
|
+
private def proceed_keep_alive
|
116
|
+
# Detect if it should close connection
|
117
|
+
if !Midori::Configure.keep_alive || (@keep_alive_count >= Midori::Configure.keep_alive_requests)
|
118
|
+
close_connection_after_writing
|
119
|
+
return
|
120
|
+
end
|
121
|
+
# Add timeout for keep-alive
|
122
|
+
@keep_alive_count += 1
|
123
|
+
EventLoop.remove_timer(@keep_alive_timer) unless @keep_alive_timer.nil?
|
124
|
+
@keep_alive_timer = EventLoop::Timer.new(Midori::Configure.keep_alive_timeout) do
|
125
|
+
close_connection
|
126
|
+
end
|
127
|
+
EventLoop.add_timer(@keep_alive_timer)
|
128
|
+
# Reset request
|
129
|
+
@request = Midori::Request.new
|
130
|
+
end
|
112
131
|
end
|
data/lib/midori/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: midori.rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- HeckPsi Lab
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: murasaki
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.2.
|
19
|
+
version: 0.2.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.2.
|
26
|
+
version: 0.2.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: mustermann
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|