1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
/**
* @file httpd.c Webserver UI module
*
* Copyright (C) 2010 Creytiv.com
*/
#include <re.h>
#include <baresip.h>
static struct http_sock *httpsock;
static int html_print_head(struct re_printf *pf, void *unused)
{
(void)unused;
return re_hprintf(pf,
"<html>\n"
"<head>\n"
"<title>Baresip v" BARESIP_VERSION "</title>\n"
"</head>\n");
}
static int html_print_cmd(struct re_printf *pf, const struct http_msg *req)
{
struct pl params;
if (!pf || !req)
return EINVAL;
if (pl_isset(&req->prm)) {
params.p = req->prm.p + 1;
params.l = req->prm.l - 1;
}
else {
params.p = "h";
params.l = 1;
}
return re_hprintf(pf,
"%H"
"<body>\n"
"<pre>\n"
"%H"
"</pre>\n"
"</body>\n"
"</html>\n",
html_print_head, NULL,
ui_input_pl, ¶ms);
}
static void http_req_handler(struct http_conn *conn,
const struct http_msg *msg, void *arg)
{
(void)arg;
if (0 == pl_strcasecmp(&msg->path, "/")) {
http_creply(conn, 200, "OK",
"text/html;charset=UTF-8",
"%H", html_print_cmd, msg);
}
else {
http_ereply(conn, 404, "Not Found");
}
}
static int module_init(void)
{
struct sa laddr;
int err;
if (conf_get_sa(conf_cur(), "http_listen", &laddr)) {
sa_set_str(&laddr, "0.0.0.0", 8000);
}
err = http_listen(&httpsock, &laddr, http_req_handler, NULL);
if (err)
return err;
info("httpd: listening on %J\n", &laddr);
return 0;
}
static int module_close(void)
{
httpsock = mem_deref(httpsock);
return 0;
}
EXPORT_SYM const struct mod_export DECL_EXPORTS(httpd) = {
"httpd",
"application",
module_init,
module_close,
};
|