mirror of
https://github.com/zigzap/zap.git
synced 2025-10-20 15:14:08 +00:00
131 lines
4.2 KiB
C
131 lines
4.2 KiB
C
/**
|
|
In this a Hello World example using the bundled HTTP / WebSockets extension.
|
|
|
|
Compile using:
|
|
|
|
NAME=http make
|
|
|
|
Or test the `poll` engine's performance by compiling with `poll`:
|
|
|
|
FIO_POLL=1 NAME=http make
|
|
|
|
Run with:
|
|
|
|
./tmp/http -t 1
|
|
|
|
Benchmark with keep-alive:
|
|
|
|
ab -c 200 -t 4 -n 1000000 -k http://127.0.0.1:3000/
|
|
wrk -c200 -d4 -t1 http://localhost:3000/
|
|
|
|
Benchmark with higher load:
|
|
|
|
ab -c 4400 -t 4 -n 1000000 -k http://127.0.0.1:3000/
|
|
wrk -c4400 -d4 -t1 http://localhost:3000/
|
|
*/
|
|
|
|
/* include the core library, without any extensions */
|
|
#include <fio.h>
|
|
|
|
#include <fio_cli.h>
|
|
#include <http.h>
|
|
|
|
/* defined later */
|
|
void initialize_cli(int argc, char const *argv[]);
|
|
|
|
/* *****************************************************************************
|
|
HTTP request / response handling
|
|
***************************************************************************** */
|
|
|
|
static void on_http_request(http_s *h) {
|
|
/* set a response and send it (finnish vs. destroy). */
|
|
http_send_body(h, "Hello World!", 12);
|
|
}
|
|
|
|
/* *****************************************************************************
|
|
The main function
|
|
***************************************************************************** */
|
|
|
|
int main(int argc, char const *argv[]) {
|
|
initialize_cli(argc, argv);
|
|
/* listen for inncoming connections */
|
|
if (http_listen(fio_cli_get("-p"), fio_cli_get("-b"),
|
|
.on_request = on_http_request,
|
|
.max_body_size = fio_cli_get_i("-maxbd"),
|
|
.public_folder = fio_cli_get("-public"),
|
|
.log = fio_cli_get_bool("-log"),
|
|
.timeout = fio_cli_get_i("-keep-alive")) == -1) {
|
|
/* listen failed ?*/
|
|
perror(
|
|
"ERROR: facil.io couldn't initialize HTTP service (already running?)");
|
|
exit(1);
|
|
}
|
|
fio_start(.threads = fio_cli_get_i("-t"), .workers = fio_cli_get_i("-w"));
|
|
return 0;
|
|
}
|
|
|
|
/* *****************************************************************************
|
|
CLI helpers
|
|
***************************************************************************** */
|
|
void initialize_cli(int argc, char const *argv[]) {
|
|
/* **** Command line arguments **** */
|
|
fio_cli_start(
|
|
argc, argv, 0, 0, NULL,
|
|
// Address Binding arguments
|
|
FIO_CLI_PRINT_HEADER("Address Binding:"),
|
|
FIO_CLI_INT("-port -p port number to listen to. defaults port 3000"),
|
|
"-bind -b address to listen to. defaults any available.",
|
|
// Concurrency arguments
|
|
FIO_CLI_PRINT_HEADER("Concurrency:"),
|
|
FIO_CLI_INT("-workers -w number of processes to use."),
|
|
FIO_CLI_INT("-threads -t number of threads per process."),
|
|
// HTTP Settings arguments
|
|
FIO_CLI_PRINT_HEADER("HTTP Settings:"),
|
|
"-public -www public folder, for static file service.",
|
|
FIO_CLI_INT(
|
|
"-keep-alive -k HTTP keep-alive timeout (0..255). default: 10s"),
|
|
FIO_CLI_INT(
|
|
"-max-body -maxbd HTTP upload limit in Mega Bytes. default: 50Mb"),
|
|
FIO_CLI_BOOL("-log -v request verbosity (logging)."),
|
|
// WebSocket Settings arguments
|
|
FIO_CLI_PRINT_HEADER("WebSocket Settings:"),
|
|
FIO_CLI_INT("-ping websocket ping interval (0..255). default: 40s"),
|
|
FIO_CLI_INT("-max-msg -maxms incoming websocket message "
|
|
"size limit in Kb. default: 250Kb"),
|
|
"-redis -r an optional Redis URL server address.",
|
|
FIO_CLI_PRINT("\t\ta valid Redis URL would follow the pattern:"),
|
|
FIO_CLI_PRINT("\t\t\tredis://user:password@localhost:6379/"));
|
|
|
|
/* Test and set any default options */
|
|
if (!fio_cli_get("-p")) {
|
|
/* Test environment as well */
|
|
char *tmp = getenv("PORT");
|
|
if (!tmp)
|
|
tmp = "3000";
|
|
/* Set default (unlike cmd line arguments, aliases are manually set) */
|
|
fio_cli_set("-p", tmp);
|
|
fio_cli_set("-port", tmp);
|
|
}
|
|
if (!fio_cli_get("-b")) {
|
|
char *tmp = getenv("ADDRESS");
|
|
if (tmp) {
|
|
fio_cli_set("-b", tmp);
|
|
fio_cli_set("-bind", tmp);
|
|
}
|
|
}
|
|
if (!fio_cli_get("-public")) {
|
|
char *tmp = getenv("HTTP_PUBLIC_FOLDER");
|
|
if (tmp) {
|
|
fio_cli_set("-public", tmp);
|
|
fio_cli_set("-www", tmp);
|
|
}
|
|
}
|
|
|
|
if (!fio_cli_get("-public")) {
|
|
char *tmp = getenv("REDIS_URL");
|
|
if (tmp) {
|
|
fio_cli_set("-redis-url", tmp);
|
|
fio_cli_set("-ru", tmp);
|
|
}
|
|
}
|
|
}
|