libweb
is a simple and lightweight implementation of a web server, written in
C99 plus POSIX.1-2008 extensions, that can be integrated into applications.
Intentionally, libweb
does not share some of the philosophical views from the
suckless project. However, it still strives towards
portability, minimalism, simplicity and efficiency.
- Small and portable HTTP/1.1 server implementation, with support for
GET
andPOST
. - Provides a interface to set up user-defined callbacks depending on the operation (see example below).
- Transport-agnostic implementation.
- While a POSIX socket, TCP-based implementation is already provided, the HTTP interface can be mapped to any other reliable transport layer.
- Supports
multiform/form-data
, which makes it useful to transfer large amounts of data, such as binary files. - A library to write HTML programmatically.
In order to maintain simplicity and reduce the risk for security bugs, libweb
does not implement TLS support. Instead, this should be provided by a
reverse proxy, such as caddy
.
libweb
does not require root permissions. So, in order to avoid the
risk for security bugs, please do not run libweb
as root
.
- A POSIX environment.
dynstr
(provided as agit
submodule).- CMake (optional).
sudo apt install build-essential
sudo apt install cmake
Two build environments are provided for libweb
- feel free to choose any of
them:
- A mostly POSIX-compliant
Makefile
. - A
CMakeLists.txt
.
libweb
can be built using the standard build process:
$ make
This would generate a static library, namely libweb.a
, on the project
top-level directory. Applications can then call the top-level Makefile
by
the use of recursive make
. For example, assuming libweb
is contained on a
subdirectory:
libweb/libweb.a:
+cd libweb && $(MAKE)
Additionally, libweb
can be installed using the install
target. A
custom prefix can be assigned via the PREFIX
variable:
$ make PREFIX=$HOME/libweb-prefix install
By default, PREFIX
is assigned to /usr/local
.
$ mkdir build/
$ cd build/
$ cmake ..
$ cmake --build .
A CMake target, also called libweb
, is created. This makes it possible
to integrate libweb
into CMake projects via add_subdirectory
and
target_link_libraries
. For example:
project(example)
add_executable(${PROJECT_NAME} main.c)
add_subdirectory(libweb)
target_link_libraries(${PROJECT_NAME} PRIVATE libweb)
Additionally, libweb
can be installed using the standard procedure
in CMake. As usual, a custom prefix can be assigned via the
CMAKE_INSTALL_PREFIX
variable:
$ cmake --install build/ -DCMAKE_INSTALL_PREFIX=$HOME/libweb-prefix
A directory with examples shows how libweb
can be used by
applications. These can be built from the top-level directory with:
$ make examples
In the case of CMake builds, examples are built by default. This can be turned
off by assigning BUILD_EXAMPLES
to OFF
or 0
:
$ mkdir build/
$ cd build/
$ cmake .. -DBUILD_EXAMPLES=OFF
$ cmake --build .
Originally, libweb
was part of the
slcl
project, a lightweight
cloud solution also written in C99 plus POSIX extensions. However, there
always was a clear separation between application logic and the underlying
HTTP/1.1 server implementation and other surrounding utilities.
Therefore, it made sense to keep all these components on a separate
repository that slcl
could depend on. Additionally, this would also
benefit other applications interested in this implementation.
- Popular web server implementations, such as
apache
ornginx
are standalone applications that can be configured to run other applications in order to generate dynamic content, via a standard interface called Common Gateway Interface , or CGI for short.- However, those are vastly complex tools with many features and
options, whereas simplicity was one of the key design goals for
slcl
. - Additionally, tools such as
apache
ornginx
place configuration files into/etc
, which makes it harder to run multiple instances on the same machine. While not a strict requirement fromslcl
, it was desirable to keep configuration as simple as possible for administrators.
- However, those are vastly complex tools with many features and
options, whereas simplicity was one of the key design goals for
- The
onion
project, which does follow the HTTP library concept, was initially considered forslcl
, but has a larger scope thanlibweb
, and again simplicity was essential forslcl
. - And, after all, it was a good excuse to learn about HTTP/1.1.
libweb, a simple and lightweight web framework.
Copyright (C) 2023 libweb contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also, see LICENSE
.