Class: Sujiko::Server

Inherits:
Object
  • Object
show all
Defined in:
lib/sujiko/server.rb

Constant Summary collapse

DEFAULT_PORT =
4567
MAX_REQUEST_HEADER_SIZE =
16_384
TEMPLATE =
File.expand_path("templates/index.html.erb", __dir__)

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.start(port: DEFAULT_PORT, public_origin: nil, out: $stdout, err: $stderr) ⇒ Object



15
16
17
18
# File 'lib/sujiko/server.rb', line 15

def self.start(port: DEFAULT_PORT, public_origin: nil, out: $stdout, err: $stderr)
  port = DEFAULT_PORT if port.nil?
  new(port, out, err, public_origin).start
end

Instance Method Details

#startObject



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
# File 'lib/sujiko/server.rb', line 20

def start
  port = resolve_port
  html = render_template(port:)
  base_url = "http://127.0.0.1:#{port}"
  body_utf8 = html.encode(Encoding::UTF_8)

  server = nil
  server = TCPServer.new("127.0.0.1", port)
  trap("INT") { server&.close }
  @out.puts "Sujiko: #{base_url} (Ctrl-C で停止)"
  try_open_browser(base_url, @err)

  loop do
    socket = server.accept
    begin
      handle_socket(socket, body_utf8)
    ensure
      socket.close
    end
  end
rescue Errno::EBADF, Errno::EINVAL, IOError
  # 終了: `accept` 中にソケットを閉じたあと
ensure
  server&.close
end