PublicShow -- Threaded HTTP server

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 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.

Source 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 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.
Affects the message printed while the server is started. Interpreted as a URI relative to the server root.
If provided, use this socket instead of the creating one and binding it to an address. The socket must be bound to an address.
Determine the number of worker threads. Default is 5. This is fine for small scale usage. Public servers typically need a higher number.
Maximum 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.
Time to keep `Keep alive' connections alive. Default is 2 seconds.
Stack limit to use for the workers. The default is inherited from the main thread. If you need to control resource usage you may consider the spawn option of http_handler/3 and library(thread_pool).
If true (default false), do not print an informational message that the server was started.

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.

Source http_requeue(Arg1)
Source http_close_connection(Arg1)
Source http_enough_workers(Arg1, Arg2, Arg3)
Source http_spawn(Arg1, Arg2)
Source http_stop_server(Arg1, Arg2)
Source http_current_worker(Arg1, Arg2)
Source http_add_worker(Arg1, Arg2)
Source http_workers(Arg1, Arg2)
Source http_server_property(Arg1, Arg2)
Source http_current_server(Arg1, Arg2)