Class: Quicsilver::Server::RequestHandler

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

Constant Summary collapse

SAFE_METHODS =
%w[GET HEAD OPTIONS].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app:, configuration:, request_registry:, cancelled_streams:, cancelled_mutex:) ⇒ RequestHandler

Returns a new instance of RequestHandler.



10
11
12
13
14
15
16
# File 'lib/quicsilver/server/request_handler.rb', line 10

def initialize(app:, configuration:, request_registry:, cancelled_streams:, cancelled_mutex:)
  @configuration = configuration
  @request_registry = request_registry
  @cancelled_streams = cancelled_streams
  @cancelled_mutex = cancelled_mutex
  @adapter = Protocol::Adapter.new(app)
end

Instance Attribute Details

#adapterObject (readonly)

Returns the value of attribute adapter.



8
9
10
# File 'lib/quicsilver/server/request_handler.rb', line 8

def adapter
  @adapter
end

Instance Method Details

#call(connection, stream, early_data: false) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/quicsilver/server/request_handler.rb', line 18

def call(connection, stream, early_data: false)
  request = parse_request(connection, stream, early_data: early_data)
  return unless request

  response = @adapter.call(request)

  send_response(connection, stream, request, response)
rescue Server::DrainTimeoutError
  Quicsilver.logger.debug("Request interrupted by drain: stream #{stream.stream_id}")
rescue Protocol::FrameError => e
  Quicsilver.logger.error("Frame error: #{e.message} (0x#{e.error_code.to_s(16)})")
  Quicsilver.connection_shutdown(connection.handle, e.error_code, false) rescue nil
rescue Protocol::MessageError => e
  Quicsilver.logger.error("Message error: #{e.message} (0x#{e.error_code.to_s(16)})")
  Quicsilver.stream_reset(stream.stream_handle, e.error_code) if stream.writable?
rescue => e
  Quicsilver.logger.error("Error handling request: #{e.class} - #{e.message}")
  Quicsilver.logger.debug(e.backtrace.first(5).join("\n"))
  connection.send_error(stream, 500, "Internal Server Error") if stream.writable?
ensure
  @request_registry.complete(stream.stream_id) if @request_registry.include?(stream.stream_id)
  @cancelled_mutex.synchronize { @cancelled_streams.delete(stream.stream_id) }
end