class Async::HTTP::Protocol::HTTP2::Server

Attributes

requests[R]

Public Class Methods

new(stream) click to toggle source
# File lib/async/http/protocol/http2/server.rb, line 35
def initialize(stream)
        # Used by some generic methods in Connetion:
        @stream = stream
        
        framer = ::Protocol::HTTP2::Framer.new(stream)
        
        super(framer)
        
        @requests = Async::Queue.new
end

Public Instance Methods

accept_stream(stream_id) click to toggle source
Calls superclass method
# File lib/async/http/protocol/http2/server.rb, line 48
def accept_stream(stream_id)
        super do
                Request::Stream.create(self, stream_id)
        end
end
close(error = nil) click to toggle source
# File lib/async/http/protocol/http2/server.rb, line 54
def close(error = nil)
        if @requests
                # Stop the request loop:
                @requests.enqueue(nil)
                @requests = nil
        end
        
        super
end
each(task: Task.current) { |request| ... } click to toggle source
# File lib/async/http/protocol/http2/server.rb, line 64
def each(task: Task.current)
        task.annotate("Reading #{version} requests for #{self.class}.")
        
        # It's possible the connection has died before we get here...
        @requests&.async do |task, request|
                task.annotate("Incoming request: #{request.method} #{request.path.inspect}.")
                
                @count += 1
                
                begin
                        response = yield(request)
                rescue
                        # We need to close the stream if the user code blows up while generating a response:
                        request.stream.send_reset_stream(::Protocol::HTTP2::INTERNAL_ERROR)
                        
                        raise
                else
                        request.send_response(response)
                end
        end
        
        # Maybe we should add some synchronisation here - i.e. only exit once all requests are finished.
end