Class: Wsv::Server::Connection

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

Overview

Owns a single accepted client socket. ‘serve` runs the request lifecycle (parse → app → write → drain → close); `reject` writes 503 (when allowed) and closes. Both share the safe-write / drain / close primitives so a broken peer cannot leak a connection or mask errors.

Constant Summary collapse

DRAIN_TIMEOUT =
5

Instance Method Summary collapse

Constructor Details

#initialize(client, err:) ⇒ Connection

Returns a new instance of Connection.



16
17
18
19
# File 'lib/wsv/server/connection.rb', line 16

def initialize(client, err:)
  @client = client
  @err = err
end

Instance Method Details

#reject(reply:) ⇒ Object



45
46
47
48
49
# File 'lib/wsv/server/connection.rb', line 45

def reject(reply:)
  write(Response.text(503)) if reply
ensure
  graceful_close
end

#serve(app, read_timeout:) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/wsv/server/connection.rb', line 21

def serve(app, read_timeout:)
  reader = DeadlineReader.new(@client, Time.now + read_timeout)
  request = Request.parse(reader)
  case request
  when :empty
    nil
  when :malformed
    write(Response.text(400))
  else
    write(app.call(request))
  end
rescue Request::TooLarge => e
  write(Response.text(e.status_code))
rescue IO::TimeoutError
  write(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.text(400))
ensure
  graceful_close
end