Class: RubyHome::HAP::Server

Inherits:
WEBrick::HTTPServer
  • Object
show all
Defined in:
lib/ruby_home/hap/server.rb

Instance Method Summary collapse

Instance Method Details

#run(sock) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/ruby_home/hap/server.rb', line 4

def run(sock)
  session = Session.new(sock)

  while true
    req = HAPRequest.new(@config, session: session)
    res = HAPResponse.new(@config)
    begin
      while true
        break if sock.to_io.wait_readable(0.5)
        break if @status != :Running
      end
      raise ::WEBrick::HTTPStatus::EOFError if @status != :Running
      raise ::WEBrick::HTTPStatus::EOFError if sock.eof?

      req.parse(session.parse)

      res.request_method = req.request_method
      res.request_uri = req.request_uri
      res.request_http_version = req.http_version
      res.keep_alive = req.keep_alive?

      service(req, res)
    rescue ::WEBrick::HTTPStatus::EOFError, ::WEBrick::HTTPStatus::RequestTimeout => ex
      res.set_error(ex)
    rescue ::WEBrick::HTTPStatus::Error => ex
      @logger.error(ex.message)
      res.set_error(ex)
    rescue ::WEBrick::HTTPStatus::Status => ex
      res.status = ex.code
    rescue StandardError => ex
      @logger.error(ex)
      res.set_error(ex, true)
    ensure
      if req.request_line
        if req.keep_alive? && res.keep_alive?
          req.fixup()
        end
        res.send_response(session)
        access_log(@config, req, res)
      end
    end
    break unless req.keep_alive?
    break unless res.keep_alive?
  end
end