http_wrapper.pl -- Server processing of an HTTP request
Most code doesn't need to use this directly; instead use library(http/http_server), which combines this library with the typical HTTP libraries that most servers need.
This library provides the core of the implementation of the HTTP
protocol at the server side and is mainly intended for internal use.
It is used by library(thread_httpd)
and library(inet_httpd)
(deprecated).
Still, it provides a few predicates that are occasinally useful for applications:
- http_current_request/1 finds the current request for occasional usage in places where it is not avaialable otherwise.
- http_peer/2 finds the (IP4) peer address, getting the original
address if we are behind a proxy (
X-Forwarded-For
) - http_relative_path/2 can be used to find a relative path from the current request.
- http_wrapper(:Goal, +In, +Out, -Close, +Options) is det
- Simple wrapper to read and decode an HTTP header from `In', call
:Goal while watching for exceptions and send the result to the
stream `Out'.
The goal is assumed to write the reply to
current_output
preceeded by an HTTP header, closed by a blank line. The header must contain a Content-type: <type> line. It may optionally contain a lineTransfer-encoding: chunked
to request chunked encoding.Options:
- request(-Request)
- Return the full request to the caller
- peer(+Peer)
- IP address of client
- http_wrap_spawned(:Goal, -Request, -Close) is det
- Internal use only. Helper for wrapping the handler for http_spawn/2.
- http_spawned(+ThreadId)
- Internal use only. Indicate that the request is handed to thread ThreadId.
- cgi_hook(+Event, +CGI) is det
- Hook called from the CGI processing stream. See http_stream.pl for details.
- http_send_header(+Header)
- This API provides an alternative for writing the header field as a CGI header. Header has the format Name(Value), as produced by http_read_header/2.
- http_current_request(-Request) is semidet
- Returns the HTTP request currently being processed. Fails silently if there is no current request. This typically happens if a goal is run outside the HTTP server context.
- http_peer(+Request, -PeerIP:atom) is semidet
- True when PeerIP is the IP address of the connection peer. If the
connection is established via a proxy or CDN we try to find the
initiating peer. Currently supports:
Fastly-client-ip
X-real-ip
X-forwarded-for
- Direct connections
- http_relative_path(+AbsPath, -RelPath) is det
- Convert an absolute path (without host, fragment or search) into a path relative to the current page. This call is intended to create reusable components returning relative paths for easier support of reverse proxies.