Module: Midori::Server
- Included in:
- Connection
- Defined in:
- lib/midori/server.rb
Overview
Logic to EventMachine TCP Server, running inside Midori::Connection
Instance Attribute Summary collapse
-
#api ⇒ Class
Inherited from Midori::API.
-
#eventsource ⇒ Midori::EventSource
Defined eventsource instance.
-
#request ⇒ Midori::Request
Raw request.
-
#websocket ⇒ Midori::WebSocket
Defined websocket instance.
Instance Method Summary collapse
-
#call_event(event, args = []) ⇒ Object
To call a websocket event if it exist.
-
#receive_data(monitor) ⇒ Object
Logic of receiving data.
-
#receive_new_request ⇒ Object
Logic of receiving new request.
-
#server_initialize(api, logger) ⇒ Object
Define server behaviour.
-
#websocket_request(data) ⇒ Object
Logic of receiving WebSocket request.
Instance Attribute Details
#api ⇒ Class
Returns inherited from Midori::API.
12 |
# File 'lib/midori/server.rb', line 12 attr_accessor :request, :api, :websocket, :eventsource |
#eventsource ⇒ Midori::EventSource
Returns defined eventsource instance.
12 |
# File 'lib/midori/server.rb', line 12 attr_accessor :request, :api, :websocket, :eventsource |
#request ⇒ Midori::Request
Returns raw request.
12 13 14 |
# File 'lib/midori/server.rb', line 12 def request @request end |
#websocket ⇒ Midori::WebSocket
Returns defined websocket instance.
12 |
# File 'lib/midori/server.rb', line 12 attr_accessor :request, :api, :websocket, :eventsource |
Instance Method Details
#call_event(event, args = []) ⇒ Object
To call a websocket event if it exist
110 111 112 |
# File 'lib/midori/server.rb', line 110 def call_event(event, args = []) -> { @websocket.instance_exec(*args, &@websocket.events[event]) }.call unless @websocket.events[event].nil? end |
#receive_data(monitor) ⇒ Object
Logic of receiving data
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/midori/server.rb', line 32 def receive_data(monitor) async_fiber(Fiber.new do begin @request.ip, @request.port = @peer_addr data = monitor.io.read_nonblock(16_384) if @request.parsed? && @request.body_parsed? websocket_request(StringIO.new(data)) else @request.parse(data) receive_new_request if @request.parsed && @request.body_parsed? end rescue EOFError, Errno::ENOTCONN => _e close_connection # Ignore client's disconnection rescue => e # :nocov: # Leave for corner cases close_connection @logger.warn "#{@request.ip} - - #{e.class} #{e.backtrace.join("\n")}".yellow # :nocov: end end) end |
#receive_new_request ⇒ Object
Logic of receiving new request
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/midori/server.rb', line 57 def receive_new_request begin start_time = Time.now @response = @api.receive(request, self) now_time = Time.now @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 call_event(:open) if @request.websocket? rescue Midori::Exception::NotFound => e @response = Midori::Sandbox.capture(e) rescue => e @response = Midori::Sandbox.capture(e) @logger.error e.inspect.red @logger.warn e.backtrace.join("\n").yellow end unless @request.websocket? || @request.eventsource? send_data @response proceed_keep_alive end end |
#server_initialize(api, logger) ⇒ Object
Define server behaviour
17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/midori/server.rb', line 17 def server_initialize(api, logger) @api = api @logger = logger @request = Midori::Request.new @websocket = Midori::WebSocket.new(self) @eventsource = Midori::EventSource.new(self) # Add keep-alive parameters @keep_alive_timer = nil @keep_alive_count = 1 end |
#websocket_request(data) ⇒ Object
Logic of receiving WebSocket request
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/midori/server.rb', line 80 def websocket_request(data) @websocket.decode(data) case @websocket.opcode when 0x1, 0x2 call_event(:message, [@websocket.msg]) when 0x9 @websocket.pong(@websocket.msg) call_event(:ping) when 0xA call_event(:pong) end rescue Midori::Exception::FrameEnd => _e call_event(:close) send_data "\b" # Opcode 0x8 close_connection_after_writing rescue Midori::Exception::PingPongSizeTooLarge => e @logger.warn e.inspect.yellow call_event(:error) # Too large ping request send_data "\b" # Opcode 0x8 close_connection_after_writing rescue => e call_event(:error) @logger.error e.inspect.red @logger.warn e.backtrace.join("\n").yellow close_connection_after_writing end |