2025-10-26 22:26:14 +00:00
|
|
|
|
> Note that the primary hosting site for this package is
|
|
|
|
|
|
> https://khleedril.org/forge/dmbcs/micro-server.
|
2020-03-24 12:17:31 +00:00
|
|
|
|
|
|
|
|
|
|
# DMBCS Imbedded HTTP Server Library for C++
|
|
|
|
|
|
|
|
|
|
|
|
At DMBCS we like to do things in certain ways: all our code takes the form
|
2025-10-26 22:26:14 +00:00
|
|
|
|
of C++17 (or, lately, C++23) libraries built with cmake, providing
|
2020-03-24 12:17:31 +00:00
|
|
|
|
user interaction through HTTP/HTML5/CSS3/EcmaScript web interfaces. It is
|
|
|
|
|
|
thus a common requirement that our code links against a library of classes
|
|
|
|
|
|
which implement the HTML paradigm and provide the TCP/IP plumbing to allow
|
|
|
|
|
|
applications to easily take the form of self-contained web servers. At
|
|
|
|
|
|
DMBCS we use NGINX at top-level to coordinate the set of such
|
|
|
|
|
|
micro-servers which make up a complete web site.
|
|
|
|
|
|
|
2025-10-26 22:26:14 +00:00
|
|
|
|
The library has been under constant development for over twenty-five years
|
2020-03-24 12:17:31 +00:00
|
|
|
|
(yes, really), and in heavy production use. The code-base hasnʼt quite
|
|
|
|
|
|
been brought up to our expectations of full production-quality code yet
|
|
|
|
|
|
(it has always been a project on the side of other things), and so we
|
2025-10-26 22:26:14 +00:00
|
|
|
|
still regard it as beta-quality software.
|
2020-03-26 12:28:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
2025-10-27 16:06:43 +00:00
|
|
|
|
## Simplest example
|
|
|
|
|
|
|
|
|
|
|
|
The following is provided as the simplest code to demonstrate use of the
|
|
|
|
|
|
dmbcs-micro-server library, not to inform of any coding style or quality
|
|
|
|
|
|
system approach. We assume a standard GNU system with recent
|
|
|
|
|
|
`make`, `bash`, `gcc`, etc.
|
|
|
|
|
|
|
|
|
|
|
|
Start with the HTML file `calc.html`
|
|
|
|
|
|
|
|
|
|
|
|
```html
|
|
|
|
|
|
<html>
|
|
|
|
|
|
<head><title>Multiplier</title></head>
|
|
|
|
|
|
<body><h1>Multiplier</h1>
|
|
|
|
|
|
<form action="compute" method="GET" id="calc">
|
|
|
|
|
|
<input type="text" name="arg_1"/> x <input type="text" name="arg_2"/>
|
|
|
|
|
|
= <input type="text" id="result" value="[result/]"></input>
|
|
|
|
|
|
<br>
|
|
|
|
|
|
<input type="submit">CALCULATE</input>
|
|
|
|
|
|
</form>
|
|
|
|
|
|
</body>
|
|
|
|
|
|
</html>
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
And the C++ source file `calc.cc`
|
|
|
|
|
|
|
|
|
|
|
|
```c++
|
|
|
|
|
|
#include <dmbcs-micro-server.h>
|
|
|
|
|
|
|
|
|
|
|
|
using namespace DMBCS::Micro_Server;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* This function both serves up the basic HTML page, and
|
|
|
|
|
|
* performs the multiplication and injects the result into the
|
|
|
|
|
|
* HTML. */
|
|
|
|
|
|
void home_page (Query_String const &query, int const socket)
|
|
|
|
|
|
{
|
|
|
|
|
|
Hyper_Tags tags;
|
|
|
|
|
|
|
|
|
|
|
|
tags.add ("result",
|
|
|
|
|
|
query.get ("arg_1", 0) * query.get ("arg_2", 0));
|
|
|
|
|
|
|
|
|
|
|
|
Http_Server::return_html (socket,
|
|
|
|
|
|
substitute (tags,
|
|
|
|
|
|
slurp_file ("calc.html")));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int main ()
|
|
|
|
|
|
{
|
|
|
|
|
|
auto server = Http_Server {2022,
|
|
|
|
|
|
{ {"", home_page},
|
|
|
|
|
|
{"compute", home_page} }};
|
|
|
|
|
|
|
|
|
|
|
|
for (;;) tick (server, 1000000);
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
then the `makefile`
|
|
|
|
|
|
|
|
|
|
|
|
CXXFLAGS = `pkg-config --cflags dmbcs-micro-server`
|
|
|
|
|
|
LDFLAGS = `pkg-config --libs dmbcs-micro-server`
|
|
|
|
|
|
|
|
|
|
|
|
Then at the command line type
|
|
|
|
|
|
|
|
|
|
|
|
make calc
|
|
|
|
|
|
./calc
|
|
|
|
|
|
|
|
|
|
|
|
then point a browser at `http://localhost:2022/` and use the simple
|
|
|
|
|
|
calculator (donʼt try to do anything funny: the code has been kept
|
|
|
|
|
|
deliberately simple and doesnʼt do any error checking). Note that an
|
|
|
|
|
|
answer can be obtained directly with a URL like
|
|
|
|
|
|
`http://localhost:2022/compute?arg_1=3&arg_2=4`.
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-03-24 12:17:31 +00:00
|
|
|
|
## Download
|
|
|
|
|
|
|
|
|
|
|
|
The *dmbcs-micro-server* source code is managed with *GIT* (configured
|
2025-10-26 22:26:14 +00:00
|
|
|
|
with *cmake*, built with *make* and a good C++23 compiler). Type
|
2020-03-24 12:17:31 +00:00
|
|
|
|
|
2025-10-26 22:26:14 +00:00
|
|
|
|
git clone http://khleedril.org/forge/dmbcs/micro-server dmbcs-micro-server
|
2020-03-24 12:17:31 +00:00
|
|
|
|
|
|
|
|
|
|
at the command line to obtain a copy.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Documentation
|
|
|
|
|
|
|
|
|
|
|
|
The documentation, as yet incomplete, comes with the source, and you can
|
2025-10-26 22:26:14 +00:00
|
|
|
|
also read it [https://khleedril.org/dmbcs/micro-server/documentation](here).
|
2020-03-24 12:17:31 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Contact
|
|
|
|
|
|
|
2025-10-26 22:26:14 +00:00
|
|
|
|
Please click [https://khleedril.org/dmbcs/contact](here) if you wish to send us
|
2020-03-24 12:17:31 +00:00
|
|
|
|
a message.
|
|
|
|
|
|
|
2025-10-26 22:26:14 +00:00
|
|
|
|
|
2020-03-24 12:17:31 +00:00
|
|
|
|
### Mailing list
|
|
|
|
|
|
|
|
|
|
|
|
If you would like to receive e-mail notices of matters arising about this
|
|
|
|
|
|
library, you may request this through the contact form.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Contribution to development
|
|
|
|
|
|
|
|
|
|
|
|
We will happily consider contributions to the source code if you provide
|
|
|
|
|
|
the address of a GIT repository we can pull from, and will consider all
|
|
|
|
|
|
bug reports and feature requests, although onward development of this
|
|
|
|
|
|
library is not a primary concern of ours.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Donations
|
|
|
|
|
|
|
|
|
|
|
|
If you use this application please consider a bitcoin donation if you
|
|
|
|
|
|
can. A small amount informs us that there is interest and that we are
|
|
|
|
|
|
providing a useful service to the community; it will keep us motivated to
|
|
|
|
|
|
continue to make open source software. Donations can be made by bitcoin to
|
2025-10-27 16:06:43 +00:00
|
|
|
|
the address 1PWHez4zT2xt6PoyuAwKPJsgRznAKwTtF9, or by Ethereum to
|
|
|
|
|
|
0xd306277ef68026a64bdd8c99ac7f19f21b3da6fb.
|