1#include <microhttpd.h>
2#include <time.h>
3#include <string.h>
4#include <stdio.h>
5#include <err.h>
6
7#define PORT 8888
8
9double elapsed_format(clock_t start, clock_t end, char **o_unit);
10enum MHD_Result router(void *cls,
11 struct MHD_Connection *conn,
12 const char *url,
13 const char *method,
14 const char *version,
15 const char *upload_data,
16 size_t *upload_data_size,
17 void **con_cls);
18
19int main() {
20 struct MHD_Daemon *daemon =
21 MHD_start_daemon(MHD_USE_EPOLL_INTERNAL_THREAD,
22 PORT, NULL, NULL, &router, NULL, MHD_OPTION_END);
23 if (NULL == daemon) return 1;
24
25 printf("Server started at: http://localhost:%d\nPress any key to exit...\n", PORT);
26 getchar();
27
28 MHD_stop_daemon(daemon);
29 return 0;
30}
31
32enum MHD_Result router(void *cls, struct MHD_Connection *conn, const char *url,
33 const char *method, const char *version,
34 const char *upload_data, size_t *upload_data_size,
35 void **con_cls) {
36 clock_t start = clock();
37
38 const char *page = "<html><body>Hello, browser!</body></html>";
39 struct MHD_Response *response = MHD_create_response_from_buffer(
40 strlen(page), (void *)page, MHD_RESPMEM_PERSISTENT);
41
42 MHD_set_response_options(response, MHD_RF_SEND_KEEP_ALIVE_HEADER);
43 enum MHD_Result ret = MHD_queue_response(conn, MHD_HTTP_OK, response);
44 MHD_destroy_response(response);
45
46 clock_t end = clock();
47 char *unit;
48 double period = elapsed_format(start, end, &unit);
49 printf("%s [%.2f%s] %s\n", method, period, unit, url);
50
51 return ret;
52}
53
54char *second_s = "s";
55char *millisecond_s = "ms";
56char *microsecond_s = "μs";
57
58double elapsed_format(clock_t start, clock_t end, char **o_unit) {
59 double s = ((double)(end - start)) / CLOCKS_PER_SEC;
60
61 if (s >= 1)
62 *o_unit = second_s;
63 else if ((s *= 1000) >= 1)
64 *o_unit = millisecond_s;
65 else {
66 s *= 1000;
67 *o_unit = microsecond_s;
68 }
69
70 return s;
71}
c
See Also