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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 10e7c12fb4c851be82d6b1ebf1a5edbdfa8c3b77
4
- data.tar.gz: 1e8c9cfe8c4cb0416f8e4f2f84ac2160e1825096
3
+ metadata.gz: e0d4d25a2e0b11d17de9055f366c3b25180e715e
4
+ data.tar.gz: 9b24a8c14b08619784257e9ff51262551a6c4253
5
5
  SHA512:
6
- metadata.gz: a97cb0557f0865a4198415d9d72f3abf36b0b1929dda53b5fdcd0470c36d9ca99372da9deb3db60a510100052d36ae5e768456be6674d9ead089b4404d0f1e81
7
- data.tar.gz: 7041791083c422d4b7929bcbb9fb97a43c37d82890333b61eba09a60fae44c355f2bd79c74c56b4dc44c0839d47e3793181f4e94b0a831a457899661218b35fd
6
+ metadata.gz: 1a5ba3204e2ce3337a61a5f5d6bae3efcfbf2616f852ad94960431f863e43322bece69d1df7886b896091ab0403ff32e2099575041d0c46061447d00cbbfa990
7
+ data.tar.gz: f9bfafd37017da3d73ac3aaf7aaa24b1abd68806d7daf660dc3d19cf40b92f37ab99feb9a2264b6bd159b7d7d613ea7d83b2b0e619492eff76e1fb7ba4adc80a
data/lib/em-midori.rb CHANGED
@@ -3,6 +3,7 @@ require 'stringio'
3
3
  require 'eventmachine'
4
4
  require 'fiber'
5
5
  require 'logger'
6
+ require 'http/parser'
6
7
 
7
8
  require_relative 'em-midori/version'
8
9
  require_relative 'em-midori/string'
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.reverse.each { |middleware| response = middleware.after(request, response) }
183
+ middlewares.reverse_each { |middleware| response = middleware.after(request, response) }
184
184
  return response
185
185
  end
186
186
  end
@@ -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',
@@ -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
@@ -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
- # Parse request
29
- line = data.gets.split
30
- @protocol = line[2]
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 = line[1].gsub(/\?(.*?)$/, '')
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
 
@@ -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
- ->() { async_internal(Fiber.new do
24
- start_time = Time.now
25
- data = StringIO.new(data)
26
- port, ip = Socket.unpack_sockaddr_in(get_peername)
27
- @request.ip = ip
28
- @request.port = port
29
- if @request.parsed?
30
- websocket_request(data)
31
- else
32
- receive_new_request(data)
33
- end
34
- now_time = Time.now
35
- @logger.info "#{@request.ip} - - \"#{@request.method} #{@request.path} #{@request.protocol}\" #{@response.status} #{(now_time.to_f - start_time.to_f).round(5)}".green
36
- end) }.call
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 [String] data raw data
61
+ # @param [StringIO] data raw data
61
62
  def websocket_request(data)
62
63
  @websocket.decode(data)
63
64
  case @websocket.opcode
64
- when 0x1, 0x2
65
- call_event(:message, [@websocket.msg])
66
- when 0x9
67
- @websocket.pong(@websocket.msg)
68
- call_event(:ping)
69
- when 0xA
70
- call_event(:pong)
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
- (-> { @websocket.instance_exec(*args, &@websocket.events[event]) }.call) unless @websocket.events[event].nil?
91
+ -> { @websocket.instance_exec(*args, &@websocket.events[event]) }.call unless @websocket.events[event].nil?
91
92
  end
92
93
  end
@@ -1,4 +1,4 @@
1
1
  module Midori
2
2
  # Current Version Code
3
- VERSION = '0.0.9.3'.freeze
3
+ VERSION = '0.0.9.4'.freeze
4
4
  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.0.9.3
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-24 00:00:00.000000000 Z
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