em-midori 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 94ba1f04f2fa2a1c67fb02452a7e876a4539055a
4
- data.tar.gz: f0f7755bfc1d858f8b96a59bd4d85448063b0e18
3
+ metadata.gz: 3925b4b9ef7e976cc1e1af24b2979a0e3a276f06
4
+ data.tar.gz: 6b8a7e0d0300709096247aed4755a285d128cf94
5
5
  SHA512:
6
- metadata.gz: '019ee08cb1214e64468b04d134399815237c792470916af7590293c321b2400b76a9190c73a163625529d542c768ec6a9e953a0b8192b032d6fa12a86fbf5581'
7
- data.tar.gz: eb8310f650a6963f3ffd54c4544e7d6e9ad850dde10f89f00f87761d13c0a18f0eaa606cdd9800b2abc01f4bd07d73818be643f111ade90ea05137a63bb7de81
6
+ metadata.gz: 449941b9d262ef8a1e8727524976e3af90effde6efc56d043258b37db1eb3a932dc16c6ff701ccd18911dbd23d9c0c821441d687ccabc9e811a5c91b197cf419
7
+ data.tar.gz: 512051dcf9e5d764ba1c46b4cc1f817189b91d65875b08472a2337cdbe3da6d9aac72124e49da4b71b6a43ca3e607382d862ed9b699f6ae2aa3cc30cb7bc72dd
@@ -0,0 +1,88 @@
1
+ ##
2
+ # Meta-programming hiredis for redis async extension
3
+ module Hiredis
4
+ require 'hiredis/connection'
5
+ # Overwrite with ruby implementation to hook IO
6
+ require 'hiredis/ruby/connection'
7
+ require 'hiredis/ruby/reader'
8
+ # Redis Connection
9
+ Connection = Ruby::Connection
10
+ # Redis Result Reader
11
+ Reader = Ruby::Reader
12
+
13
+ ##
14
+ # Meta-programming hiredis for redis async extension
15
+ module Ruby
16
+ ##
17
+ # Meta-programming hiredis for redis async extension
18
+ class Connection
19
+ # Do redis query
20
+ # @param [String] data generated string data
21
+ def query(args)
22
+ await(Promise.new do |resolve|
23
+ read_flag = false
24
+ data = pre_write(args)
25
+ written = 0
26
+ EventLoop.register(@sock, :rw) do |monitor|
27
+ if read_flag && monitor.readable?
28
+ # Reading
29
+ _read(resolve, @sock)
30
+ end
31
+ if !read_flag && monitor.writable?
32
+ # Writing
33
+ written += @sock.write_nonblock(data[written..-1])
34
+ read_flag = true if written == string_size(data)
35
+ end
36
+ end
37
+ end)
38
+ end
39
+
40
+ private
41
+ def pre_write(args)
42
+ command = []
43
+ command << "*#{args.size}"
44
+ args.each do |arg|
45
+ arg = arg.to_s
46
+ command << "$#{string_size arg}"
47
+ command << arg
48
+ end
49
+ data = command.join(COMMAND_DELIMITER) + COMMAND_DELIMITER
50
+ data.force_encoding('binary') if data.respond_to?(:force_encoding)
51
+ data
52
+ end
53
+
54
+ def _read(resolve, sock)
55
+ @reader.feed @sock.read_nonblock(1024)
56
+ reply = @reader.gets
57
+ if reply
58
+ EventLoop.deregister(sock)
59
+ resolve.call(reply)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ require 'redic'
67
+
68
+ class Redic
69
+ class Client
70
+ def connect
71
+ establish_connection unless connected?
72
+ if block_given?
73
+ @semaphore.synchronize do
74
+ yield
75
+ end
76
+ end
77
+ end
78
+
79
+ def call(*args)
80
+ @connection.query(*args)
81
+ end
82
+ end
83
+
84
+ def call(*args)
85
+ @client.connect
86
+ @client.call(args)
87
+ end
88
+ end
@@ -8,7 +8,8 @@
8
8
  # @attr [String] query_string request query string
9
9
  # @attr [Hash] header request header
10
10
  # @attr [String] body request body
11
- # @attr [Boolean] parsed whether the request parsed
11
+ # @attr [Boolean] parsed whether the request header parsed
12
+ # @attr [Boolean] body_parsed whether the request body parsed
12
13
  # @attr [Hash] params params in the url
13
14
  class Midori::Request
14
15
  attr_accessor :ip, :port,
data/lib/midori/runner.rb CHANGED
@@ -2,8 +2,9 @@
2
2
  # Abstract runner class to control instance of Midori Server
3
3
  # @attr [String] bind the address to bind
4
4
  # @attr [Integer] port the port to bind
5
+ # @attr [Logger] logger midori logger
5
6
  class Midori::Runner
