diff --git a/README.md b/README.md index 47ff9bb..eb004f2 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ | Streaming via UNIX domain socket | ![#00aa00](https://placehold.it/15/00aa00/000000?text=+) Yes | ![#f03c15](https://placehold.it/15/f03c15/000000?text=+) No | | Debug logs without recompiling,
performance statistics log,
access to HTTP streaming parameters | ![#00aa00](https://placehold.it/15/00aa00/000000?text=+) Yes | ![#f03c15](https://placehold.it/15/f03c15/000000?text=+) No | | Option to serve files
with a built-in HTTP server | ![#00aa00](https://placehold.it/15/00aa00/000000?text=+) Yes | ![#ffaa00](https://placehold.it/15/ffaa00/000000?text=+) Regular files only | -| Signaling about the stream state to GPIO using [libgpiod](https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/about) | ![#00aa00](https://placehold.it/15/00aa00/000000?text=+) Yes | ![#f03c15](https://placehold.it/15/f03c15/000000?text=+) No | +| Signaling about the stream state
on GPIO using [libgpiod](https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/about) | ![#00aa00](https://placehold.it/15/00aa00/000000?text=+) Yes | ![#f03c15](https://placehold.it/15/f03c15/000000?text=+) No | | Access to webcam controls (focus, servos)
and settings such as brightness via HTTP | ![#f03c15](https://placehold.it/15/f03c15/000000?text=+) No | ![#00aa00](https://placehold.it/15/00aa00/000000?text=+) Yes | Footnotes: @@ -58,6 +58,8 @@ Without arguments, ```ustreamer``` will try to open ```/dev/video0``` with 640x4 # ./ustreamer --device=/dev/video1 --host=0.0.0.0 --port=80 ``` +:exclamation: Please note that since µStreamer v2.0 cross-domain requests were disabled by default for [security reasons](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). To enable the old behavior, use the option `--allow-origin=\*`. + The recommended way of running µStreamer with [Auvidea B101](https://www.raspberrypi.org/forums/viewtopic.php?f=38&t=120702&start=400#p1339178) on Raspberry Pi: ```bash $ ./ustreamer \ @@ -69,7 +71,7 @@ $ ./ustreamer \ --drop-same-frames=30 # Save the traffic ``` -Please note that to use `--drop-same-frames` for different browsers you need to use some specific URL `/stream` parameters (see URL `/` for details). +:exclamation: Please note that to use `--drop-same-frames` for different browsers you need to use some specific URL `/stream` parameters (see URL `/` for details). You can always view the full list of options with ```ustreamer --help```. diff --git a/README.ru.md b/README.ru.md index b35e388..f02eba9 100644 --- a/README.ru.md +++ b/README.ru.md @@ -58,6 +58,8 @@ $ ./ustreamer --help # ./ustreamer --device=/dev/video1 --host=0.0.0.0 --port=80 ``` +:exclamation: Обратите внимание, что начиная с версии µStreamer v2.0 кросс-доменные запросы были выключены по умолчанию [по соображениям безопасности](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). Чтобы включить старое поведение, используйте опцию `--allow-origin=\*`. + Рекомендуемый способ запуска µStreamer для работы с [Auvidea B101](https://www.raspberrypi.org/forums/viewtopic.php?f=38&t=120702&start=400#p1339178) на Raspberry Pi: ```bash $ ./ustreamer \ @@ -69,7 +71,7 @@ $ ./ustreamer \ --drop-same-frames=30 # Экономим трафик ``` -Обратите внимание что для использования `--drop-same-frames` для разных браузеров нужно использовать ряд специальных параметров в `/stream` (за деталями обратитесь к урлу `/`). +:exclamation: Обратите внимание, что для использования `--drop-same-frames` для разных браузеров нужно использовать ряд специальных параметров в `/stream` (за деталями обратитесь к урлу `/`). За полным списком опций обращайтесь ко встроенной справке: ```ustreamer --help```. diff --git a/src/http/server.c b/src/http/server.c index c2637d8..662f615 100644 --- a/src/http/server.c +++ b/src/http/server.c @@ -112,6 +112,7 @@ struct http_server_t *http_server_init(struct stream_t *stream) { server->user = ""; server->passwd = ""; server->static_path = ""; + server->allow_origin = ""; server->timeout = 10; server->last_as_blank = -1; server->run = run; @@ -456,7 +457,9 @@ static void _http_callback_snapshot(struct evhttp_request *request, void *v_serv assert((buf = evbuffer_new())); assert(!evbuffer_add(buf, (const void *)EXPOSED(picture->data), EXPOSED(picture->used))); - ADD_HEADER("Access-Control-Allow-Origin:", "*"); + if (server->allow_origin[0] != '\0') { + ADD_HEADER("Access-Control-Allow-Origin", server->allow_origin); + } ADD_HEADER("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate, pre-check=0, post-check=0, max-age=0"); ADD_HEADER("Pragma", "no-cache"); ADD_HEADER("Expires", "Mon, 3 Jan 2000 12:34:56 GMT"); @@ -620,9 +623,11 @@ static void _http_callback_stream_write(struct bufferevent *buf_event, void *v_c "Content-Type: image/jpeg" RN "X-Timestamp: %.06Lf" RN RN, get_now_real())) if (client->need_initial) { + assert(evbuffer_add_printf(buf, "HTTP/1.0 200 OK" RN)); + if (client->server->allow_origin[0] != '\0') { + assert(evbuffer_add_printf(buf, "Access-Control-Allow-Origin: %s" RN, client->server->allow_origin)); + } assert(evbuffer_add_printf(buf, - "HTTP/1.0 200 OK" RN - "Access-Control-Allow-Origin: *" RN "Cache-Control: no-store, no-cache, must-revalidate, proxy-revalidate, pre-check=0, post-check=0, max-age=0" RN "Pragma: no-cache" RN "Expires: Mon, 3 Jan 2000 12:34:56 GMT" RN diff --git a/src/http/server.h b/src/http/server.h index 62027f7..f0aaa17 100644 --- a/src/http/server.h +++ b/src/http/server.h @@ -97,6 +97,7 @@ struct http_server_t { char *user; char *passwd; char *static_path; + char *allow_origin; char *blank_path; int last_as_blank; diff --git a/src/options.c b/src/options.c index c0f6c95..7b7de1d 100644 --- a/src/options.c +++ b/src/options.c @@ -99,6 +99,7 @@ enum _OPT_VALUES { _O_USER, _O_PASSWD, _O_STATIC, + _O_ALLOW_ORIGIN, _O_TCP_NODELAY, _O_SERVER_TIMEOUT, @@ -175,6 +176,7 @@ static const struct option _LONG_OPTS[] = { {"last-as-blank", required_argument, NULL, _O_LAST_AS_BLANK}, {"drop-same-frames", required_argument, NULL, _O_DROP_SAME_FRAMES}, {"slowdown", no_argument, NULL, _O_SLOWDOWN}, + {"allow-origin", required_argument, NULL, _O_ALLOW_ORIGIN}, {"fake-resolution", required_argument, NULL, _O_FAKE_RESOLUTION}, {"tcp-nodelay", no_argument, NULL, _O_TCP_NODELAY}, {"server-timeout", required_argument, NULL, _O_SERVER_TIMEOUT}, @@ -398,6 +400,7 @@ int options_parse(struct options_t *options, struct device_t *dev, struct encode case _O_DROP_SAME_FRAMES: OPT_NUMBER("--drop-same-frames", server->drop_same_frames, 0, VIDEO_MAX_FPS, 0); case _O_SLOWDOWN: OPT_SET(server->slowdown, true); case _O_FAKE_RESOLUTION: OPT_RESOLUTION("--fake-resolution", server->fake_width, server->fake_height, false); + case _O_ALLOW_ORIGIN: OPT_SET(server->allow_origin, optarg); case _O_TCP_NODELAY: OPT_SET(server->tcp_nodelay, true); case _O_SERVER_TIMEOUT: OPT_NUMBER("--server-timeout", server->timeout, 1, 60, 0); @@ -645,6 +648,7 @@ static void _help(struct device_t *dev, struct encoder_t *encoder, struct http_s printf(" -R|--fake-resolution ─ Override image resolution for the /state. Default: disabled.\n\n"); printf(" --tcp-nodelay ────────────── Set TCP_NODELAY flag to the client /stream socket. Ignored for --unix.\n"); printf(" Default: disabled.\n\n"); + printf(" --allow-origin ─────── Set Access-Control-Allow-Origin header. Default: disabled.\n\n"); printf(" --server-timeout ───── Timeout for client connections. Default: %u.\n\n", server->timeout); #ifdef WITH_GPIO printf("GPIO options:\n");