23 #include <webview/server.h>
24 #include <webview/request_dispatcher.h>
25 #include <core/exception.h>
26 #include <core/exceptions/system.h>
27 #include <logging/logger.h>
29 #include <sys/socket.h>
33 #include <microhttpd.h>
56 __dispatcher = dispatcher;
60 __ssl_cert_mem = NULL;
62 __daemon = MHD_start_daemon(MHD_NO_FLAG,
66 WebRequestDispatcher::process_request_cb,
70 if ( __daemon == NULL ) {
84 const char *key_pem_filepath,
const char *cert_pem_filepath,
88 __dispatcher = dispatcher;
91 __ssl_key_mem = read_file(key_pem_filepath);
92 __ssl_cert_mem = read_file(cert_pem_filepath);
94 __daemon = MHD_start_daemon(MHD_USE_SSL,
98 WebRequestDispatcher::process_request_cb,
100 MHD_OPTION_HTTPS_MEM_KEY, __ssl_key_mem,
101 MHD_OPTION_HTTPS_MEM_CERT, __ssl_cert_mem,
104 if ( __daemon == NULL ) {
112 WebServer::~WebServer()
114 MHD_stop_daemon(__daemon);
118 if (__ssl_key_mem) free(__ssl_key_mem);
119 if (__ssl_cert_mem) free(__ssl_cert_mem);
128 WebServer::read_file(
const char *filename)
130 FILE *f = fopen(filename,
"rb");
136 if ((fseek(f, 0, SEEK_END) != 0) || ((size = ftell(f)) == 1)) {
138 throw Exception(
"Cannot determine file size of %s", filename);
140 fseek(f, 0, SEEK_SET);
144 throw Exception(
"File %s has zero length", filename);
145 }
else if (size > 1024 * 1024) {
148 throw Exception(
"File %s is unexpectedly large", filename);
151 char *rv = (
char *)malloc(size);
152 if (fread(rv, size, 1, f) != 1) {
156 throw FileReadException(filename, terrno);
172 __dispatcher->setup_basic_auth(realm, verifier);
182 fd_set read_fd, write_fd, except_fd;
184 FD_ZERO(&read_fd); FD_ZERO(&write_fd); FD_ZERO(&except_fd);
185 if ( MHD_get_fdset(__daemon, &read_fd, &write_fd, &except_fd, &max_fd) != MHD_YES ) {
187 __logger->log_warn(
"WebviewThread",
"Could not get microhttpd fdsets");
190 select(max_fd + 1, &read_fd, &write_fd, &except_fd, NULL);