Class: Wsv::Server

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

Defined Under Namespace

Classes: 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) ⇒ Server

Returns a new instance of Server.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/wsv/server.rb', line 16

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

Instance Attribute Details

#hostObject (readonly)

Returns the value of attribute host.



14
15
16
# File 'lib/wsv/server.rb', line 14

def host
  @host
end

#portObject (readonly)

Returns the value of attribute port.



14
15
16
# File 'lib/wsv/server.rb', line 14

def port
  @port
end

#rootObject (readonly)

Returns the value of attribute root.



14
15
16
# File 'lib/wsv/server.rb', line 14

def root
  @root
end

Instance Method Details

#handle(client) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/wsv/server.rb', line 53

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
  @err.puts "wsv: #{e.class}: #{e.message}"
  write_response(client, Response.text(400))
ensure
  graceful_close(client)
end

#startObject



38
39
40
41
42
43
44
45
46
# File 'lib/wsv/server.rb', line 38

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

#stopObject



48
49
50
51
# File 'lib/wsv/server.rb', line 48

def stop
  @running = false
  close
end