6
- attr_reader :bind, :port
7
+ attr_reader :bind, :port, :logger
7
8
 
8
9
  # Define status of a runner
9
10
  # @param [Class] api inherited from [Midori::API]
data/lib/midori/server.rb CHANGED
@@ -28,7 +28,6 @@ module Midori::Server
28
28
  lambda do
29
29
  async_fiber(Fiber.new do
30
30
  begin
31
- start_time = Time.now
32
31
  _sock_domain, remote_port, _remote_hostname, remote_ip = monitor.io.peeraddr
33
32
  port, ip = remote_port, remote_ip
34
33
  @request.ip = ip
@@ -40,8 +39,6 @@ module Midori::Server
40
39
  @request.parse(data)
41
40
  receive_new_request if @request.parsed && @request.body_parsed?
42
41
  end
43
- now_time = Time.now
44
- @logger.info "#{@request.ip} - - \"#{@request.method} #{@request.path} HTTP/#{@request.protocol.join('.')}\" #{@response.status} #{(now_time.to_f - start_time.to_f).round(6)}".green
45
42
  rescue => e
46
43
  close_connection
47
44
  @logger.warn "#{@request.ip} - - #{e.backtrace.join("\n")}".yellow
@@ -53,7 +50,10 @@ module Midori::Server
53
50
  # Logic of receiving new request
54
51
  def receive_new_request
55
52
  begin
53
+ start_time = Time.now
56
54
  @response = @api.receive(request, self)
55
+ now_time = Time.now
56
+ @logger.info "#{@request.ip} - - \"#{@request.method} #{@request.path} HTTP/#{@request.protocol.join('.')}\" #{@response.status} #{sprintf("%.6f", now_time.to_f - start_time.to_f)}".green
57
57
  call_event(:open) if @request.websocket?
58
58
  rescue Midori::Exception::NotFound => e
59
59
  @response = Midori::Sandbox.capture(e)
@@ -1,5 +1,5 @@
1
1
  # Midori Module
2
2
  module Midori
3
3
  # Current Version Code
4
- VERSION = '0.2.3'.freeze
4
+ VERSION = '0.2.4'.freeze
5
5
  end
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.2.3
4
+ version: 0.2.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: 2017-06-04 00:00:00.000000000 Z
11
+ date: 2017-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nio4r
@@ -80,8 +80,8 @@ files:
80
80
  - lib/midori/eventsource.rb
81
81
  - lib/midori/exception.rb
82
82
  - lib/midori/extension/file.rb
83
- - lib/midori/extension/hiredis.rb
84
83
  - lib/midori/extension/net.rb
84
+ - lib/midori/extension/redic.rb
85
85
  - lib/midori/extension/sequel/mysql2.rb
86
86
  - lib/midori/extension/sequel/postgres.rb
87
87
  - lib/midori/middleware.rb
@@ -1,59 +0,0 @@
1
- ##
2
- # Meta-programming hiredis for redis async extension
3
- module Hiredis
4
- require 'hiredis/connection'
5
- # Overwrite with ruby implementation to hook IO
6
- require 'hiredis/ruby/connection'
7
- require 'hiredis/ruby/reader'
8
- # Redis Connection
9
- Connection = Ruby::Connection
10
- # Redis Result Reader
11
- Reader = Ruby::Reader
12
-
13
- ##
14
- # Meta-programming hiredis for redis async extension
15
- module Ruby
16
- ##
17
- # Meta-programming hiredis for redis async extension
18
- class Connection
19
- # write message directly
20
- # @param [IO] _sock raw socket
21
- # @param [String] data generated string data
22
- # @param [Float] _timeout operation timeout
23
- def _write(_sock, data, _timeout)
24
- await(Promise.new do |resolve|
25
- data.force_encoding('binary') if data.respond_to?(:force_encoding)
26
- written = 0
27
- EventLoop.register(@sock, :w) do
28
- written += @sock.write_nonblock(data[written..-1])
29
- if written == string_size(data)
30
- EventLoop.deregister(@sock)
31
- resolve.call
32
- end
33
- end
34
- end)
35
- end
36
-
37
- # read from redis socket
38
- # @return [String] reply
39
- def read
40
- raise 'not connected' unless connected?
41
- await(Promise.new do |resolve|
42
- EventLoop.register(@sock, :r) do
43
- @reader.feed @sock.read_nonblock(1024)
44
- reply = @reader.gets
45
- if reply
46
- EventLoop.deregister(@sock)
47
- resolve.call(reply)
48
- end
49
- end
50
- end)
51
- rescue ::EOFError
52
- # :nocov:
53
- # Error Handler Copied from HiRedis driver itself
54
- raise Errno::ECONNRESET
55
- # :nocov:
56
- end
57
- end
58
- end
59
- end