Qeweney - add water, makes its own sauce!
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