Class: Wsv::Server::Connection
- Inherits:
-
Object
- Object
- Wsv::Server::Connection
- 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
-
#initialize(client, err:, cors: nil) ⇒ Connection
constructor
A new instance of Connection.
- #reject(reply:) ⇒ Object
- #serve(app, read_timeout:) ⇒ Object
Constructor Details
#initialize(client, err:, cors: nil) ⇒ Connection
Returns a new instance of Connection.
16 17 18 19 20 |
# File 'lib/wsv/server/connection.rb', line 16 def initialize(client, err:, cors: nil) @client = client @err = err @cors = cors end |
Instance Method Details
#reject(reply:) ⇒ Object
46 47 48 49 50 |
# File 'lib/wsv/server/connection.rb', line 46 def reject(reply:) write(Response.text(503)) if reply ensure graceful_close end |
#serve(app, read_timeout:) ⇒ Object
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/wsv/server/connection.rb', line 22 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.}" write(Response.text(400)) ensure graceful_close end |