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 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