Class: Wsv::Server

Inherits:
Object
  • Object
show all
Defined in:
lib/wsv/server.rb,
lib/wsv/server/banner.rb,
lib/wsv/server/deadline_reader.rb,
lib/wsv/server/browser_launcher.rb

Defined Under Namespace

Classes: Banner, BrowserLauncher, DeadlineReader

Constant Summary collapse

DEFAULT_READ_TIMEOUT =
10
DEFAULT_MAX_CONNECTIONS =
8
DRAIN_TIMEOUT =
5

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(host:, port:, root:, out: $stdout, err: $stderr, read_timeout: DEFAULT_READ_TIMEOUT, max_connections: DEFAULT_MAX_CONNECTIONS, tls: nil, spa: false, open: false, cors: false) ⇒ Server

Returns a new instance of Server.



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

def initialize(
  host:,
  port:,
  root:,
  out: $stdout,
  err: $stderr,
  read_timeout: DEFAULT_READ_TIMEOUT,
  max_connections: DEFAULT_MAX_CONNECTIONS,
  tls: nil,
  spa: false,
  open: false,
  cors: false
)
  @host = host
  @port = port
  @root = File.realpath(root)
  @out = out
  @err = err
  @read_timeout = read_timeout
  @max_connections = max_connections
  @tls = tls
  @ssl_context = tls&.to_ssl_context
  @open = open
  @app = App.new(@root, spa: spa, cors: cors)
  @running = false
  @mutex = Mutex.new
  @active = 0
end

Instance Attribute Details

#hostObject (readonly)

Returns the value of attribute host.



18
19
20
# File 'lib/wsv/server.rb', line 18

def host
  @host
end

#portObject (readonly)

Returns the value of attribute port.



18
19
20
# File 'lib/wsv/server.rb', line 18

def port
  @port
end

#rootObject (readonly)

Returns the value of attribute root.



18
19
20
# File 'lib/wsv/server.rb', line 18

def root
  @root
end

Instance Method Details

#handle(client) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/wsv/server.rb', line 65

def handle(client)
  reader = DeadlineReader.new(client, Time.now + @read_timeout)
  request = Request.parse(reader)
  case request
  when :empty
    nil
  when :malformed
    write_response(client, Response.text(400))
  else
    write_response(client, @app.call(request))
  end
rescue Request::TooLarge => e
  write_response(client, Response.text(e.status_code))
rescue IO::TimeoutError
  write_response(client, Response.text(408))
rescue StandardError => e
  # Treat unmapped failures as connection-scoped and close with 400 rather
  # than letting one bad request path bring down the server.
  @err.puts "wsv: #{e.class}: #{e.message}"
  write_response(client, Response.text(400))
ensure
  graceful_close(client)
end

#startObject



49
50
51
52
53
54
55
56
57
58
# File 'lib/wsv/server.rb', line 49

def start
  @server = TCPServer.new(host, port)
  @running = true
  log_startup
  trap_signals
  open_in_browser if @open
  accept_loop
ensure
  close
end

#stopObject



60
61
62
63
# File 'lib/wsv/server.rb', line 60

def stop
  @running = false
  close
end