
thread_httpd.pl -- Threaded HTTP server
This library defines the HTTP server frontend of choice for SWI-Prolog. It is based on the multi-threading capabilities of SWI-Prolog and thus exploits multiple cores to serve requests concurrently. The server scales well and can cooperate with library(thread_pool) to control the number of concurrent requests of a given type. For example, it can be configured to handle 200 file download requests concurrently, 2 requests that potentially uses a lot of memory and 8 requests that use a lot of CPU resources.
On Unix systems, this library can be combined with library(http/http_unix_daemon) to realise a proper Unix service process that creates a web server at port 80, runs under a specific account, optionally detaches from the controlling terminal, etc.
Combined with library(http/http_ssl_plugin) from the SSL package, this library can be used to create an HTTPS server. See <plbase>/doc/packages/examples/ssl/https for an example server using a self-signed SSL certificate.
http_server(:Goal, :Options) is det
- Create a server at Port that calls Goal for each parsed request.
Options provide a list of options. Defined options are
- port(?Address)
- Port to bind to. Address is either a port or a term Host:Port. The port may be a variable, causing the system to select a free port. See tcp_bind/2.
- tcp_socket(+Socket)
- If provided, use this socket instead of the creating one and binding it to an address. The socket must be bound to an address.
- workers(+Count)
- Determine the number of worker threads. Default is 5. This is fine for small scale usage. Public servers typically need a higher number.
- timeout(+Seconds)
- Max time of inactivity trying to read the request after a connection has been opened. Default is 60 seconds. See set_stream/1 using the timeout option.
- keep_alive_timeout(+Seconds)
- Time to keep `Keep alive' connections alive. Default is 2 seconds.
- local(+Kbytes)
- global(+Kbytes)
- trail(+Kbytes)
- Stack sizes to use for the workers. The default is inherited
from the
main
thread. As of version 5.9 stacks are no longer pre-allocated and the given sizes only act as a limit. If you need to control resource usage look at thespawn
option of http_handler/3 and library(thread_pool).
A typical initialization for an HTTP server that uses http_dispatch/1 to relay requests to predicates is:
:- use_module(library(http/thread_httpd)). :- use_module(library(http/http_dispatch)). start_server(Port) :- http_server(http_dispatch, [port(Port)]).
Note that multiple servers can coexist in the same Prolog process. A notable application of this is to have both an HTTP and HTTPS server, where the HTTP server redirects to the HTTPS server for handling sensitive requests.
Undocumented predicates
The following predicates are exported, but not or incorrectly documented.