Fixed #128: added mjpg_streamer compatibility for --static

This commit is contained in:
Maxim Devaev
2021-10-16 22:30:54 +03:00
parent 4d5c5fffb4
commit 76329ba5a6

View File

@@ -25,6 +25,8 @@
static int _http_preprocess_request(struct evhttp_request *request, server_s *server); static int _http_preprocess_request(struct evhttp_request *request, server_s *server);
static int _http_check_run_compat_action(struct evhttp_request *request, void *v_server);
static void _http_callback_root(struct evhttp_request *request, void *v_server); static void _http_callback_root(struct evhttp_request *request, void *v_server);
static void _http_callback_static(struct evhttp_request *request, void *v_server); static void _http_callback_static(struct evhttp_request *request, void *v_server);
static void _http_callback_state(struct evhttp_request *request, void *v_server); static void _http_callback_state(struct evhttp_request *request, void *v_server);
@@ -220,41 +222,63 @@ static int _http_preprocess_request(struct evhttp_request *request, server_s *se
} \ } \
} }
static void _http_callback_root(struct evhttp_request *request, void *v_server) { static int _http_check_run_compat_action(struct evhttp_request *request, void *v_server) {
server_s *server = (server_s *)v_server; // MJPG-Streamer compatibility layer
PREPROCESS_REQUEST; struct evkeyvalq params;
int error = 0;
struct evkeyvalq params; // For mjpg-streamer compatibility
evhttp_parse_query(evhttp_request_get_uri(request), &params); evhttp_parse_query(evhttp_request_get_uri(request), &params);
const char *action = evhttp_find_header(&params, "action"); const char *action = evhttp_find_header(&params, "action");
if (action && !strcmp(action, "snapshot")) { if (action && !strcmp(action, "snapshot")) {
_http_callback_snapshot(request, v_server); _http_callback_snapshot(request, v_server);
goto ok;
} else if (action && !strcmp(action, "stream")) { } else if (action && !strcmp(action, "stream")) {
_http_callback_stream(request, v_server); _http_callback_stream(request, v_server);
} else { goto ok;
struct evbuffer *buf;
assert((buf = evbuffer_new()));
assert(evbuffer_add_printf(buf, "%s", HTML_INDEX_PAGE));
ADD_HEADER("Content-Type", "text/html");
evhttp_send_reply(request, HTTP_OK, "OK", buf);
evbuffer_free(buf);
} }
evhttp_clear_headers(&params); error = -1;
ok:
evhttp_clear_headers(&params);
return error;
}
#define COMPAT_REQUEST { \
if (_http_check_run_compat_action(request, v_server) == 0) { \
return; \
} \
}
static void _http_callback_root(struct evhttp_request *request, void *v_server) {
server_s *server = (server_s *)v_server;
PREPROCESS_REQUEST;
COMPAT_REQUEST;
struct evbuffer *buf;
assert((buf = evbuffer_new()));
assert(evbuffer_add_printf(buf, "%s", HTML_INDEX_PAGE));
ADD_HEADER("Content-Type", "text/html");
evhttp_send_reply(request, HTTP_OK, "OK", buf);
evbuffer_free(buf);
} }
static void _http_callback_static(struct evhttp_request *request, void *v_server) { static void _http_callback_static(struct evhttp_request *request, void *v_server) {
server_s *server = (server_s *)v_server; server_s *server = (server_s *)v_server;
PREPROCESS_REQUEST;
COMPAT_REQUEST;
struct evbuffer *buf = NULL; struct evbuffer *buf = NULL;
struct evhttp_uri *uri = NULL; struct evhttp_uri *uri = NULL;
char *decoded_path = NULL; char *decoded_path = NULL;
char *static_path = NULL; char *static_path = NULL;
int fd = -1; int fd = -1;
PREPROCESS_REQUEST;
{ {
char *uri_path; char *uri_path;
@@ -324,6 +348,8 @@ static void _http_callback_static(struct evhttp_request *request, void *v_server
} }
} }
#undef COMPAT_REQUEST
static void _http_callback_state(struct evhttp_request *request, void *v_server) { static void _http_callback_state(struct evhttp_request *request, void *v_server) {
server_s *server = (server_s *)v_server; server_s *server = (server_s *)v_server;