Qeweney - add water, makes its own sauce!

Gem Version
Modulation Test
MIT licensed

Cross-library HTTP request / response API for servers

Qeweney provides a uniform API for dealing with HTTP requests and responses on
the server side. Qeweney defines a uniform adapter interface that allows
handling incoming HTTP requests and sending HTTP responses over any protocol or
transport, be it HTTP/1, HTTP/2 or a Rack interface.

Qeweney is primarily designed to work with
Tipi, but can also be used directly
inside Rack apps, or to drive Rack apps.

Features

  • Works with different web server APIs, notably Tipi, Digital Fabric, and Rack.
  • Transport-agnostic.
  • High-performance routing API inspired by Roda.
  • Rich API for extracting data from HTTP requests: form parsing, cookies, file uploads, etc.
  • Rich API for constructing HTTP responses: streaming responses, HTTP upgrades, static file serving, delate and gzip encoding, caching etc.
  • Suitable for both blocking and non-blocking concurrency models.
  • Allows working with request before request body is read and parsed.

Overview

In Qeweney, the main class developers will interact with is Qeweney::Request,
which encapsulates an HTTP request (from the server’s point of view), and offers
an API for extracting request information and responding to that request.

A request is always associated with an adapter, an object that implements the
Qeweney adapter interface, and that allows reading request bodies (for uploads
and form submissions) and sending responses.

The Qeweney Adapter Interface

class AdapterInterface
  # Reads a chunk from the request body
  # @req [Qeweney::Request] request for which the chunk is to be read
  def get_body_chunk(req)
  end

  # Send a non-streaming response
  # @req [Qeweney::Request] request for which the response is sent
  # @body [String, nil] response body
  # @headers [Hash] response headers
  def respond(req, body, headers)
  end

  # Send only headers
  # @req [Qeweney::Request] request for which the response is sent
  # @headers [Hash] response headers
  # @empty_response [boolean] whether response is empty
  def send_headers(req, headers, empty_response: nil)
  end

  # Send a body chunk (this implies chunked transfer encoding)
  # @req [Qeweney::Request] request for which the response is sent
  # @body [String, nil] chunk
  # @done [boolean] whether response is finished
  def send_chunk(req, body, done: false)
  end

  # Finishes response
  # @req [Qeweney::Request] request for which the response is sent
  def finish(req)
  end
end