Changes of Revision 200
[-] | Changed | nginx.changes |
x 1
2 ------------------------------------------------------------------- 3 +Mon Nov 28 07:21:41 UTC 2016 - cs@linux-administrator.com 4 + 5 +- update to nginx 1.11.6 6 +- update nginx rtmp module to 1.1.10 7 + 8 +------------------------------------------------------------------- 9 Wed Oct 12 21:29:31 UTC 2016 - cs@linux-administrator.com 10 11 - update to nginx 1.11.5 12 |
||
[-] | Changed | nginx.spec ^ |
19 1
2 %define nginx_webroot %{nginx_datadir}/html 3 4 %define rtmp_ext nginx-rtmp-module 5 -%define rtmp_ext_version 1.1.9 6 +%define rtmp_ext_version 1.1.10 7 %define rtmp %{rtmp_ext}-%{rtmp_ext_version} 8 %define rtmp_nover %{rtmp_ext} 9 %define with_rtmp_ext 1 10
11 12 13 Name: nginx 14 -Version: 1.11.5 15 +Version: 1.11.6 16 Release: 1 17 Summary: Robust, small and high performance http and reverse proxy server 18 Group: System Environment/Daemons 19 |
||
[+] | Added | 2bc1dac6fb3ed263529decb211ec784824132bf4.patch ^ |
@@ -0,0 +1,38 @@ +From 2bc1dac6fb3ed263529decb211ec784824132bf4 Mon Sep 17 00:00:00 2001 +From: Chris Lea <chris.lea@gmail.com> +Date: Tue, 15 Nov 2016 22:26:35 -0800 +Subject: [PATCH] default_port was removed in 1.11.6. + +--- + ngx_http_upstream_fair_module.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/ngx_http_upstream_fair_module.c b/ngx_http_upstream_fair_module.c +index a4419ca..66144e9 100644 +--- a/ngx_http_upstream_fair_module.c ++++ b/ngx_http_upstream_fair_module.c +@@ -540,7 +540,11 @@ ngx_http_upstream_init_fair_rr(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us) + + /* an upstream implicitly defined by proxy_pass, etc. */ + ++#if nginx_version < 1011006 + if (us->port == 0 && us->default_port == 0) { ++#else ++ if (us->port == 0) { ++#endif + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, + "no port in upstream \"%V\" in %s:%ui", + &us->host, us->file_name, us->line); +@@ -550,8 +554,11 @@ ngx_http_upstream_init_fair_rr(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us) + ngx_memzero(&u, sizeof(ngx_url_t)); + + u.host = us->host; ++#if nginx_version < 1011006 + u.port = (in_port_t) (us->port ? us->port : us->default_port); +- ++#else ++ u.port = (in_port_t) us->port; ++#endif + if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) { + if (u.err) { + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, | ||
[+] | Changed | _service ^ |
@@ -2,6 +2,6 @@ <service name="download_url"> <param name="host">nginx.org</param> <param name="protocol">http</param> - <param name="path">/download/nginx-1.11.5.tar.gz</param> + <param name="path">/download/nginx-1.11.6.tar.gz</param> </service> </services> | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/CHANGES ^ |
@@ -1,4 +1,43 @@ +Changes with nginx 1.11.6 15 Nov 2016 + + *) Change: format of the $ssl_client_s_dn and $ssl_client_i_dn variables + has been changed to follow RFC 2253 (RFC 4514); values in the old + format are available in the $ssl_client_s_dn_legacy and + $ssl_client_i_dn_legacy variables. + + *) Change: when storing temporary files in a cache directory they will + be stored in the same subdirectories as corresponding cache files + instead of a separate subdirectory for temporary files. + + *) Feature: EXTERNAL authentication mechanism support in mail proxy. + Thanks to Robert Norris. + + *) Feature: WebP support in the ngx_http_image_filter_module. + + *) Feature: variables support in the "proxy_method" directive. + Thanks to Dmitry Lazurkin. + + *) Feature: the "http2_max_requests" directive in the + ngx_http_v2_module. + + *) Feature: the "proxy_cache_max_range_offset", + "fastcgi_cache_max_range_offset", "scgi_cache_max_range_offset", and + "uwsgi_cache_max_range_offset" directives. + + *) Bugfix: graceful shutdown of old worker processes might require + infinite time when using HTTP/2. + + *) Bugfix: in the ngx_http_mp4_module. + + *) Bugfix: "ignore long locked inactive cache entry" alerts might appear + in logs when proxying WebSocket connections with caching enabled. + + *) Bugfix: nginx did not write anything to log and returned a response + with code 502 instead of 504 when a timeout occurred during an SSL + handshake to a backend. + + Changes with nginx 1.11.5 11 Oct 2016 *) Change: the --with-ipv6 configure option was removed, now IPv6 | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/CHANGES.ru ^ |
@@ -1,4 +1,44 @@ +Изменения в nginx 1.11.6 15.11.2016 + + *) Изменение: формат переменных $ssl_client_s_dn и $ssl_client_i_dn + изменён на соответствующий RFC 2253 (RFC 4514); значения в старом + формате доступны через переменные $ssl_client_s_dn_legacy и + $ssl_client_i_dn_legacy. + + *) Изменение: при сохранении временных файлов в каталоге кэша они теперь + располагаются не в отдельном подкаталоге для временных файлов, а в + том же подкаталоге, что и соответствующие файлы в кэше. + + *) Добавление: поддержка метода аутентификации EXTERNAL в почтовом + прокси-сервере. + Спасибо Robert Norris. + + *) Добавление: поддержка WebP в модуле ngx_http_image_filter_module. + + *) Добавление: директива proxy_method поддерживает переменные. + Спасибо Дмитрию Лазуркину. + + *) Добавление: директива http2_max_requests в модуле ngx_http_v2_module. + + *) Добавление: директивы proxy_cache_max_range_offset, + fastcgi_cache_max_range_offset, scgi_cache_max_range_offset и + uwsgi_cache_max_range_offset. + + *) Исправление: плавное завершение старых рабочих процессов могло + занимать бесконечное время при использовании HTTP/2. + + *) Исправление: в модуле ngx_http_mp4_module. + + *) Исправление: при проксировании WebSocket-соединений и включённом + кэшировании в логах могли появляться сообщения "ignore long locked + inactive cache entry". + + *) Исправление: если во время SSL handshake с бэкендом происходил + таймаут, nginx ничего не писал в лог и возвращал ответ с кодом 502 + вместо 504. + + Изменения в nginx 1.11.5 11.10.2016 *) Изменение: параметр configure --with-ipv6 упразднён, поддержка IPv6 @@ -5589,7 +5629,7 @@ Изменения в nginx 0.4.11 25.10.2006 - *) Добавление: POP3 прокси поддерживает AUTH LOIGN PLAIN и CRAM-MD5. + *) Добавление: POP3 прокси поддерживает AUTH LOGIN PLAIN и CRAM-MD5. *) Добавление: модуль ngx_http_perl_module поддерживает метод $r->allow_ranges. | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/auto/lib/libgd/conf ^ |
@@ -74,6 +74,11 @@ NGX_LIB_LIBGD=$ngx_feature_libs + ngx_feature="GD WebP support" + ngx_feature_name="NGX_HAVE_GD_WEBP" + ngx_feature_test="gdImagePtr img = gdImageCreateFromWebpPtr(1, NULL);" + . auto/feature + else cat << END | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/core/nginx.h ^ |
@@ -9,8 +9,8 @@ #define _NGINX_H_INCLUDED_ -#define nginx_version 1011005 -#define NGINX_VERSION "1.11.5" +#define nginx_version 1011006 +#define NGINX_VERSION "1.11.6" #define NGINX_VER "nginx/" NGINX_VERSION #ifdef NGX_BUILD | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/core/ngx_buf.c ^ |
@@ -186,16 +186,18 @@ { ngx_chain_t *cl; - if (*busy == NULL) { - *busy = *out; + if (*out) { + if (*busy == NULL) { + *busy = *out; - } else { - for (cl = *busy; cl->next; cl = cl->next) { /* void */ } + } else { + for (cl = *busy; cl->next; cl = cl->next) { /* void */ } - cl->next = *out; - } + cl->next = *out; + } - *out = NULL; + *out = NULL; + } while (*busy) { cl = *busy; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/core/ngx_conf_file.c ^ |
@@ -10,6 +10,7 @@ #define NGX_CONF_BUFFER 4096 +static ngx_int_t ngx_conf_add_dump(ngx_conf_t *cf, ngx_str_t *filename); static ngx_int_t ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last); static ngx_int_t ngx_conf_read_token(ngx_conf_t *cf); static void ngx_conf_flush_files(ngx_cycle_t *cycle); @@ -97,17 +98,70 @@ } +static ngx_int_t +ngx_conf_add_dump(ngx_conf_t *cf, ngx_str_t *filename) +{ + off_t size; + u_char *p; + uint32_t hash; + ngx_buf_t *buf; + ngx_str_node_t *sn; + ngx_conf_dump_t *cd; + + hash = ngx_crc32_long(filename->data, filename->len); + + sn = ngx_str_rbtree_lookup(&cf->cycle->config_dump_rbtree, filename, hash); + + if (sn) { + cf->conf_file->dump = NULL; + return NGX_OK; + } + + p = ngx_pstrdup(cf->cycle->pool, filename); + if (p == NULL) { + return NGX_ERROR; + } + + cd = ngx_array_push(&cf->cycle->config_dump); + if (cd == NULL) { + return NGX_ERROR; + } + + size = ngx_file_size(&cf->conf_file->file.info); + + buf = ngx_create_temp_buf(cf->cycle->pool, (size_t) size); + if (buf == NULL) { + return NGX_ERROR; + } + + cd->name.data = p; + cd->name.len = filename->len; + cd->buffer = buf; + + cf->conf_file->dump = buf; + + sn = ngx_palloc(cf->temp_pool, sizeof(ngx_str_node_t)); + if (sn == NULL) { + return NGX_ERROR; + } + + sn->node.key = hash; + sn->str = cd->name; + + ngx_rbtree_insert(&cf->cycle->config_dump_rbtree, &sn->node); + + return NGX_OK; +} + + char * ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename) { char *rv; - u_char *p; - off_t size; ngx_fd_t fd; ngx_int_t rc; - ngx_buf_t buf, *tbuf; + ngx_buf_t buf; ngx_conf_file_t *prev, conf_file; - ngx_conf_dump_t *cd; enum { parse_file = 0, parse_block, @@ -167,29 +221,10 @@ #endif ) { - p = ngx_pstrdup(cf->cycle->pool, filename); - if (p == NULL) { + if (ngx_conf_add_dump(cf, filename) != NGX_OK) { goto failed; } - size = ngx_file_size(&cf->conf_file->file.info); - - tbuf = ngx_create_temp_buf(cf->cycle->pool, (size_t) size); - if (tbuf == NULL) { - goto failed; - } - - cd = ngx_array_push(&cf->cycle->config_dump); - if (cd == NULL) { - goto failed; - } - - cd->name.len = filename->len; - cd->name.data = p; - cd->buffer = tbuf; - - cf->conf_file->dump = tbuf; - } else { cf->conf_file->dump = NULL; } | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/core/ngx_cycle.c ^ |
@@ -132,6 +132,9 @@ return NULL; } + ngx_rbtree_init(&cycle->config_dump_rbtree, &cycle->config_dump_sentinel, + ngx_str_rbtree_insert_value); + if (old_cycle->open_files.part.nelts) { n = old_cycle->open_files.part.nelts; for (part = old_cycle->open_files.part.next; part; part = part->next) { | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/core/ngx_cycle.h ^ |
@@ -56,7 +56,11 @@ ngx_array_t listening; ngx_array_t paths; + ngx_array_t config_dump; + ngx_rbtree_t config_dump_rbtree; + ngx_rbtree_node_t config_dump_sentinel; + ngx_list_t open_files; ngx_list_t shared_memory; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/core/ngx_file.c ^ |
@@ -141,12 +141,27 @@ ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, ngx_pool_t *pool, ngx_uint_t persistent, ngx_uint_t clean, ngx_uint_t access) { + size_t levels; + u_char *p; uint32_t n; ngx_err_t err; + ngx_str_t name; + ngx_uint_t prefix; ngx_pool_cleanup_t *cln; ngx_pool_cleanup_file_t *clnf; - file->name.len = path->name.len + 1 + path->len + 10; + if (file->name.len) { + name = file->name; + levels = 0; + prefix = 1; + + } else { + name = path->name; + levels = path->len; + prefix = 0; + } + + file->name.len = name.len + 1 + levels + 10; file->name.data = ngx_pnalloc(pool, file->name.len + 1); if (file->name.data == NULL) { @@ -159,7 +174,13 @@ } #endif - ngx_memcpy(file->name.data, path->name.data, path->name.len); + p = ngx_cpymem(file->name.data, name.data, name.len); + + if (prefix) { + *p = '.'; + } + + p += 1 + levels; n = (uint32_t) ngx_next_temp_number(0); @@ -169,10 +190,11 @@ } for ( ;; ) { - (void) ngx_sprintf(file->name.data + path->name.len + 1 + path->len, - "%010uD%Z", n); + (void) ngx_sprintf(p, "%010uD%Z", n); - ngx_create_hashed_filename(path, file->name.data, file->name.len); + if (!prefix) { + ngx_create_hashed_filename(path, file->name.data, file->name.len); + } ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0, "hashed path: %s", file->name.data); | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/core/ngx_hash.c ^ |
@@ -390,7 +390,6 @@ buckets[i] = (ngx_hash_elt_t *) elts; elts += test[i]; - } for (i = 0; i < size; i++) { | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/event/ngx_event_openssl.c ^ |
@@ -2137,7 +2137,9 @@ break; } - if (p >= last) { + /* ERR_error_string_n() requires at least one byte */ + + if (p >= last - 1) { goto next; } @@ -3436,6 +3438,109 @@ ngx_int_t ngx_ssl_get_subject_dn(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) { + BIO *bio; + X509 *cert; + X509_NAME *name; + + s->len = 0; + + cert = SSL_get_peer_certificate(c->ssl->connection); + if (cert == NULL) { + return NGX_OK; + } + + name = X509_get_subject_name(cert); + if (name == NULL) { + return NGX_ERROR; + } + + bio = BIO_new(BIO_s_mem()); + if (bio == NULL) { + X509_free(cert); + return NGX_ERROR; + } + + if (X509_NAME_print_ex(bio, name, 0, XN_FLAG_RFC2253) < 0) { + goto failed; + } + + s->len = BIO_pending(bio); + s->data = ngx_pnalloc(pool, s->len); + if (s->data == NULL) { + goto failed; + } + + BIO_read(bio, s->data, s->len); + + BIO_free(bio); + X509_free(cert); + + return NGX_OK; + +failed: + + BIO_free(bio); + X509_free(cert); + + return NGX_ERROR; +} + + +ngx_int_t +ngx_ssl_get_issuer_dn(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) +{ + BIO *bio; + X509 *cert; + X509_NAME *name; + + s->len = 0; + + cert = SSL_get_peer_certificate(c->ssl->connection); + if (cert == NULL) { + return NGX_OK; + } + + name = X509_get_issuer_name(cert); + if (name == NULL) { + return NGX_ERROR; + } + + bio = BIO_new(BIO_s_mem()); + if (bio == NULL) { + X509_free(cert); + return NGX_ERROR; + } + + if (X509_NAME_print_ex(bio, name, 0, XN_FLAG_RFC2253) < 0) { + goto failed; + } + + s->len = BIO_pending(bio); + s->data = ngx_pnalloc(pool, s->len); + if (s->data == NULL) { + goto failed; + } + + BIO_read(bio, s->data, s->len); + + BIO_free(bio); + X509_free(cert); + + return NGX_OK; + +failed: + + BIO_free(bio); + X509_free(cert); + + return NGX_ERROR; +} + + +ngx_int_t +ngx_ssl_get_subject_dn_legacy(ngx_connection_t *c, ngx_pool_t *pool, + ngx_str_t *s) +{ char *p; size_t len; X509 *cert; @@ -3476,7 +3581,8 @@ ngx_int_t -ngx_ssl_get_issuer_dn(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) +ngx_ssl_get_issuer_dn_legacy(ngx_connection_t *c, ngx_pool_t *pool, + ngx_str_t *s) { char *p; size_t len; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/event/ngx_event_openssl.h ^ |
@@ -205,6 +205,10 @@ ngx_str_t *s); ngx_int_t ngx_ssl_get_issuer_dn(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s); +ngx_int_t ngx_ssl_get_subject_dn_legacy(ngx_connection_t *c, ngx_pool_t *pool, + ngx_str_t *s); +ngx_int_t ngx_ssl_get_issuer_dn_legacy(ngx_connection_t *c, ngx_pool_t *pool, + ngx_str_t *s); ngx_int_t ngx_ssl_get_serial_number(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s); ngx_int_t ngx_ssl_get_fingerprint(ngx_connection_t *c, ngx_pool_t *pool, | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/modules/ngx_http_fastcgi_module.c ^ |
@@ -420,6 +420,13 @@ offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_min_uses), NULL }, + { ngx_string("fastcgi_cache_max_range_offset"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_off_slot, + NGX_HTTP_LOC_CONF_OFFSET, + offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_max_range_offset), + NULL }, + { ngx_string("fastcgi_cache_use_stale"), NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, ngx_conf_set_bitmask_slot, @@ -766,16 +773,14 @@ return NGX_ERROR; } - if (url.addrs && url.addrs[0].sockaddr) { + if (url.addrs) { u->resolved->sockaddr = url.addrs[0].sockaddr; u->resolved->socklen = url.addrs[0].socklen; + u->resolved->name = url.addrs[0].name; u->resolved->naddrs = 1; - u->resolved->host = url.addrs[0].name; - - } else { - u->resolved->host = url.host; } + u->resolved->host = url.host; u->resolved->port = url.port; u->resolved->no_port = url.no_port; @@ -2756,6 +2761,7 @@ #if (NGX_HTTP_CACHE) conf->upstream.cache = NGX_CONF_UNSET; conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT; + conf->upstream.cache_max_range_offset = NGX_CONF_UNSET; conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR; conf->upstream.no_cache = NGX_CONF_UNSET_PTR; conf->upstream.cache_valid = NGX_CONF_UNSET_PTR; @@ -3001,6 +3007,10 @@ ngx_conf_merge_uint_value(conf->upstream.cache_min_uses, prev->upstream.cache_min_uses, 1); + ngx_conf_merge_off_value(conf->upstream.cache_max_range_offset, + prev->upstream.cache_max_range_offset, + NGX_MAX_OFF_T_VALUE); + ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale, prev->upstream.cache_use_stale, (NGX_CONF_BITMASK_SET @@ -3127,6 +3137,20 @@ #endif + /* + * special handling to preserve conf->params in the "http" section + * to inherit it to all servers + */ + + if (prev->params.hash.buckets == NULL + && conf->params_source == prev->params_source) + { + prev->params = conf->params; +#if (NGX_HTTP_CACHE) + prev->params_cache = conf->params_cache; +#endif + } + return NGX_CONF_OK; } | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/modules/ngx_http_image_filter_module.c ^ |
@@ -31,6 +31,7 @@ #define NGX_HTTP_IMAGE_JPEG 1 #define NGX_HTTP_IMAGE_GIF 2 #define NGX_HTTP_IMAGE_PNG 3 +#define NGX_HTTP_IMAGE_WEBP 4 #define NGX_HTTP_IMAGE_BUFFERED 0x08 @@ -42,6 +43,7 @@ ngx_uint_t height; ngx_uint_t angle; ngx_uint_t jpeg_quality; + ngx_uint_t webp_quality; ngx_uint_t sharpen; ngx_flag_t transparency; @@ -51,6 +53,7 @@ ngx_http_complex_value_t *hcv; ngx_http_complex_value_t *acv; ngx_http_complex_value_t *jqcv; + ngx_http_complex_value_t *wqcv; ngx_http_complex_value_t *shcv; size_t buffer_size; @@ -109,6 +112,8 @@ void *conf); static char *ngx_http_image_filter_jpeg_quality(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); +static char *ngx_http_image_filter_webp_quality(ngx_conf_t *cf, + ngx_command_t *cmd, void *conf); static char *ngx_http_image_filter_sharpen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); static ngx_int_t ngx_http_image_filter_init(ngx_conf_t *cf); @@ -130,6 +135,13 @@ 0, NULL }, + { ngx_string("image_filter_webp_quality"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, + ngx_http_image_filter_webp_quality, + NGX_HTTP_LOC_CONF_OFFSET, + 0, + NULL }, + { ngx_string("image_filter_sharpen"), NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, ngx_http_image_filter_sharpen, @@ -200,7 +212,8 @@ static ngx_str_t ngx_http_image_types[] = { ngx_string("image/jpeg"), ngx_string("image/gif"), - ngx_string("image/png") + ngx_string("image/png"), + ngx_string("image/webp") }; @@ -441,6 +454,13 @@ /* PNG */ return NGX_HTTP_IMAGE_PNG; + + } else if (p[0] == 'R' && p[1] == 'I' && p[2] == 'F' && p[3] == 'F' + && p[8] == 'W' && p[9] == 'E' && p[10] == 'B' && p[11] == 'P') + { + /* WebP */ + + return NGX_HTTP_IMAGE_WEBP; } return NGX_HTTP_IMAGE_NONE; @@ -731,6 +751,56 @@ break; + case NGX_HTTP_IMAGE_WEBP: + + if (ctx->length < 30) { + return NGX_DECLINED; + } + + if (p[12] != 'V' || p[13] != 'P' || p[14] != '8') { + return NGX_DECLINED; + } + + switch (p[15]) { + + case ' ': + if (p[20] & 1) { + /* not a key frame */ + return NGX_DECLINED; + } + + if (p[23] != 0x9d || p[24] != 0x01 || p[25] != 0x2a) { + /* invalid start code */ + return NGX_DECLINED; + } + + width = (p[26] | p[27] << 8) & 0x3fff; + height = (p[28] | p[29] << 8) & 0x3fff; + + break; + + case 'L': + if (p[20] != 0x2f) { + /* invalid signature */ + return NGX_DECLINED; + } + + width = ((p[21] | p[22] << 8) & 0x3fff) + 1; + height = ((p[22] >> 6 | p[23] << 2 | p[24] << 10) & 0x3fff) + 1; + + break; + + case 'X': + width = (p[24] | p[25] << 8 | p[26] << 16) + 1; + height = (p[27] | p[28] << 8 | p[29] << 16) + 1; + break; + + default: + return NGX_DECLINED; + } + + break; + default: return NGX_DECLINED; @@ -1043,6 +1113,15 @@ failed = "gdImageCreateFromPngPtr() failed"; break; + case NGX_HTTP_IMAGE_WEBP: +#if (NGX_HAVE_GD_WEBP) + img = gdImageCreateFromWebpPtr(ctx->length, ctx->image); + failed = "gdImageCreateFromWebpPtr() failed"; +#else + failed = "nginx was built without GD WebP support"; +#endif + break; + default: failed = "unknown image type"; break; @@ -1090,7 +1169,7 @@ { char *failed; u_char *out; - ngx_int_t jq; + ngx_int_t q; ngx_http_image_filter_conf_t *conf; out = NULL; @@ -1100,12 +1179,12 @@ case NGX_HTTP_IMAGE_JPEG: conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module); - jq = ngx_http_image_filter_get_value(r, conf->jqcv, conf->jpeg_quality); - if (jq <= 0) { + q = ngx_http_image_filter_get_value(r, conf->jqcv, conf->jpeg_quality); + if (q <= 0) { return NULL; } - out = gdImageJpegPtr(img, size, jq); + out = gdImageJpegPtr(img, size, q); failed = "gdImageJpegPtr() failed"; break; @@ -1119,6 +1198,22 @@ failed = "gdImagePngPtr() failed"; break; + case NGX_HTTP_IMAGE_WEBP: +#if (NGX_HAVE_GD_WEBP) + conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module); + + q = ngx_http_image_filter_get_value(r, conf->wqcv, conf->webp_quality); + if (q <= 0) { + return NULL; + } + + out = gdImageWebpPtrEx(img, size, q); + failed = "gdImageWebpPtrEx() failed"; +#else + failed = "nginx was built without GD WebP support"; +#endif + break; + default: failed = "unknown image type"; break; @@ -1196,11 +1291,13 @@ * conf->hcv = NULL; * conf->acv = NULL; * conf->jqcv = NULL; + * conf->wqcv = NULL; * conf->shcv = NULL; */ conf->filter = NGX_CONF_UNSET_UINT; conf->jpeg_quality = NGX_CONF_UNSET_UINT; + conf->webp_quality = NGX_CONF_UNSET_UINT; conf->sharpen = NGX_CONF_UNSET_UINT; conf->transparency = NGX_CONF_UNSET; conf->interlace = NGX_CONF_UNSET; @@ -1242,6 +1339,16 @@ } } + if (conf->webp_quality == NGX_CONF_UNSET_UINT) { + + /* 80 is libwebp default quality */ + ngx_conf_merge_uint_value(conf->webp_quality, prev->webp_quality, 80); + + if (conf->wqcv == NULL) { + conf->wqcv = prev->wqcv; + } + } + if (conf->sharpen == NGX_CONF_UNSET_UINT) { ngx_conf_merge_uint_value(conf->sharpen, prev->sharpen, 0); @@ -1458,6 +1565,53 @@ } return NGX_CONF_OK; +} + + +static char * +ngx_http_image_filter_webp_quality(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf) +{ + ngx_http_image_filter_conf_t *imcf = conf; + + ngx_str_t *value; + ngx_int_t n; + ngx_http_complex_value_t cv; + ngx_http_compile_complex_value_t ccv; + + value = cf->args->elts; + + ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); + + ccv.cf = cf; + ccv.value = &value[1]; + ccv.complex_value = &cv; + + if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { + return NGX_CONF_ERROR; + } + + if (cv.lengths == NULL) { + n = ngx_http_image_filter_value(&value[1]); + + if (n <= 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid value \"%V\"", &value[1]); + return NGX_CONF_ERROR; + } + + imcf->webp_quality = (ngx_uint_t) n; + + } else { + imcf->wqcv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t)); + if (imcf->wqcv == NULL) { + return NGX_CONF_ERROR; + } + + *imcf->wqcv = cv; + } + + return NGX_CONF_OK; } | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/modules/ngx_http_mp4_module.c ^ |
@@ -216,6 +216,7 @@ static ngx_int_t ngx_http_mp4_handler(ngx_http_request_t *r); +static ngx_int_t ngx_http_mp4_atofp(u_char *line, size_t n, size_t point); static ngx_int_t ngx_http_mp4_process(ngx_http_mp4_file_t *mp4); static ngx_int_t ngx_http_mp4_read_atom(ngx_http_mp4_file_t *mp4, @@ -537,26 +538,15 @@ /* * A Flash player may send start value with a lot of digits - * after dot so strtod() is used instead of atofp(). NaNs and - * infinities become negative numbers after (int) conversion. + * after dot so a custom function is used instead of ngx_atofp(). */ - ngx_set_errno(0); - start = (int) (strtod((char *) value.data, NULL) * 1000); - - if (ngx_errno != 0) { - start = -1; - } + start = ngx_http_mp4_atofp(value.data, value.len, 3); } if (ngx_http_arg(r, (u_char *) "end", 3, &value) == NGX_OK) { - ngx_set_errno(0); - end = (int) (strtod((char *) value.data, NULL) * 1000); - - if (ngx_errno != 0) { - end = -1; - } + end = ngx_http_mp4_atofp(value.data, value.len, 3); if (end > 0) { if (start < 0) { @@ -686,6 +676,62 @@ } +static ngx_int_t +ngx_http_mp4_atofp(u_char *line, size_t n, size_t point) +{ + ngx_int_t value, cutoff, cutlim; + ngx_uint_t dot; + + /* same as ngx_atofp(), but allows additional digits */ + + if (n == 0) { + return NGX_ERROR; + } + + cutoff = NGX_MAX_INT_T_VALUE / 10; + cutlim = NGX_MAX_INT_T_VALUE % 10; + + dot = 0; + + for (value = 0; n--; line++) { + + if (*line == '.') { + if (dot) { + return NGX_ERROR; + } + + dot = 1; + continue; + } + + if (*line < '0' || *line > '9') { + return NGX_ERROR; + } + + if (point == 0) { + continue; + } + + if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) { + return NGX_ERROR; + } + + value = value * 10 + (*line - '0'); + point -= dot; + } + + while (point--) { + if (value > cutoff) { + return NGX_ERROR; + } + + value = value * 10; + } + + return value; +} + + static ngx_int_t ngx_http_mp4_process(ngx_http_mp4_file_t *mp4) { | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/modules/ngx_http_proxy_module.c ^ |
@@ -73,7 +73,7 @@ ngx_array_t *cookie_domains; ngx_array_t *cookie_paths; - ngx_str_t method; + ngx_http_complex_value_t *method; ngx_str_t location; ngx_str_t url; @@ -380,7 +380,7 @@ { ngx_string("proxy_method"), NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, + ngx_http_set_complex_value_slot, NGX_HTTP_LOC_CONF_OFFSET, offsetof(ngx_http_proxy_loc_conf_t, method), NULL }, @@ -492,6 +492,13 @@ offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_min_uses), NULL }, + { ngx_string("proxy_cache_max_range_offset"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_off_slot, + NGX_HTTP_LOC_CONF_OFFSET, + offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_max_range_offset), + NULL }, + { ngx_string("proxy_cache_use_stale"), NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, ngx_conf_set_bitmask_slot, @@ -1008,16 +1015,14 @@ return NGX_ERROR; } - if (url.addrs && url.addrs[0].sockaddr) { + if (url.addrs) { u->resolved->sockaddr = url.addrs[0].sockaddr; u->resolved->socklen = url.addrs[0].socklen; + u->resolved->name = url.addrs[0].name; u->resolved->naddrs = 1; - u->resolved->host = url.addrs[0].name; - - } else { - u->resolved->host = url.host; } + u->resolved->host = url.host; u->resolved->port = (in_port_t) (url.no_port ? port : url.port); u->resolved->no_port = url.no_port; @@ -1159,8 +1164,10 @@ /* HEAD was changed to GET to cache response */ method = u->method; - } else if (plcf->method.len) { - method = plcf->method; + } else if (plcf->method) { + if (ngx_http_complex_value(r, plcf->method, &method) != NGX_OK) { + return NGX_ERROR; + } } else { method = r->method_name; @@ -2797,7 +2804,7 @@ * conf->upstream.store_values = NULL; * conf->upstream.ssl_name = NULL; * - * conf->method = { 0, NULL }; + * conf->method = NULL; * conf->headers_source = NULL; * conf->headers.lengths = NULL; * conf->headers.values = NULL; @@ -2847,6 +2854,7 @@ #if (NGX_HTTP_CACHE) conf->upstream.cache = NGX_CONF_UNSET; conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT; + conf->upstream.cache_max_range_offset = NGX_CONF_UNSET; conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR; conf->upstream.no_cache = NGX_CONF_UNSET_PTR; conf->upstream.cache_valid = NGX_CONF_UNSET_PTR; @@ -3108,6 +3116,10 @@ ngx_conf_merge_uint_value(conf->upstream.cache_min_uses, prev->upstream.cache_min_uses, 1); + ngx_conf_merge_off_value(conf->upstream.cache_max_range_offset, + prev->upstream.cache_max_range_offset, + NGX_MAX_OFF_T_VALUE); + ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale, prev->upstream.cache_use_stale, (NGX_CONF_BITMASK_SET @@ -3158,7 +3170,9 @@ #endif - ngx_conf_merge_str_value(conf->method, prev->method, ""); + if (conf->method == NULL) { + conf->method = prev->method; + } ngx_conf_merge_value(conf->upstream.pass_request_headers, prev->upstream.pass_request_headers, 1); @@ -3357,6 +3371,20 @@ #endif + /* + * special handling to preserve conf->headers in the "http" section + * to inherit it to all servers + */ + + if (prev->headers.hash.buckets == NULL + && conf->headers_source == prev->headers_source) + { + prev->headers = conf->headers; +#if (NGX_HTTP_CACHE) + prev->headers_cache = conf->headers_cache; +#endif + } + return NGX_CONF_OK; } @@ -3392,14 +3420,6 @@ return NGX_ERROR; } - if (conf->headers_source == NULL) { - conf->headers_source = ngx_array_create(cf->pool, 4, - sizeof(ngx_keyval_t)); - if (conf->headers_source == NULL) { - return NGX_ERROR; - } - } - headers->lengths = ngx_array_create(cf->pool, 64, 1); if (headers->lengths == NULL) { return NGX_ERROR; @@ -3410,15 +3430,18 @@ return NGX_ERROR; } - src = conf->headers_source->elts; - for (i = 0; i < conf->headers_source->nelts; i++) { + if (conf->headers_source) { - s = ngx_array_push(&headers_merged); - if (s == NULL) { - return NGX_ERROR; - } + src = conf->headers_source->elts; + for (i = 0; i < conf->headers_source->nelts; i++) { - *s = src[i]; + s = ngx_array_push(&headers_merged); + if (s == NULL) { + return NGX_ERROR; + } + + *s = src[i]; + } } h = default_headers; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/modules/ngx_http_range_filter_module.c ^ |
@@ -224,12 +224,6 @@ ctx->offset = r->headers_out.content_offset; - if (ngx_array_init(&ctx->ranges, r->pool, 1, sizeof(ngx_http_range_t)) - != NGX_OK) - { - return NGX_ERROR; - } - ranges = r->single_range ? 1 : clcf->max_ranges; switch (ngx_http_range_parse(r, ctx, ranges)) { @@ -291,6 +285,12 @@ } } + if (ngx_array_init(&ctx->ranges, r->pool, 1, sizeof(ngx_http_range_t)) + != NGX_OK) + { + return NGX_ERROR; + } + p = r->headers_in.range->value.data + 6; size = 0; content_length = r->headers_out.content_length_n; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/modules/ngx_http_scgi_module.c ^ |
@@ -270,6 +270,13 @@ offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_min_uses), NULL }, + { ngx_string("scgi_cache_max_range_offset"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_off_slot, + NGX_HTTP_LOC_CONF_OFFSET, + offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_max_range_offset), + NULL }, + { ngx_string("scgi_cache_use_stale"), NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, ngx_conf_set_bitmask_slot, @@ -562,16 +569,14 @@ return NGX_ERROR; } - if (url.addrs && url.addrs[0].sockaddr) { + if (url.addrs) { u->resolved->sockaddr = url.addrs[0].sockaddr; u->resolved->socklen = url.addrs[0].socklen; + u->resolved->name = url.addrs[0].name; u->resolved->naddrs = 1; - u->resolved->host = url.addrs[0].name; - - } else { - u->resolved->host = url.host; } + u->resolved->host = url.host; u->resolved->port = url.port; u->resolved->no_port = url.no_port; @@ -1206,6 +1211,7 @@ #if (NGX_HTTP_CACHE) conf->upstream.cache = NGX_CONF_UNSET; conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT; + conf->upstream.cache_max_range_offset = NGX_CONF_UNSET; conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR; conf->upstream.no_cache = NGX_CONF_UNSET_PTR; conf->upstream.cache_valid = NGX_CONF_UNSET_PTR; @@ -1446,6 +1452,10 @@ ngx_conf_merge_uint_value(conf->upstream.cache_min_uses, prev->upstream.cache_min_uses, 1); + ngx_conf_merge_off_value(conf->upstream.cache_max_range_offset, + prev->upstream.cache_max_range_offset, + NGX_MAX_OFF_T_VALUE); + ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale, prev->upstream.cache_use_stale, (NGX_CONF_BITMASK_SET @@ -1558,6 +1568,20 @@ #endif + /* + * special handling to preserve conf->params in the "http" section + * to inherit it to all servers + */ + + if (prev->params.hash.buckets == NULL + && conf->params_source == prev->params_source) + { + prev->params = conf->params; +#if (NGX_HTTP_CACHE) + prev->params_cache = conf->params_cache; +#endif + } + return NGX_CONF_OK; } | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/modules/ngx_http_ssl_module.c ^ |
@@ -298,6 +298,12 @@ { ngx_string("ssl_client_i_dn"), NULL, ngx_http_ssl_variable, (uintptr_t) ngx_ssl_get_issuer_dn, NGX_HTTP_VAR_CHANGEABLE, 0 }, + { ngx_string("ssl_client_s_dn_legacy"), NULL, ngx_http_ssl_variable, + (uintptr_t) ngx_ssl_get_subject_dn_legacy, NGX_HTTP_VAR_CHANGEABLE, 0 }, + + { ngx_string("ssl_client_i_dn_legacy"), NULL, ngx_http_ssl_variable, + (uintptr_t) ngx_ssl_get_issuer_dn_legacy, NGX_HTTP_VAR_CHANGEABLE, 0 }, + { ngx_string("ssl_client_serial"), NULL, ngx_http_ssl_variable, (uintptr_t) ngx_ssl_get_serial_number, NGX_HTTP_VAR_CHANGEABLE, 0 }, | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/modules/ngx_http_uwsgi_module.c ^ |
@@ -330,6 +330,13 @@ offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_min_uses), NULL }, + { ngx_string("uwsgi_cache_max_range_offset"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_off_slot, + NGX_HTTP_LOC_CONF_OFFSET, + offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_max_range_offset), + NULL }, + { ngx_string("uwsgi_cache_use_stale"), NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, ngx_conf_set_bitmask_slot, @@ -764,16 +771,14 @@ return NGX_ERROR; } - if (url.addrs && url.addrs[0].sockaddr) { + if (url.addrs) { u->resolved->sockaddr = url.addrs[0].sockaddr; u->resolved->socklen = url.addrs[0].socklen; + u->resolved->name = url.addrs[0].name; u->resolved->naddrs = 1; - u->resolved->host = url.addrs[0].name; - - } else { - u->resolved->host = url.host; } + u->resolved->host = url.host; u->resolved->port = url.port; u->resolved->no_port = url.no_port; @@ -1412,6 +1417,7 @@ #if (NGX_HTTP_CACHE) conf->upstream.cache = NGX_CONF_UNSET; conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT; + conf->upstream.cache_max_range_offset = NGX_CONF_UNSET; conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR; conf->upstream.no_cache = NGX_CONF_UNSET_PTR; conf->upstream.cache_valid = NGX_CONF_UNSET_PTR; @@ -1660,6 +1666,10 @@ ngx_conf_merge_uint_value(conf->upstream.cache_min_uses, prev->upstream.cache_min_uses, 1); + ngx_conf_merge_off_value(conf->upstream.cache_max_range_offset, + prev->upstream.cache_max_range_offset, + NGX_MAX_OFF_T_VALUE); + ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale, prev->upstream.cache_use_stale, (NGX_CONF_BITMASK_SET @@ -1820,6 +1830,20 @@ #endif + /* + * special handling to preserve conf->params in the "http" section + * to inherit it to all servers + */ + + if (prev->params.hash.buckets == NULL + && conf->params_source == prev->params_source) + { + prev->params = conf->params; +#if (NGX_HTTP_CACHE) + prev->params_cache = conf->params_cache; +#endif + } + return NGX_CONF_OK; } | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/modules/perl/ngx_http_perl_module.c ^ |
@@ -410,7 +410,7 @@ args = ¶ms[NGX_HTTP_PERL_SSI_ARG]; - if (args) { + if (args[0]) { for (i = 0; args[i]; i++) { /* void */ } | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/ngx_http_cache.h ^ |
@@ -151,7 +151,6 @@ ngx_slab_pool_t *shpool; ngx_path_t *path; - ngx_path_t *temp_path; off_t max_size; size_t bsize; @@ -171,6 +170,9 @@ ngx_msec_t manager_threshold; ngx_shm_zone_t *shm_zone; + + ngx_uint_t use_temp_path; + /* unsigned use_temp_path:1 */ }; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/ngx_http_core_module.c ^ |
@@ -4827,8 +4827,6 @@ case NGX_HTTPS_CERT_ERROR: case NGX_HTTPS_NO_CERT: err->overwrite = NGX_HTTP_BAD_REQUEST; - default: - break; } } | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/ngx_http_file_cache.c ^ |
@@ -1920,17 +1920,18 @@ ngx_http_file_cache_t *cache = data; off_t size; - time_t next, wait; - ngx_msec_t elapsed; + time_t wait; + ngx_msec_t elapsed, next; ngx_uint_t count, watermark; cache->last = ngx_current_msec; cache->files = 0; - next = ngx_http_file_cache_expire(cache); + next = (ngx_msec_t) ngx_http_file_cache_expire(cache) * 1000; if (next == 0) { - return cache->manager_sleep; + next = cache->manager_sleep; + goto done; } for ( ;; ) { @@ -1947,21 +1948,23 @@ size, count, (ngx_int_t) watermark); if (size < cache->max_size && count < watermark) { - return (ngx_msec_t) next * 1000; + break; } wait = ngx_http_file_cache_forced_expire(cache); if (wait > 0) { - return (ngx_msec_t) wait * 1000; + next = (ngx_msec_t) wait * 1000; + break; } if (ngx_quit || ngx_terminate) { - return (ngx_msec_t) next * 1000; + break; } if (++cache->files >= cache->manager_files) { - return cache->manager_sleep; + next = cache->manager_sleep; + break; } ngx_time_update(); @@ -1969,9 +1972,20 @@ elapsed = ngx_abs((ngx_msec_int_t) (ngx_current_msec - cache->last)); if (elapsed >= cache->manager_threshold) { - return cache->manager_sleep; + next = cache->manager_sleep; + break; } } + +done: + + elapsed = ngx_abs((ngx_msec_int_t) (ngx_current_msec - cache->last)); + + ngx_log_debug3(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, + "http file cache manager: %ui e:%M n:%M", + cache->files, elapsed, next); + + return next; } @@ -2098,6 +2112,17 @@ return NGX_ERROR; } + /* + * Temporary files in cache have a suffix consisting of a dot + * followed by 10 digits. + */ + + if (name->len >= 2 * NGX_HTTP_CACHE_KEY_LEN + 1 + 10 + && name->data[name->len - 10 - 1] == '.') + { + return NGX_OK; + } + if (ctx->size < (off_t) sizeof(ngx_http_file_cache_header_t)) { ngx_log_error(NGX_LOG_CRIT, ctx->log, 0, "cache file \"%s\" is too small", name->data); @@ -2242,7 +2267,6 @@ off_t max_size; u_char *last, *p; time_t inactive; - size_t len; ssize_t size; ngx_str_t s, name, *value; ngx_int_t loader_files, manager_files; @@ -2515,37 +2539,6 @@ return NGX_CONF_ERROR; } - if (!use_temp_path) { - cache->temp_path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t)); - if (cache->temp_path == NULL) { - return NGX_CONF_ERROR; - } - - len = cache->path->name.len + sizeof("/temp") - 1; - - p = ngx_pnalloc(cf->pool, len + 1); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - cache->temp_path->name.len = len; - cache->temp_path->name.data = p; - - p = ngx_cpymem(p, cache->path->name.data, cache->path->name.len); - ngx_memcpy(p, "/temp", sizeof("/temp")); - - ngx_memcpy(&cache->temp_path->level, &cache->path->level, - NGX_MAX_PATH_LEVEL * sizeof(size_t)); - - cache->temp_path->len = cache->path->len; - cache->temp_path->conf_file = cf->conf_file->file.name.data; - cache->temp_path->line = cf->conf_file->line; - - if (ngx_add_path(cf, &cache->temp_path) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - cache->shm_zone = ngx_shared_memory_add(cf, &name, size, cmd->post); if (cache->shm_zone == NULL) { return NGX_CONF_ERROR; @@ -2561,6 +2554,8 @@ cache->shm_zone->init = ngx_http_file_cache_init; cache->shm_zone->data = cache; + cache->use_temp_path = use_temp_path; + cache->inactive = inactive; cache->max_size = max_size; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/ngx_http_special_response.c ^ |
@@ -473,7 +473,6 @@ case NGX_HTTPS_NO_CERT: case NGX_HTTP_REQUEST_HEADER_TOO_LARGE: r->err_status = NGX_HTTP_BAD_REQUEST; - break; } } else { | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/ngx_http_upstream.c ^ |
@@ -17,6 +17,8 @@ ngx_http_upstream_t *u, ngx_http_file_cache_t **cache); static ngx_int_t ngx_http_upstream_cache_send(ngx_http_request_t *r, ngx_http_upstream_t *u); +static ngx_int_t ngx_http_upstream_cache_check_range(ngx_http_request_t *r, + ngx_http_upstream_t *u); static ngx_int_t ngx_http_upstream_cache_status(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data); static ngx_int_t ngx_http_upstream_cache_last_modified(ngx_http_request_t *r, @@ -654,6 +656,23 @@ host = &u->resolved->host; + umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module); + + uscfp = umcf->upstreams.elts; + + for (i = 0; i < umcf->upstreams.nelts; i++) { + + uscf = uscfp[i]; + + if (uscf->host.len == host->len + && ((uscf->port == 0 && u->resolved->no_port) + || uscf->port == u->resolved->port) + && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0) + { + goto found; + } + } + if (u->resolved->sockaddr) { if (u->resolved->port == 0 @@ -679,23 +698,6 @@ return; } - umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module); - - uscfp = umcf->upstreams.elts; - - for (i = 0; i < umcf->upstreams.nelts; i++) { - - uscf = uscfp[i]; - - if (uscf->host.len == host->len - && ((uscf->port == 0 && u->resolved->no_port) - || uscf->port == u->resolved->port) - && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0) - { - goto found; - } - } - if (u->resolved->port == 0) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no port in upstream \"%V\"", host); @@ -922,6 +924,10 @@ return rc; } + if (ngx_http_upstream_cache_check_range(r, u) == NGX_DECLINED) { + u->cacheable = 0; + } + r->cached = 0; return NGX_DECLINED; @@ -1023,6 +1029,55 @@ return rc; } + +static ngx_int_t +ngx_http_upstream_cache_check_range(ngx_http_request_t *r, + ngx_http_upstream_t *u) +{ + off_t offset; + u_char *p, *start; + ngx_table_elt_t *h; + + h = r->headers_in.range; + + if (h == NULL + || !u->cacheable + || u->conf->cache_max_range_offset == NGX_MAX_OFF_T_VALUE) + { + return NGX_OK; + } + + if (u->conf->cache_max_range_offset == 0) { + return NGX_DECLINED; + } + + if (h->value.len < 7 + || ngx_strncasecmp(h->value.data, (u_char *) "bytes=", 6) != 0) + { + return NGX_OK; + } + + p = h->value.data + 6; + + while (*p == ' ') { p++; } + + if (*p == '-') { + return NGX_DECLINED; + } + + start = p; + + while (*p >= '0' && *p <= '9') { p++; } + + offset = ngx_atoof(start, p - start); + + if (offset >= u->conf->cache_max_range_offset) { + return NGX_DECLINED; + } + + return NGX_OK; +} + #endif @@ -1611,6 +1666,13 @@ return; } + if (c->write->timedout) { + c = r->connection; + ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT); + ngx_http_run_posted_requests(c); + return; + } + failed: c = r->connection; @@ -1696,7 +1758,10 @@ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "upstream SSL server name: \"%s\"", name.data); - if (SSL_set_tlsext_host_name(c->ssl->connection, name.data) == 0) { + if (SSL_set_tlsext_host_name(c->ssl->connection, + (char *) name.data) + == 0) + { ngx_ssl_error(NGX_LOG_ERR, r->connection->log, 0, "SSL_set_tlsext_host_name(\"%s\") failed", name.data); return NGX_ERROR; @@ -2702,6 +2767,15 @@ u->header_sent = 1; if (u->upgrade) { + +#if (NGX_HTTP_CACHE) + + if (r->cache) { + ngx_http_file_cache_free(r->cache, u->pipe->temp_file); + } + +#endif + ngx_http_upstream_upgrade(r, u); return; } @@ -2732,6 +2806,14 @@ if (!u->buffering) { +#if (NGX_HTTP_CACHE) + + if (r->cache) { + ngx_http_file_cache_free(r->cache, u->pipe->temp_file); + } + +#endif + if (u->input_filter == NULL) { u->input_filter_init = ngx_http_upstream_non_buffered_filter_init; u->input_filter = ngx_http_upstream_non_buffered_filter; @@ -2922,8 +3004,9 @@ p->temp_file->persistent = 1; #if (NGX_HTTP_CACHE) - if (r->cache && r->cache->file_cache->temp_path) { - p->temp_file->path = r->cache->file_cache->temp_path; + if (r->cache && !r->cache->file_cache->use_temp_path) { + p->temp_file->path = r->cache->file_cache->path; + p->temp_file->file.name = r->cache->file.name; } #endif @@ -5757,14 +5840,9 @@ continue; } - if (uscfp[i]->default_port && u->default_port - && uscfp[i]->default_port != u->default_port) - { - continue; - } - if (flags & NGX_HTTP_UPSTREAM_CREATE) { uscfp[i]->flags = flags; + uscfp[i]->port = 0; } return uscfp[i]; @@ -5780,7 +5858,6 @@ uscf->file_name = cf->conf_file->file.name.data; uscf->line = cf->conf_file->line; uscf->port = u->port; - uscf->default_port = u->default_port; uscf->no_port = u->no_port; if (u->naddrs == 1 && (u->port || u->family == AF_UNIX)) { @@ -6021,12 +6098,7 @@ conf->hide_headers_hash = prev->hide_headers_hash; - if (conf->hide_headers_hash.buckets -#if (NGX_HTTP_CACHE) - && ((conf->cache == 0) == (prev->cache == 0)) -#endif - ) - { + if (conf->hide_headers_hash.buckets) { return NGX_OK; } @@ -6111,7 +6183,23 @@ hash->pool = cf->pool; hash->temp_pool = NULL; - return ngx_hash_init(hash, hide_headers.elts, hide_headers.nelts); + if (ngx_hash_init(hash, hide_headers.elts, hide_headers.nelts) != NGX_OK) { + return NGX_ERROR; + } + + /* + * special handling to preserve conf->hide_headers_hash + * in the "http" section to inherit it to all servers + */ + + if (prev->hide_headers_hash.buckets == NULL + && conf->hide_headers == prev->hide_headers + && conf->pass_headers == prev->pass_headers) + { + prev->hide_headers_hash = conf->hide_headers_hash; + } + + return NGX_OK; } | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/ngx_http_upstream.h ^ |
@@ -128,7 +128,6 @@ u_char *file_name; ngx_uint_t line; in_port_t port; - in_port_t default_port; ngx_uint_t no_port; /* unsigned no_port:1 */ #if (NGX_HTTP_UPSTREAM_ZONE) @@ -199,6 +198,8 @@ ngx_uint_t cache_use_stale; ngx_uint_t cache_methods; + off_t cache_max_range_offset; + ngx_flag_t cache_lock; ngx_msec_t cache_lock_timeout; ngx_msec_t cache_lock_age; @@ -300,6 +301,7 @@ struct sockaddr *sockaddr; socklen_t socklen; + ngx_str_t name; ngx_resolver_ctx_t *ctx; } ngx_http_upstream_resolved_t; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/ngx_http_upstream_round_robin.c ^ |
@@ -337,7 +337,7 @@ if (ur->sockaddr) { peer[0].sockaddr = ur->sockaddr; peer[0].socklen = ur->socklen; - peer[0].name = ur->host; + peer[0].name = ur->name.data ? ur->name : ur->host; peer[0].weight = 1; peer[0].effective_weight = 1; peer[0].current_weight = 0; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/v2/ngx_http_v2.c ^ |
@@ -136,6 +136,8 @@ ngx_uint_t sid, size_t window); static ngx_int_t ngx_http_v2_send_rst_stream(ngx_http_v2_connection_t *h2c, ngx_uint_t sid, ngx_uint_t status); +static ngx_int_t ngx_http_v2_send_goaway(ngx_http_v2_connection_t *h2c, + ngx_uint_t status); static ngx_http_v2_out_frame_t *ngx_http_v2_get_frame( ngx_http_v2_connection_t *h2c, size_t length, ngx_uint_t type, @@ -293,6 +295,8 @@ rev->handler = ngx_http_v2_read_handler; c->write->handler = ngx_http_v2_write_handler; + c->idle = 1; + ngx_http_v2_read_handler(rev); } @@ -320,6 +324,30 @@ h2c->blocked = 1; + if (c->close) { + c->close = 0; + + if (!h2c->goaway) { + h2c->goaway = 1; + + if (ngx_http_v2_send_goaway(h2c, NGX_HTTP_V2_NO_ERROR) + == NGX_ERROR) + { + ngx_http_v2_finalize_connection(h2c, 0); + return; + } + + if (ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) { + ngx_http_v2_finalize_connection(h2c, 0); + return; + } + } + + h2c->blocked = 0; + + return; + } + h2mcf = ngx_http_get_module_main_conf(h2c->http_connection->conf_ctx, ngx_http_v2_module); @@ -633,6 +661,11 @@ /* rc == NGX_OK */ } + if (h2c->goaway) { + ngx_http_close_connection(c); + return; + } + h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx, ngx_http_v2_module); if (h2c->state.incomplete) { @@ -640,11 +673,6 @@ return; } - if (ngx_terminate || ngx_exiting) { - ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_NO_ERROR); - return; - } - ngx_destroy_pool(h2c->pool); h2c->pool = NULL; @@ -658,7 +686,6 @@ #endif c->destroyed = 1; - c->idle = 1; ngx_reusable_connection(c, 1); c->write->handler = ngx_http_empty_handler; @@ -1027,6 +1054,12 @@ return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); } + if (h2c->goaway) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, + "skipping http2 HEADERS frame"); + return ngx_http_v2_state_skip(h2c, pos, end); + } + if ((size_t) (end - pos) < size) { return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_headers); @@ -1149,6 +1182,15 @@ ngx_http_v2_set_dependency(h2c, node, depend, excl); } + if (h2c->connection->requests >= h2scf->max_requests) { + h2c->goaway = 1; + + if (ngx_http_v2_send_goaway(h2c, NGX_HTTP_V2_NO_ERROR) == NGX_ERROR) { + return ngx_http_v2_connection_error(h2c, + NGX_HTTP_V2_INTERNAL_ERROR); + } + } + return ngx_http_v2_state_header_block(h2c, pos, end); rst_stream: @@ -2550,7 +2592,7 @@ ngx_http_v2_out_frame_t *frame; ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 send RST_STREAM frame sid:%ui, status:%uz", + "http2 send RST_STREAM frame sid:%ui, status:%ui", sid, status); frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_RST_STREAM_SIZE, @@ -2576,8 +2618,9 @@ ngx_buf_t *buf; ngx_http_v2_out_frame_t *frame; - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 send GOAWAY frame, status:%uz", status); + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, + "http2 send GOAWAY frame: last sid %ui, error %ui", + h2c->last_sid, status); frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_GOAWAY_SIZE, NGX_HTTP_V2_GOAWAY_FRAME, @@ -4162,7 +4205,6 @@ #endif c->destroyed = 0; - c->idle = 0; ngx_reusable_connection(c, 0); h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx, @@ -4197,8 +4239,10 @@ h2c->blocked = 1; - if (!c->error && ngx_http_v2_send_goaway(h2c, status) != NGX_ERROR) { - (void) ngx_http_v2_send_output_queue(h2c); + if (!c->error && !h2c->goaway) { + if (ngx_http_v2_send_goaway(h2c, status) != NGX_ERROR) { + (void) ngx_http_v2_send_output_queue(h2c); + } } c->error = 1; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/v2/ngx_http_v2.h ^ |
@@ -146,6 +146,7 @@ unsigned closed_nodes:8; unsigned settings_ack:1; unsigned blocked:1; + unsigned goaway:1; }; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/v2/ngx_http_v2_filter_module.c ^ |
@@ -1079,6 +1079,10 @@ ngx_http_v2_flow_control(ngx_http_v2_connection_t *h2c, ngx_http_v2_stream_t *stream) { + ngx_log_debug3(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, + "http2:%ui available windows: conn:%uz stream:%z", + stream->node->id, h2c->send_window, stream->send_window); + if (stream->send_window <= 0) { stream->exhausted = 1; return NGX_DECLINED; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/v2/ngx_http_v2_module.c ^ |
@@ -73,6 +73,13 @@ offsetof(ngx_http_v2_srv_conf_t, concurrent_streams), NULL }, + { ngx_string("http2_max_requests"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_num_slot, + NGX_HTTP_SRV_CONF_OFFSET, + offsetof(ngx_http_v2_srv_conf_t, max_requests), + NULL }, + { ngx_string("http2_max_field_size"), NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, ngx_conf_set_size_slot, @@ -322,6 +329,7 @@ h2scf->pool_size = NGX_CONF_UNSET_SIZE; h2scf->concurrent_streams = NGX_CONF_UNSET_UINT; + h2scf->max_requests = NGX_CONF_UNSET_UINT; h2scf->max_field_size = NGX_CONF_UNSET_SIZE; h2scf->max_header_size = NGX_CONF_UNSET_SIZE; @@ -347,6 +355,7 @@ ngx_conf_merge_uint_value(conf->concurrent_streams, prev->concurrent_streams, 128); + ngx_conf_merge_uint_value(conf->max_requests, prev->max_requests, 1000); ngx_conf_merge_size_value(conf->max_field_size, prev->max_field_size, 4096); | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/http/v2/ngx_http_v2_module.h ^ |
@@ -23,6 +23,7 @@ typedef struct { size_t pool_size; ngx_uint_t concurrent_streams; + ngx_uint_t max_requests; size_t max_field_size; size_t max_header_size; size_t preread_size; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/mail/ngx_mail.h ^ |
@@ -132,7 +132,8 @@ ngx_pop3_auth_login_username, ngx_pop3_auth_login_password, ngx_pop3_auth_plain, - ngx_pop3_auth_cram_md5 + ngx_pop3_auth_cram_md5, + ngx_pop3_auth_external } ngx_pop3_state_e; @@ -142,6 +143,7 @@ ngx_imap_auth_login_password, ngx_imap_auth_plain, ngx_imap_auth_cram_md5, + ngx_imap_auth_external, ngx_imap_login, ngx_imap_user, ngx_imap_passwd @@ -154,6 +156,7 @@ ngx_smtp_auth_login_password, ngx_smtp_auth_plain, ngx_smtp_auth_cram_md5, + ngx_smtp_auth_external, ngx_smtp_helo, ngx_smtp_helo_xclient, ngx_smtp_helo_from, @@ -285,14 +288,16 @@ #define NGX_MAIL_AUTH_LOGIN_USERNAME 2 #define NGX_MAIL_AUTH_APOP 3 #define NGX_MAIL_AUTH_CRAM_MD5 4 -#define NGX_MAIL_AUTH_NONE 5 +#define NGX_MAIL_AUTH_EXTERNAL 5 +#define NGX_MAIL_AUTH_NONE 6 #define NGX_MAIL_AUTH_PLAIN_ENABLED 0x0002 #define NGX_MAIL_AUTH_LOGIN_ENABLED 0x0004 #define NGX_MAIL_AUTH_APOP_ENABLED 0x0008 #define NGX_MAIL_AUTH_CRAM_MD5_ENABLED 0x0010 -#define NGX_MAIL_AUTH_NONE_ENABLED 0x0020 +#define NGX_MAIL_AUTH_EXTERNAL_ENABLED 0x0020 +#define NGX_MAIL_AUTH_NONE_ENABLED 0x0040 #define NGX_MAIL_PARSE_INVALID_COMMAND 20 @@ -377,6 +382,8 @@ ngx_int_t ngx_mail_auth_cram_md5_salt(ngx_mail_session_t *s, ngx_connection_t *c, char *prefix, size_t len); ngx_int_t ngx_mail_auth_cram_md5(ngx_mail_session_t *s, ngx_connection_t *c); +ngx_int_t ngx_mail_auth_external(ngx_mail_session_t *s, ngx_connection_t *c, + ngx_uint_t n); ngx_int_t ngx_mail_auth_parse(ngx_mail_session_t *s, ngx_connection_t *c); void ngx_mail_send(ngx_event_t *wev); | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/mail/ngx_mail_auth_http_module.c ^ |
@@ -151,6 +151,7 @@ ngx_string("plain"), ngx_string("apop"), ngx_string("cram-md5"), + ngx_string("external"), ngx_string("none") }; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/mail/ngx_mail_handler.c ^ |
@@ -612,6 +612,40 @@ } +ngx_int_t +ngx_mail_auth_external(ngx_mail_session_t *s, ngx_connection_t *c, + ngx_uint_t n) +{ + ngx_str_t *arg, external; + + arg = s->args.elts; + + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, + "mail auth external: \"%V\"", &arg[n]); + + external.data = ngx_pnalloc(c->pool, ngx_base64_decoded_length(arg[n].len)); + if (external.data == NULL) { + return NGX_ERROR; + } + + if (ngx_decode_base64(&external, &arg[n]) != NGX_OK) { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "client sent invalid base64 encoding in AUTH EXTERNAL command"); + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + s->login.len = external.len; + s->login.data = external.data; + + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, + "mail auth external: \"%V\"", &s->login); + + s->auth_method = NGX_MAIL_AUTH_EXTERNAL; + + return NGX_DONE; +} + + void ngx_mail_send(ngx_event_t *wev) { | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/mail/ngx_mail_imap_handler.c ^ |
@@ -222,6 +222,10 @@ case ngx_imap_auth_cram_md5: rc = ngx_mail_auth_cram_md5(s, c); break; + + case ngx_imap_auth_external: + rc = ngx_mail_auth_external(s, c, 0); + break; } } else if (rc == NGX_IMAP_NEXT) { @@ -399,6 +403,13 @@ } return NGX_ERROR; + + case NGX_MAIL_AUTH_EXTERNAL: + + ngx_str_set(&s->out, imap_username); + s->mail_state = ngx_imap_auth_external; + + return NGX_OK; } return rc; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/mail/ngx_mail_imap_module.c ^ |
@@ -29,6 +29,7 @@ { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED }, { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED }, { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED }, + { ngx_string("external"), NGX_MAIL_AUTH_EXTERNAL_ENABLED }, { ngx_null_string, 0 } }; @@ -38,6 +39,7 @@ ngx_string("AUTH=LOGIN"), ngx_null_string, /* APOP */ ngx_string("AUTH=CRAM-MD5"), + ngx_string("AUTH=EXTERNAL"), ngx_null_string /* NONE */ }; @@ -179,7 +181,7 @@ } for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; - m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED; + m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; m <<= 1, i++) { if (m & conf->auth_methods) { @@ -205,7 +207,7 @@ auth = p; for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; - m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED; + m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; m <<= 1, i++) { if (m & conf->auth_methods) { | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/mail/ngx_mail_parse.c ^ |
@@ -905,13 +905,27 @@ if (arg[0].len == 8) { - if (s->args.nelts != 1) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - if (ngx_strncasecmp(arg[0].data, (u_char *) "CRAM-MD5", 8) == 0) { + + if (s->args.nelts != 1) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + return NGX_MAIL_AUTH_CRAM_MD5; } + + if (ngx_strncasecmp(arg[0].data, (u_char *) "EXTERNAL", 8) == 0) { + + if (s->args.nelts == 1) { + return NGX_MAIL_AUTH_EXTERNAL; + } + + if (s->args.nelts == 2) { + return ngx_mail_auth_external(s, c, 1); + } + } + + return NGX_MAIL_PARSE_INVALID_COMMAND; } return NGX_MAIL_PARSE_INVALID_COMMAND; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/mail/ngx_mail_pop3_handler.c ^ |
@@ -240,6 +240,10 @@ case ngx_pop3_auth_cram_md5: rc = ngx_mail_auth_cram_md5(s, c); break; + + case ngx_pop3_auth_external: + rc = ngx_mail_auth_external(s, c, 0); + break; } } @@ -494,6 +498,13 @@ } return NGX_ERROR; + + case NGX_MAIL_AUTH_EXTERNAL: + + ngx_str_set(&s->out, pop3_username); + s->mail_state = ngx_pop3_auth_external; + + return NGX_OK; } return rc; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/mail/ngx_mail_pop3_module.c ^ |
@@ -29,23 +29,19 @@ { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED }, { ngx_string("apop"), NGX_MAIL_AUTH_APOP_ENABLED }, { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED }, + { ngx_string("external"), NGX_MAIL_AUTH_EXTERNAL_ENABLED }, { ngx_null_string, 0 } }; -static ngx_str_t ngx_mail_pop3_auth_plain_capability = - ngx_string("+OK methods supported:" CRLF - "LOGIN" CRLF - "PLAIN" CRLF - "." CRLF); - - -static ngx_str_t ngx_mail_pop3_auth_cram_md5_capability = - ngx_string("+OK methods supported:" CRLF - "LOGIN" CRLF - "PLAIN" CRLF - "CRAM-MD5" CRLF - "." CRLF); +static ngx_str_t ngx_mail_pop3_auth_methods_names[] = { + ngx_string("PLAIN"), + ngx_string("LOGIN"), + ngx_null_string, /* APOP */ + ngx_string("CRAM-MD5"), + ngx_string("EXTERNAL"), + ngx_null_string /* NONE */ +}; static ngx_mail_protocol_t ngx_mail_pop3_protocol = { @@ -140,13 +136,17 @@ u_char *p; size_t size, stls_only_size; ngx_str_t *c, *d; - ngx_uint_t i; + ngx_uint_t i, m; ngx_conf_merge_bitmask_value(conf->auth_methods, prev->auth_methods, (NGX_CONF_BITMASK_SET |NGX_MAIL_AUTH_PLAIN_ENABLED)); + if (conf->auth_methods & NGX_MAIL_AUTH_PLAIN_ENABLED) { + conf->auth_methods |= NGX_MAIL_AUTH_LOGIN_ENABLED; + } + if (conf->capabilities.nelts == 0) { conf->capabilities = prev->capabilities; } @@ -179,11 +179,15 @@ stls_only_size += c[i].len + sizeof(CRLF) - 1; } - if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) { - size += sizeof("SASL LOGIN PLAIN CRAM-MD5" CRLF) - 1; + size += sizeof("SASL") - 1 + sizeof(CRLF) - 1; - } else { - size += sizeof("SASL LOGIN PLAIN" CRLF) - 1; + for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; + m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; + m <<= 1, i++) + { + if (m & conf->auth_methods) { + size += 1 + ngx_mail_pop3_auth_methods_names[i].len; + } } p = ngx_pnalloc(cf->pool, size); @@ -202,15 +206,21 @@ *p++ = CR; *p++ = LF; } - if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) { - p = ngx_cpymem(p, "SASL LOGIN PLAIN CRAM-MD5" CRLF, - sizeof("SASL LOGIN PLAIN CRAM-MD5" CRLF) - 1); - - } else { - p = ngx_cpymem(p, "SASL LOGIN PLAIN" CRLF, - sizeof("SASL LOGIN PLAIN" CRLF) - 1); + p = ngx_cpymem(p, "SASL", sizeof("SASL") - 1); + + for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; + m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; + m <<= 1, i++) + { + if (m & conf->auth_methods) { + *p++ = ' '; + p = ngx_cpymem(p, ngx_mail_pop3_auth_methods_names[i].data, + ngx_mail_pop3_auth_methods_names[i].len); + } } + *p++ = CR; *p++ = LF; + *p++ = '.'; *p++ = CR; *p = LF; @@ -231,13 +241,43 @@ *p++ = '.'; *p++ = CR; *p = LF; - if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) { - conf->auth_capability = ngx_mail_pop3_auth_cram_md5_capability; + size = sizeof("+OK methods supported:" CRLF) - 1 + + sizeof("." CRLF) - 1; - } else { - conf->auth_capability = ngx_mail_pop3_auth_plain_capability; + for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; + m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; + m <<= 1, i++) + { + if (m & conf->auth_methods) { + size += ngx_mail_pop3_auth_methods_names[i].len + + sizeof(CRLF) - 1; + } } + p = ngx_pnalloc(cf->pool, size); + if (p == NULL) { + return NGX_CONF_ERROR; + } + + conf->auth_capability.data = p; + conf->auth_capability.len = size; + + p = ngx_cpymem(p, "+OK methods supported:" CRLF, + sizeof("+OK methods supported:" CRLF) - 1); + + for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; + m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; + m <<= 1, i++) + { + if (m & conf->auth_methods) { + p = ngx_cpymem(p, ngx_mail_pop3_auth_methods_names[i].data, + ngx_mail_pop3_auth_methods_names[i].len); + *p++ = CR; *p++ = LF; + } + } + + *p++ = '.'; *p++ = CR; *p = LF; + p = ngx_pnalloc(cf->pool, stls_only_size); if (p == NULL) { | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/mail/ngx_mail_smtp_handler.c ^ |
@@ -485,6 +485,10 @@ case ngx_smtp_auth_cram_md5: rc = ngx_mail_auth_cram_md5(s, c); break; + + case ngx_smtp_auth_external: + rc = ngx_mail_auth_external(s, c, 0); + break; } } @@ -652,6 +656,13 @@ } return NGX_ERROR; + + case NGX_MAIL_AUTH_EXTERNAL: + + ngx_str_set(&s->out, smtp_username); + s->mail_state = ngx_smtp_auth_external; + + return NGX_OK; } return rc; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/mail/ngx_mail_smtp_module.c ^ |
@@ -21,6 +21,7 @@ { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED }, { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED }, { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED }, + { ngx_string("external"), NGX_MAIL_AUTH_EXTERNAL_ENABLED }, { ngx_string("none"), NGX_MAIL_AUTH_NONE_ENABLED }, { ngx_null_string, 0 } }; @@ -31,6 +32,7 @@ ngx_string("LOGIN"), ngx_null_string, /* APOP */ ngx_string("CRAM-MD5"), + ngx_string("EXTERNAL"), ngx_null_string /* NONE */ }; @@ -207,7 +209,7 @@ auth_enabled = 0; for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; - m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED; + m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; m <<= 1, i++) { if (m & conf->auth_methods) { @@ -250,7 +252,7 @@ *p++ = 'A'; *p++ = 'U'; *p++ = 'T'; *p++ = 'H'; for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; - m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED; + m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; m <<= 1, i++) { if (m & conf->auth_methods) { | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/stream/ngx_stream_proxy_module.c ^ |
@@ -433,6 +433,23 @@ host = &u->resolved->host; + umcf = ngx_stream_get_module_main_conf(s, ngx_stream_upstream_module); + + uscfp = umcf->upstreams.elts; + + for (i = 0; i < umcf->upstreams.nelts; i++) { + + uscf = uscfp[i]; + + if (uscf->host.len == host->len + && ((uscf->port == 0 && u->resolved->no_port) + || uscf->port == u->resolved->port) + && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0) + { + goto found; + } + } + if (u->resolved->sockaddr) { if (u->resolved->port == 0 @@ -456,23 +473,6 @@ return; } - umcf = ngx_stream_get_module_main_conf(s, ngx_stream_upstream_module); - - uscfp = umcf->upstreams.elts; - - for (i = 0; i < umcf->upstreams.nelts; i++) { - - uscf = uscfp[i]; - - if (uscf->host.len == host->len - && ((uscf->port == 0 && u->resolved->no_port) - || uscf->port == u->resolved->port) - && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0) - { - goto found; - } - } - if (u->resolved->port == 0) { ngx_log_error(NGX_LOG_ERR, c->log, 0, "no port in upstream \"%V\"", host); @@ -578,16 +578,14 @@ return NGX_ERROR; } - if (url.addrs && url.addrs[0].sockaddr) { + if (url.addrs) { u->resolved->sockaddr = url.addrs[0].sockaddr; u->resolved->socklen = url.addrs[0].socklen; + u->resolved->name = url.addrs[0].name; u->resolved->naddrs = 1; - u->resolved->host = url.addrs[0].name; - - } else { - u->resolved->host = url.host; } + u->resolved->host = url.host; u->resolved->port = url.port; u->resolved->no_port = url.no_port; @@ -1183,7 +1181,8 @@ ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, "upstream SSL server name: \"%s\"", name.data); - if (SSL_set_tlsext_host_name(u->peer.connection->ssl->connection, name.data) + if (SSL_set_tlsext_host_name(u->peer.connection->ssl->connection, + (char *) name.data) == 0) { ngx_ssl_error(NGX_LOG_ERR, s->connection->log, 0, | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/stream/ngx_stream_upstream.h ^ |
@@ -105,6 +105,7 @@ struct sockaddr *sockaddr; socklen_t socklen; + ngx_str_t name; ngx_resolver_ctx_t *ctx; } ngx_stream_upstream_resolved_t; | ||
[+] | Changed | _service:download_url:nginx-1.11.6.tar.gz/src/stream/ngx_stream_upstream_round_robin.c ^ |
@@ -344,7 +344,7 @@ if (ur->sockaddr) { peer[0].sockaddr = ur->sockaddr; peer[0].socklen = ur->socklen; - peer[0].name = ur->host; + peer[0].name = ur->name; peer[0].weight = 1; peer[0].effective_weight = 1; peer[0].current_weight = 0; | ||
[+] | Changed | nginx-rtmp-module-1.1.10.tar.gz/config ^ |
@@ -1,6 +1,6 @@ ngx_addon_name="ngx_rtmp_module" -CORE_MODULES="$CORE_MODULES +RTMP_CORE_MODULES=" \ ngx_rtmp_module \ ngx_rtmp_core_module \ ngx_rtmp_cmd_module \ @@ -15,6 +15,7 @@ ngx_rtmp_relay_module \ ngx_rtmp_exec_module \ ngx_rtmp_auto_push_module \ + ngx_rtmp_auto_push_index_module \ ngx_rtmp_notify_module \ ngx_rtmp_log_module \ ngx_rtmp_limit_module \ @@ -23,13 +24,13 @@ " -HTTP_MODULES="$HTTP_MODULES \ +RTMP_HTTP_MODULES=" \ ngx_rtmp_stat_module \ ngx_rtmp_control_module \ " -NGX_ADDON_DEPS="$NGX_ADDON_DEPS \ +RTMP_DEPS=" \ $ngx_addon_dir/ngx_rtmp_amf.h \ $ngx_addon_dir/ngx_rtmp_bandwidth.h \ $ngx_addon_dir/ngx_rtmp_cmd_module.h \ @@ -50,7 +51,7 @@ " -NGX_ADDON_SRCS="$NGX_ADDON_SRCS \ +RTMP_CORE_SRCS=" \ $ngx_addon_dir/ngx_rtmp.c \ $ngx_addon_dir/ngx_rtmp_init.c \ $ngx_addon_dir/ngx_rtmp_handshake.c \ @@ -70,8 +71,6 @@ $ngx_addon_dir/ngx_rtmp_flv_module.c \ $ngx_addon_dir/ngx_rtmp_mp4_module.c \ $ngx_addon_dir/ngx_rtmp_netcall_module.c \ - $ngx_addon_dir/ngx_rtmp_stat_module.c \ - $ngx_addon_dir/ngx_rtmp_control_module.c \ $ngx_addon_dir/ngx_rtmp_relay_module.c \ $ngx_addon_dir/ngx_rtmp_bandwidth.c \ $ngx_addon_dir/ngx_rtmp_exec_module.c \ @@ -86,7 +85,49 @@ $ngx_addon_dir/hls/ngx_rtmp_mpegts.c \ $ngx_addon_dir/dash/ngx_rtmp_mp4.c \ " -CFLAGS="$CFLAGS -I$ngx_addon_dir" + + +RTMP_HTTP_SRCS=" \ + $ngx_addon_dir/ngx_rtmp_stat_module.c \ + $ngx_addon_dir/ngx_rtmp_control_module.c \ + " + +if [ -f auto/module ] ; then + ngx_module_incs=$ngx_addon_dir + ngx_module_deps=$RTMP_DEPS + + if [ $ngx_module_link = DYNAMIC ] ; then + ngx_module_name="$RTMP_CORE_MODULES $RTMP_HTTP_MODULES" + ngx_module_srcs="$RTMP_CORE_SRCS $RTMP_HTTP_SRCS" + + . auto/module + + else + ngx_module_type=CORE + ngx_module_name=$RTMP_CORE_MODULES + ngx_module_srcs=$RTMP_CORE_SRCS + + . auto/module + + + ngx_module_type=HTTP + ngx_module_name=$RTMP_HTTP_MODULES + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=$RTMP_HTTP_SRCS + + . auto/module + fi + +else + CORE_MODULES="$CORE_MODULES $RTMP_CORE_MODULES" + HTTP_MODULES="$HTTP_MODULES $RTMP_HTTP_MODULES" + + NGX_ADDON_DEPS="$NGX_ADDON_DEPS $RTMP_DEPS" + NGX_ADDON_SRCS="$NGX_ADDON_SRCS $RTMP_CORE_SRCS $RTMP_HTTP_SRCS" + + CFLAGS="$CFLAGS -I$ngx_addon_dir" +fi USE_OPENSSL=YES | ||
[+] | Changed | nginx-rtmp-module-1.1.10.tar.gz/dash/ngx_rtmp_dash_module.c ^ |
@@ -1413,14 +1413,22 @@ } +#if (nginx_version >= 1011005) +static ngx_msec_t +#else static time_t +#endif ngx_rtmp_dash_cleanup(void *data) { ngx_rtmp_dash_cleanup_t *cleanup = data; ngx_rtmp_dash_cleanup_dir(&cleanup->path, cleanup->playlen); +#if (nginx_version >= 1011005) + return cleanup->playlen * 2; +#else return cleanup->playlen / 500; +#endif } | ||
[+] | Changed | nginx-rtmp-module-1.1.10.tar.gz/hls/ngx_rtmp_hls_module.c ^ |
@@ -2210,14 +2210,22 @@ } +#if (nginx_version >= 1011005) +static ngx_msec_t +#else static time_t +#endif ngx_rtmp_hls_cleanup(void *data) { ngx_rtmp_hls_cleanup_t *cleanup = data; ngx_rtmp_hls_cleanup_dir(&cleanup->path, cleanup->playlen); +#if (nginx_version >= 1011005) + return cleanup->playlen * 2; +#else return cleanup->playlen / 500; +#endif } | ||
[+] | Changed | nginx-rtmp-module-1.1.10.tar.gz/ngx_rtmp.c ^ |
@@ -87,6 +87,7 @@ ngx_uint_t i, m, mi, s; ngx_conf_t pcf; ngx_array_t ports; + ngx_module_t **modules; ngx_rtmp_listen_t *listen; ngx_rtmp_module_t *module; ngx_rtmp_conf_ctx_t *ctx; @@ -102,6 +103,12 @@ /* count the number of the rtmp modules and set up their indices */ +#if (nginx_version >= 1009011) + + ngx_rtmp_max_module = ngx_count_modules(cf->cycle, NGX_RTMP_MODULE); + +#else + ngx_rtmp_max_module = 0; for (m = 0; ngx_modules[m]; m++) { if (ngx_modules[m]->type != NGX_RTMP_MODULE) { @@ -111,6 +118,8 @@ ngx_modules[m]->ctx_index = ngx_rtmp_max_module++; } +#endif + /* the rtmp main_conf context, it is the same in the all rtmp contexts */ @@ -148,13 +157,19 @@ * of the all rtmp modules */ - for (m = 0; ngx_modules[m]; m++) { - if (ngx_modules[m]->type != NGX_RTMP_MODULE) { +#if (nginx_version >= 1009011) + modules = cf->cycle->modules; +#else + modules = ngx_modules; +#endif + + for (m = 0; modules[m]; m++) { + if (modules[m]->type != NGX_RTMP_MODULE) { continue; } - module = ngx_modules[m]->ctx; - mi = ngx_modules[m]->ctx_index; + module = modules[m]->ctx; + mi = modules[m]->ctx_index; if (module->create_main_conf) { ctx->main_conf[mi] = module->create_main_conf(cf); @@ -181,12 +196,12 @@ pcf = *cf; cf->ctx = ctx; - for (m = 0; ngx_modules[m]; m++) { - if (ngx_modules[m]->type != NGX_RTMP_MODULE) { + for (m = 0; modules[m]; m++) { + if (modules[m]->type != NGX_RTMP_MODULE) { continue; } - module = ngx_modules[m]->ctx; + module = modules[m]->ctx; if (module->preconfiguration) { if (module->preconfiguration(cf) != NGX_OK) { @@ -212,13 +227,13 @@ cmcf = ctx->main_conf[ngx_rtmp_core_module.ctx_index]; cscfp = cmcf->servers.elts; - for (m = 0; ngx_modules[m]; m++) { - if (ngx_modules[m]->type != NGX_RTMP_MODULE) { + for (m = 0; modules[m]; m++) { + if (modules[m]->type != NGX_RTMP_MODULE) { continue; } - module = ngx_modules[m]->ctx; - mi = ngx_modules[m]->ctx_index; + module = modules[m]->ctx; + mi = modules[m]->ctx_index; /* init rtmp{} main_conf's */ @@ -283,12 +298,12 @@ return NGX_CONF_ERROR; } - for (m = 0; ngx_modules[m]; m++) { - if (ngx_modules[m]->type != NGX_RTMP_MODULE) { + for (m = 0; modules[m]; m++) { + if (modules[m]->type != NGX_RTMP_MODULE) { continue; } - module = ngx_modules[m]->ctx; + module = modules[m]->ctx; if (module->postconfiguration) { if (module->postconfiguration(cf) != NGX_OK) { | ||
[+] | Changed | nginx-rtmp-module-1.1.10.tar.gz/ngx_rtmp_auto_push_module.c ^ |
@@ -93,6 +93,34 @@ }; +static ngx_rtmp_module_t ngx_rtmp_auto_push_index_module_ctx = { + NULL, /* preconfiguration */ + NULL, /* postconfiguration */ + NULL, /* create main configuration */ + NULL, /* init main configuration */ + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + NULL, /* create app configuration */ + NULL /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_auto_push_index_module = { + NGX_MODULE_V1, + &ngx_rtmp_auto_push_index_module_ctx, /* module context */ + NULL, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + #define NGX_RTMP_AUTO_PUSH_SOCKNAME "nginx-rtmp" @@ -324,7 +352,7 @@ apcf = (ngx_rtmp_auto_push_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx, ngx_rtmp_auto_push_module); - ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_auto_push_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_auto_push_index_module); if (ctx == NULL) { return; } @@ -461,14 +489,14 @@ goto next; } - ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_auto_push_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_auto_push_index_module); if (ctx == NULL) { ctx = ngx_palloc(s->connection->pool, sizeof(ngx_rtmp_auto_push_ctx_t)); if (ctx == NULL) { goto next; } - ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_auto_push_module); + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_auto_push_index_module); } ngx_memzero(ctx, sizeof(*ctx)); @@ -508,7 +536,7 @@ goto next; } - ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_auto_push_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_auto_push_index_module); if (ctx) { if (ctx->push_evt.timer_set) { ngx_del_timer(&ctx->push_evt); @@ -532,7 +560,7 @@ slot, &rctx->app, &rctx->name); pctx = ngx_rtmp_get_module_ctx(rctx->publish->session, - ngx_rtmp_auto_push_module); + ngx_rtmp_auto_push_index_module); if (pctx == NULL) { goto next; } | ||
[+] | Changed | nginx-rtmp-module-1.1.10.tar.gz/ngx_rtmp_core_module.c ^ |
@@ -332,6 +332,7 @@ void *mconf; ngx_uint_t m; ngx_conf_t pcf; + ngx_module_t **modules; ngx_rtmp_module_t *module; ngx_rtmp_conf_ctx_t *ctx, *rtmp_ctx; ngx_rtmp_core_srv_conf_t *cscf, **cscfp; @@ -357,12 +358,18 @@ return NGX_CONF_ERROR; } - for (m = 0; ngx_modules[m]; m++) { - if (ngx_modules[m]->type != NGX_RTMP_MODULE) { +#if (nginx_version >= 1009011) + modules = cf->cycle->modules; +#else + modules = ngx_modules; +#endif + + for (m = 0; modules[m]; m++) { + if (modules[m]->type != NGX_RTMP_MODULE) { continue; } - module = ngx_modules[m]->ctx; + module = modules[m]->ctx; if (module->create_srv_conf) { mconf = module->create_srv_conf(cf); @@ -370,7 +377,7 @@ return NGX_CONF_ERROR; } - ctx->srv_conf[ngx_modules[m]->ctx_index] = mconf; + ctx->srv_conf[modules[m]->ctx_index] = mconf; } if (module->create_app_conf) { @@ -379,7 +386,7 @@ return NGX_CONF_ERROR; } - ctx->app_conf[ngx_modules[m]->ctx_index] = mconf; + ctx->app_conf[modules[m]->ctx_index] = mconf; } } @@ -419,6 +426,7 @@ ngx_int_t i; ngx_str_t *value; ngx_conf_t save; + ngx_module_t **modules; ngx_rtmp_module_t *module; ngx_rtmp_conf_ctx_t *ctx, *pctx; ngx_rtmp_core_srv_conf_t *cscf; @@ -438,17 +446,22 @@ return NGX_CONF_ERROR; } - for (i = 0; ngx_modules[i]; i++) { - if (ngx_modules[i]->type != NGX_RTMP_MODULE) { +#if (nginx_version >= 1009011) + modules = cf->cycle->modules; +#else + modules = ngx_modules; +#endif + + for (i = 0; modules[i]; i++) { + if (modules[i]->type != NGX_RTMP_MODULE) { continue; } - module = ngx_modules[i]->ctx; + module = modules[i]->ctx; if (module->create_app_conf) { - ctx->app_conf[ngx_modules[i]->ctx_index] = - module->create_app_conf(cf); - if (ctx->app_conf[ngx_modules[i]->ctx_index] == NULL) { + ctx->app_conf[modules[i]->ctx_index] = module->create_app_conf(cf); + if (ctx->app_conf[modules[i]->ctx_index] == NULL) { return NGX_CONF_ERROR; } } @@ -489,6 +502,7 @@ ngx_str_t *value; ngx_url_t u; ngx_uint_t i, m; + ngx_module_t **modules; struct sockaddr *sa; ngx_rtmp_listen_t *ls; struct sockaddr_in *sin; @@ -545,7 +559,9 @@ break; } - if (ngx_memcmp(ls[i].sockaddr + off, u.sockaddr + off, len) != 0) { + if (ngx_memcmp(ls[i].sockaddr + off, (u_char *) &u.sockaddr + off, len) + != 0) + { continue; } @@ -565,14 +581,20 @@ ngx_memzero(ls, sizeof(ngx_rtmp_listen_t)); - ngx_memcpy(ls->sockaddr, u.sockaddr, u.socklen); + ngx_memcpy(ls->sockaddr, (u_char *) &u.sockaddr, u.socklen); ls->socklen = u.socklen; ls->wildcard = u.wildcard; ls->ctx = cf->ctx; - for (m = 0; ngx_modules[m]; m++) { - if (ngx_modules[m]->type != NGX_RTMP_MODULE) { +#if (nginx_version >= 1009011) + modules = cf->cycle->modules; +#else + modules = ngx_modules; +#endif + + for (m = 0; modules[m]; m++) { + if (modules[m]->type != NGX_RTMP_MODULE) { continue; } } | ||
[+] | Changed | nginx-rtmp-module-1.1.10.tar.gz/ngx_rtmp_record_module.c ^ |
@@ -1195,6 +1195,7 @@ ngx_int_t i; ngx_str_t *value; ngx_conf_t save; + ngx_module_t **modules; ngx_rtmp_module_t *module; ngx_rtmp_core_app_conf_t *cacf, **pcacf, *rcacf; ngx_rtmp_record_app_conf_t *racf, **pracf, *rracf; @@ -1221,17 +1222,22 @@ return NGX_CONF_ERROR; } - for (i = 0; ngx_modules[i]; i++) { - if (ngx_modules[i]->type != NGX_RTMP_MODULE) { +#if (nginx_version >= 1009011) + modules = cf->cycle->modules; +#else + modules = ngx_modules; +#endif + + for (i = 0; modules[i]; i++) { + if (modules[i]->type != NGX_RTMP_MODULE) { continue; } - module = ngx_modules[i]->ctx; + module = modules[i]->ctx; if (module->create_app_conf) { - ctx->app_conf[ngx_modules[i]->ctx_index] = - module->create_app_conf(cf); - if (ctx->app_conf[ngx_modules[i]->ctx_index] == NULL) { + ctx->app_conf[modules[i]->ctx_index] = module->create_app_conf(cf); + if (ctx->app_conf[modules[i]->ctx_index] == NULL) { return NGX_CONF_ERROR; } } | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git ^ |
-(directory) | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/HEAD ^ |
@@ -1 +0,0 @@ -ref: refs/heads/master | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/config ^ |
@@ -1,12 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true -[remote "origin"] - fetch = +refs/heads/*:refs/remotes/origin/* - url = https://github.com/arut/nginx-rtmp-module.git -[branch "master"] - remote = origin - merge = refs/heads/master | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/description ^ |
@@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/hooks ^ |
-(directory) | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/hooks/applypatch-msg.sample ^ |
@@ -1,15 +0,0 @@ -#!/bin/sh -# -# An example hook script to check the commit log message taken by -# applypatch from an e-mail message. -# -# The hook should exit with non-zero status after issuing an -# appropriate message if it wants to stop the commit. The hook is -# allowed to edit the commit message file. -# -# To enable this hook, rename this file to "applypatch-msg". - -. git-sh-setup -test -x "$GIT_DIR/hooks/commit-msg" && - exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} -: | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/hooks/commit-msg.sample ^ |
@@ -1,24 +0,0 @@ -#!/bin/sh -# -# An example hook script to check the commit log message. -# Called by "git commit" with one argument, the name of the file -# that has the commit message. The hook should exit with non-zero -# status after issuing an appropriate message if it wants to stop the -# commit. The hook is allowed to edit the commit message file. -# -# To enable this hook, rename this file to "commit-msg". - -# Uncomment the below to add a Signed-off-by line to the message. -# Doing this in a hook is a bad idea in general, but the prepare-commit-msg -# hook is more suited to it. -# -# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') -# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" - -# This example catches duplicate Signed-off-by lines. - -test "" = "$(grep '^Signed-off-by: ' "$1" | - sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { - echo >&2 Duplicate Signed-off-by lines. - exit 1 -} | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/hooks/post-update.sample ^ |
@@ -1,8 +0,0 @@ -#!/bin/sh -# -# An example hook script to prepare a packed repository for use over -# dumb transports. -# -# To enable this hook, rename this file to "post-update". - -exec git update-server-info | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/hooks/pre-applypatch.sample ^ |
@@ -1,14 +0,0 @@ -#!/bin/sh -# -# An example hook script to verify what is about to be committed -# by applypatch from an e-mail message. -# -# The hook should exit with non-zero status after issuing an -# appropriate message if it wants to stop the commit. -# -# To enable this hook, rename this file to "pre-applypatch". - -. git-sh-setup -test -x "$GIT_DIR/hooks/pre-commit" && - exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} -: | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/hooks/pre-commit.sample ^ |
@@ -1,50 +0,0 @@ -#!/bin/sh -# -# An example hook script to verify what is about to be committed. -# Called by "git commit" with no arguments. The hook should -# exit with non-zero status after issuing an appropriate message if -# it wants to stop the commit. -# -# To enable this hook, rename this file to "pre-commit". - -if git rev-parse --verify HEAD >/dev/null 2>&1 -then - against=HEAD -else - # Initial commit: diff against an empty tree object - against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 -fi - -# If you want to allow non-ascii filenames set this variable to true. -allownonascii=$(git config hooks.allownonascii) - -# Redirect output to stderr. -exec 1>&2 - -# Cross platform projects tend to avoid non-ascii filenames; prevent -# them from being added to the repository. We exploit the fact that the -# printable range starts at the space character and ends with tilde. -if [ "$allownonascii" != "true" ] && - # Note that the use of brackets around a tr range is ok here, (it's - # even required, for portability to Solaris 10's /usr/bin/tr), since - # the square bracket bytes happen to fall in the designated range. - test $(git diff --cached --name-only --diff-filter=A -z $against | - LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 -then - echo "Error: Attempt to add a non-ascii file name." - echo - echo "This can cause problems if you want to work" - echo "with people on other platforms." - echo - echo "To be portable it is advisable to rename the file ..." - echo - echo "If you know what you are doing you can disable this" - echo "check using:" - echo - echo " git config hooks.allownonascii true" - echo - exit 1 -fi - -# If there are whitespace errors, print the offending file names and fail. -exec git diff-index --check --cached $against -- | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/hooks/pre-rebase.sample ^ |
@@ -1,169 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2006, 2008 Junio C Hamano -# -# The "pre-rebase" hook is run just before "git rebase" starts doing -# its job, and can prevent the command from running by exiting with -# non-zero status. -# -# The hook is called with the following parameters: -# -# $1 -- the upstream the series was forked from. -# $2 -- the branch being rebased (or empty when rebasing the current branch). -# -# This sample shows how to prevent topic branches that are already -# merged to 'next' branch from getting rebased, because allowing it -# would result in rebasing already published history. - -publish=next -basebranch="$1" -if test "$#" = 2 -then - topic="refs/heads/$2" -else - topic=`git symbolic-ref HEAD` || - exit 0 ;# we do not interrupt rebasing detached HEAD -fi - -case "$topic" in -refs/heads/??/*) - ;; -*) - exit 0 ;# we do not interrupt others. - ;; -esac - -# Now we are dealing with a topic branch being rebased -# on top of master. Is it OK to rebase it? - -# Does the topic really exist? -git show-ref -q "$topic" || { - echo >&2 "No such branch $topic" - exit 1 -} - -# Is topic fully merged to master? -not_in_master=`git rev-list --pretty=oneline ^master "$topic"` -if test -z "$not_in_master" -then - echo >&2 "$topic is fully merged to master; better remove it." - exit 1 ;# we could allow it, but there is no point. -fi - -# Is topic ever merged to next? If so you should not be rebasing it. -only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` -only_next_2=`git rev-list ^master ${publish} | sort` -if test "$only_next_1" = "$only_next_2" -then - not_in_topic=`git rev-list "^$topic" master` - if test -z "$not_in_topic" - then - echo >&2 "$topic is already up-to-date with master" - exit 1 ;# we could allow it, but there is no point. - else - exit 0 - fi -else - not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` - /usr/bin/perl -e ' - my $topic = $ARGV[0]; - my $msg = "* $topic has commits already merged to public branch:\n"; - my (%not_in_next) = map { - /^([0-9a-f]+) /; - ($1 => 1); - } split(/\n/, $ARGV[1]); - for my $elem (map { - /^([0-9a-f]+) (.*)$/; - [$1 => $2]; - } split(/\n/, $ARGV[2])) { - if (!exists $not_in_next{$elem->[0]}) { - if ($msg) { - print STDERR $msg; - undef $msg; - } - print STDERR " $elem->[1]\n"; - } - } - ' "$topic" "$not_in_next" "$not_in_master" - exit 1 -fi - -exit 0 - -################################################################ - -This sample hook safeguards topic branches that have been -published from being rewound. - -The workflow assumed here is: - - * Once a topic branch forks from "master", "master" is never - merged into it again (either directly or indirectly). - - * Once a topic branch is fully cooked and merged into "master", - it is deleted. If you need to build on top of it to correct - earlier mistakes, a new topic branch is created by forking at - the tip of the "master". This is not strictly necessary, but - it makes it easier to keep your history simple. - - * Whenever you need to test or publish your changes to topic - branches, merge them into "next" branch. - -The script, being an example, hardcodes the publish branch name -to be "next", but it is trivial to make it configurable via -$GIT_DIR/config mechanism. - -With this workflow, you would want to know: - -(1) ... if a topic branch has ever been merged to "next". Young - topic branches can have stupid mistakes you would rather - clean up before publishing, and things that have not been - merged into other branches can be easily rebased without - affecting other people. But once it is published, you would - not want to rewind it. - -(2) ... if a topic branch has been fully merged to "master". - Then you can delete it. More importantly, you should not - build on top of it -- other people may already want to - change things related to the topic as patches against your - "master", so if you need further changes, it is better to - fork the topic (perhaps with the same name) afresh from the - tip of "master". - -Let's look at this example: - - o---o---o---o---o---o---o---o---o---o "next" - / / / / - / a---a---b A / / - / / / / - / / c---c---c---c B / - / / / \ / - / / / b---b C \ / - / / / / \ / - ---o---o---o---o---o---o---o---o---o---o---o "master" - - -A, B and C are topic branches. - - * A has one fix since it was merged up to "next". - - * B has finished. It has been fully merged up to "master" and "next", - and is ready to be deleted. - - * C has not merged to "next" at all. - -We would want to allow C to be rebased, refuse A, and encourage -B to be deleted. - -To compute (1): - - git rev-list ^master ^topic next - git rev-list ^master next - - if these match, topic has not merged in next at all. - -To compute (2): - - git rev-list master..topic - - if this is empty, it is fully merged to "master". | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/hooks/prepare-commit-msg.sample ^ |
@@ -1,36 +0,0 @@ -#!/bin/sh -# -# An example hook script to prepare the commit log message. -# Called by "git commit" with the name of the file that has the -# commit message, followed by the description of the commit -# message's source. The hook's purpose is to edit the commit -# message file. If the hook fails with a non-zero status, -# the commit is aborted. -# -# To enable this hook, rename this file to "prepare-commit-msg". - -# This hook includes three examples. The first comments out the -# "Conflicts:" part of a merge commit. -# -# The second includes the output of "git diff --name-status -r" -# into the message, just before the "git status" output. It is -# commented because it doesn't cope with --amend or with squashed -# commits. -# -# The third example adds a Signed-off-by line to the message, that can -# still be edited. This is rarely a good idea. - -case "$2,$3" in - merge,) - /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; - -# ,|template,) -# /usr/bin/perl -i.bak -pe ' -# print "\n" . `git diff --cached --name-status -r` -# if /^#/ && $first++ == 0' "$1" ;; - - *) ;; -esac - -# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') -# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/hooks/update.sample ^ |
@@ -1,128 +0,0 @@ -#!/bin/sh -# -# An example hook script to blocks unannotated tags from entering. -# Called by "git receive-pack" with arguments: refname sha1-old sha1-new -# -# To enable this hook, rename this file to "update". -# -# Config -# ------ -# hooks.allowunannotated -# This boolean sets whether unannotated tags will be allowed into the -# repository. By default they won't be. -# hooks.allowdeletetag -# This boolean sets whether deleting tags will be allowed in the -# repository. By default they won't be. -# hooks.allowmodifytag -# This boolean sets whether a tag may be modified after creation. By default -# it won't be. -# hooks.allowdeletebranch -# This boolean sets whether deleting branches will be allowed in the -# repository. By default they won't be. -# hooks.denycreatebranch -# This boolean sets whether remotely creating branches will be denied -# in the repository. By default this is allowed. -# - -# --- Command line -refname="$1" -oldrev="$2" -newrev="$3" - -# --- Safety check -if [ -z "$GIT_DIR" ]; then - echo "Don't run this script from the command line." >&2 - echo " (if you want, you could supply GIT_DIR then run" >&2 - echo " $0 <ref> <oldrev> <newrev>)" >&2 - exit 1 -fi - -if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then - echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 - exit 1 -fi - -# --- Config -allowunannotated=$(git config --bool hooks.allowunannotated) -allowdeletebranch=$(git config --bool hooks.allowdeletebranch) -denycreatebranch=$(git config --bool hooks.denycreatebranch) -allowdeletetag=$(git config --bool hooks.allowdeletetag) -allowmodifytag=$(git config --bool hooks.allowmodifytag) - -# check for no description -projectdesc=$(sed -e '1q' "$GIT_DIR/description") -case "$projectdesc" in -"Unnamed repository"* | "") - echo "*** Project description file hasn't been set" >&2 - exit 1 - ;; -esac - -# --- Check types -# if $newrev is 0000...0000, it's a commit to delete a ref. -zero="0000000000000000000000000000000000000000" -if [ "$newrev" = "$zero" ]; then - newrev_type=delete -else - newrev_type=$(git cat-file -t $newrev) -fi - -case "$refname","$newrev_type" in - refs/tags/*,commit) - # un-annotated tag - short_refname=${refname##refs/tags/} - if [ "$allowunannotated" != "true" ]; then - echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 - echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 - exit 1 - fi - ;; - refs/tags/*,delete) - # delete tag - if [ "$allowdeletetag" != "true" ]; then - echo "*** Deleting a tag is not allowed in this repository" >&2 - exit 1 - fi - ;; - refs/tags/*,tag) - # annotated tag - if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 - then - echo "*** Tag '$refname' already exists." >&2 - echo "*** Modifying a tag is not allowed in this repository." >&2 - exit 1 - fi - ;; - refs/heads/*,commit) - # branch - if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then - echo "*** Creating a branch is not allowed in this repository" >&2 - exit 1 - fi - ;; - refs/heads/*,delete) - # delete branch - if [ "$allowdeletebranch" != "true" ]; then - echo "*** Deleting a branch is not allowed in this repository" >&2 - exit 1 - fi - ;; - refs/remotes/*,commit) - # tracking branch - ;; - refs/remotes/*,delete) - # delete tracking branch - if [ "$allowdeletebranch" != "true" ]; then - echo "*** Deleting a tracking branch is not allowed in this repository" >&2 - exit 1 - fi - ;; - *) - # Anything else (is there anything else?) - echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 - exit 1 - ;; -esac - -# --- Finished -exit 0 | ||
Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/index ^ | |
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/info ^ |
-(directory) | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/info/exclude ^ |
@@ -1,6 +0,0 @@ -# git ls-files --others --exclude-from=.git/info/exclude -# Lines that start with '#' are comments. -# For a project mostly in C, the following would be a good set of -# exclude patterns (uncomment them if you want to use them): -# *.[oa] -# *~ | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/logs ^ |
-(directory) | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/logs/HEAD ^ |
@@ -1 +0,0 @@ -0000000000000000000000000000000000000000 f62a0838064baf089ad9fe3c8f6f2ffe0775afb2 U-arrakis\jg <jg@arrakis.(none)> 1427318672 +0100 clone: from https://github.com/arut/nginx-rtmp-module.git | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/logs/refs ^ |
-(directory) | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/logs/refs/heads ^ |
-(directory) | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/logs/refs/heads/master ^ |
@@ -1 +0,0 @@ -0000000000000000000000000000000000000000 f62a0838064baf089ad9fe3c8f6f2ffe0775afb2 U-arrakis\jg <jg@arrakis.(none)> 1427318672 +0100 clone: from https://github.com/arut/nginx-rtmp-module.git | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/objects ^ |
-(directory) | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/objects/info ^ |
-(directory) | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/objects/pack ^ |
-(directory) | ||
Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/objects/pack/pack-686bc6bc8fcdb3e761bdb3796272cf46a06043ac.idx ^ | |
Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/objects/pack/pack-686bc6bc8fcdb3e761bdb3796272cf46a06043ac.pack ^ | |
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/packed-refs ^ |
@@ -1,363 +0,0 @@ -# pack-refs with: peeled -406d3a9527e08ea148e7c10ffa4009e0e5070b11 refs/remotes/origin/access-log -e19ff641b06d3abd30b3bad5cfb491d158835713 refs/remotes/origin/aggregate -eee52d83c4bdafe712685be06822acb051d407a7 refs/remotes/origin/async-client-handshake -87686029aa2cfddfea765c626be7161981583482 refs/remotes/origin/atc -3d5f6df7311594b051fdd26d3ae120d4ae708bb4 refs/remotes/origin/atc-only -3c2e29f215fb09e5b4cb29040d1e5e092ce73849 refs/remotes/origin/auto-push -f39d3f66a3ea6bb15b50737b90004b12056a3ad1 refs/remotes/origin/avc-parser -205664d8c5e040a61b36ae0b74ddf17bc16d2150 refs/remotes/origin/big-endian -10bcbf0e8daf38e3f3569ba84050f85fd46dd2d0 refs/remotes/origin/big-hls-buffer -fad4f4717b47ab368d80ff480f2889631edc6521 refs/remotes/origin/big-nal-buffer -f6ccfb6fa1d05d3babc1bb20ca7003802f85f2f0 refs/remotes/origin/chunksizefix -d9579d627d727d8ad5edd2a0054f66324bebd459 refs/remotes/origin/close-stream -aeae84bf8babcd7130f71b5941834eeb4fafa61a refs/remotes/origin/cmd-handler-init -ebc47f03a43758c4f44ae90c193f4111f9ab1e16 refs/remotes/origin/codec -cb4623aa4f7e6c2d1cb4c9c9f55ea6107f3a3985 refs/remotes/origin/const-fix -0b757e8a49480a88f5e051f6590f25e6c4de3288 refs/remotes/origin/control -ef424df677eb545ba5277649ee99fbea7e38bb55 refs/remotes/origin/control-director -5e5dd797c2307b40a11409df806f07a427b3cd57 refs/remotes/origin/control-redirect -b07e0e2dee3a2019dc2be34591b1c4e27730b2a0 refs/remotes/origin/dash -e8081fd94f1d7ae4483f0a5ca002af8a79d447eb refs/remotes/origin/dash-discont -fe4877f2168e7e62d6a45cb26708d662f0416961 refs/remotes/origin/dash-timeline -39717828d67359329797d0ab5f297162b5d5e248 refs/remotes/origin/default-buflen -90f985fa2f015e8bdfe92a9b57a5d04b779d7be1 refs/remotes/origin/defclose -63d19ada51b6a1932e1cd73d9895a08cb1ae7827 refs/remotes/origin/drop-old-publisher -6c79085d5c4203d11d9aa53d456ef7195de8cdc4 refs/remotes/origin/drop-restart -fe8bf2d6974834ab346b82533151bc953fdfaa7b refs/remotes/origin/drop-restart-mstat -52c2ef3f91569c3b1c10a40fd1bf56bb4dc1d9de refs/remotes/origin/enotify -57a96ac2bc1812188aa81237ad582ca115f4391f refs/remotes/origin/envivo-fix -87686029aa2cfddfea765c626be7161981583482 refs/remotes/origin/exec-fix -67aa7d5d0da67a43683e8b05467afbdff5622532 refs/remotes/origin/exec-init -f79aa206ec572c225c8bd32b5c2b1d7cc5ede692 refs/remotes/origin/exec-logging -b62651efbdcaa77f7836ef5c52ddccfdf9ca473f refs/remotes/origin/exec-pull -a6913ea68ad017eff14d098f4086c5dafae12af6 refs/remotes/origin/exec-pull-ext -8c39b37131d150f152aa21a03f076501f39bf4a1 refs/remotes/origin/exec-static -5e55f62b88f439dc1fbe311060bef53dfcfbc42e refs/remotes/origin/fast-start -0210f7ca83f8fd65261c4b9040743edf30a258fc refs/remotes/origin/flv-append-fix -fac68de376a2e20aed5627681ffc90d6374bf295 refs/remotes/origin/flv-header-mask -b31539ce95d2f84ce8be22b9d11cb4abcd3cb90a refs/remotes/origin/fmle-reset-byte-counter -990222d643b30a3c9e0db31209416ae9b47e16d3 refs/remotes/origin/fmle-time-fix -cbccd06babfc66ab920e7e2331d125516715f709 refs/remotes/origin/freebsd-auto-push -6f2808c7d11564e2269e9f64b9671f8c080c893d refs/remotes/origin/get-notify -12a0d39bed54bfb3c30272d8d1328d74378853ce refs/remotes/origin/gh-pages -76211a4bd254e5145d38c0275ad790dc9fac8fd4 refs/remotes/origin/good-logger -ec282438514e88f7267653728b42c77e3df23bc3 refs/remotes/origin/handshakefix -d34c6393f6ff22ef6cff6cb2c4ef7c1fe6cd35fa refs/remotes/origin/hls-async-delete -49a3ee0dc6d5b85fe1164995c8d94424a0971838 refs/remotes/origin/hls-base-url -4906e816bec876e3e81b129622de3f5e430dcc32 refs/remotes/origin/hls-continuous -764a039c5856bb8bfb251ff15f4c95cf1c82e54b refs/remotes/origin/hls-debug -a43bafe3de4641268d04f9105f6ef409abb8ede2 refs/remotes/origin/hls-discont-fix -8acacd0d7906820039bc5e1e22a4ba332caada3e refs/remotes/origin/hls-encrypt -7500b4bd90fc942468f94dd3a12dbcdf9c3199a6 refs/remotes/origin/hls-encrypt-auto -78dcfbcc359f8275a55b7a14d6228e9928c75816 refs/remotes/origin/hls-ensure-directory -737ea5ce34c8270479811acfacba02112e202625 refs/remotes/origin/hls-event -546c42efeb910fb6b7b592293f5737324ddd606a refs/remotes/origin/hls-granularity -2ed36a2611c1674d495f754ef3066c4a8bf98aa3 refs/remotes/origin/hls-nocache -21174b2ee743c9ea1a0bccb46436c56c871febd3 refs/remotes/origin/hls-nocrackle -6298aa7e1d95df8b806a262196a6589159284c74 refs/remotes/origin/hls-offset-fix -059dba448ddeed901d06f825ed84e5e85c0f64cc refs/remotes/origin/hls-read-playlist -0aaf2a625903ba6d4d9e1e761a0e866215149994 refs/remotes/origin/hls-restart -2bb16425da9b593f5f9568f7c91bf06a5a1012f1 refs/remotes/origin/hls-restart-on-audio -3d54d69e252bb537dc8fb03cc96ada084bd5da8d refs/remotes/origin/hls-trailer -4ff1bd09fcbd8a77618bd528fd8d32fb72bd2661 refs/remotes/origin/hls-ts-discont -2f1091679b60b8741e59f257ac2c59905cec8206 refs/remotes/origin/hls-variant -dc698edf242a1ba6d806571e2b32e50fb4d6fcae refs/remotes/origin/hlslight -7b88858b44371ae03d29052fe6d398750fba851e refs/remotes/origin/http -050a4e7586552003baff9dd920d28d51eaf8ab22 refs/remotes/origin/idle-streams -3fc1598db94b234b2ec5f368c34c5d3e877040a0 refs/remotes/origin/init_queue -d9d749af5b156ea2b4623f7e8d0efa5139885924 refs/remotes/origin/interleave -f62a0838064baf089ad9fe3c8f6f2ffe0775afb2 refs/remotes/origin/master -67443c28b4aff60023ce143475c2d287c264f2f7 refs/remotes/origin/meta-copy -266e206afcda93cf2880e660fb796eb99fb6df6c refs/remotes/origin/mixed-codecs -58491f8feddbe801557704dd1d1ac9d0950cdf3f refs/remotes/origin/mp4 -af5703b35756667eb008bdffb22626616bbae020 refs/remotes/origin/mp4-choose-track -3f9451fdfd2707e91536bb3b942cd0a8202ebc31 refs/remotes/origin/mpeg-dash -05a23dbc8b8a23bcb49ea71978239ab1e2e79d5d refs/remotes/origin/mstat -cbe760aa8ad43d3908b7c9408d7f3946747981b1 refs/remotes/origin/msvc-fix1 -4ec43349ad5e16a9216844430695a3479ff6d558 refs/remotes/origin/multi-pull -004accda9aef265eb1b4df39846156e6892d6a30 refs/remotes/origin/multi-record -41515325899813d996e092ce4219204cec56ae3a refs/remotes/origin/multiplay -4ec43349ad5e16a9216844430695a3479ff6d558 refs/remotes/origin/multipull -1894d333aa9fd76e857532efe6c64d343df137e7 refs/remotes/origin/native-hls -e22ca286044d343745a4a28b15c6298f80a9fb61 refs/remotes/origin/native-hls-rr -b5461f61c6833aee803b5134f2285aa652978e09 refs/remotes/origin/new-live -903abb6646153c9eca2697727231d46804a0c1b7 refs/remotes/origin/new-live2 -02dd440a25097e8528d9cdfa85132b6920649547 refs/remotes/origin/new-live3 -22de95e634b92e23eae85134c05e54c98404e34f refs/remotes/origin/new-relay -7b5c5e99327c19600ab2bab89960ba217be52949 refs/remotes/origin/new-stat -591d7f5f3f0a2381f466f578a768ff19344cfbb0 refs/remotes/origin/newhandshake -cbaff8f1df7c7eabc9474909104f8f4f05324930 refs/remotes/origin/notify-addr -7f7fcc8d5c0e8468db2b37de9a4ef3ec392c52a7 refs/remotes/origin/notify-redirect -8d28f7f1de08a81ce356f55c6e29141369bf7aec refs/remotes/origin/notify-redirect-md5 -58bd6029463c79347d45be4488a3786abe5cebb8 refs/remotes/origin/notify-relay -f89bbae2354ea09cb5d8b04d24ba4df8415e7f09 refs/remotes/origin/on-connect -62e03d710cd02043156ac86da3b07e5186c78e11 refs/remotes/origin/on-update -15405e8edde4db9e3c6b56c3a17edbf7dcd974f0 refs/remotes/origin/optsend -9788b1a5309d40809df6832e81593392f3b381a2 refs/remotes/origin/out-metadata -2fdec454604b76b40d322b83106ec1a35b98dfce refs/remotes/origin/out-queue-settings -0478c4445f26f55d33e360a91a7ab4cd57f44f3b refs/remotes/origin/pause -940ff260099958edf27eb11fe0b959e881fd5dfa refs/remotes/origin/peer-timestamp -067c73710d15f046945ada24d5ca25d50b2751c7 refs/remotes/origin/play-publish-done -5d3189ad97c87bbdac9fb455f7505d0d4d5eb058 refs/remotes/origin/play-seek -8a8f28f3b67d0177f79e754c478e845bac70eb58 refs/remotes/origin/play2 -521f8998b0cf1e197152655b214285ebde974fd3 refs/remotes/origin/play2-continue -3e25f91004b83c1a1fa25a8993cdd691f65bf658 refs/remotes/origin/postconf-handler-init -4ec43349ad5e16a9216844430695a3479ff6d558 refs/remotes/origin/preemption -a72e33ea411ed5f55df04ea9ab9dfceb09137642 refs/remotes/origin/proxy-protocol -6ab14605ba4a410b39916543302a9a9eb4d19698 refs/remotes/origin/publish-optional-type -1c2470975e4f23742d3e468649c2ad2bbfb77e7f refs/remotes/origin/publish-time-fix2 -dbc3ac2438757b23a65e1612c36b5691e7173585 refs/remotes/origin/push-reconnect -0b6a84b0b829c6794c0635dd30a2aa6712417c8f refs/remotes/origin/record-append -abc2704db1193bd993b886463063059d1ff5050e refs/remotes/origin/record-done -8658d99529384a487113bb9b80aaffd7714f16a7 refs/remotes/origin/record-keyframes -9b3471d79f43382db134b407cfce4f5b4ee24ae0 refs/remotes/origin/record-lock -f79aa206ec572c225c8bd32b5c2b1d7cc5ede692 refs/remotes/origin/record-name-format -bff1c355ec7db875972da6682e2553d65ac847ad refs/remotes/origin/record-notify -b69efd3e94113f627f25d0ab67fcd1036eab5fb1 refs/remotes/origin/reentrant-relay -1f9072bbe69e015021a31784b3ac66f0b296c911 refs/remotes/origin/relay -c9973fc68a91284c632f3afb736303d6402f6c4e refs/remotes/origin/relay-vars -7aa513cfcd5fd345ea477ea582faa8858628974d refs/remotes/origin/reltime -de2a4258d77aecdc2fab34b5857ca4529b1fe0ba refs/remotes/origin/remote-redirect -60038b6ea15ae34dc1f177625adc73ddb39eb984 refs/remotes/origin/rooms -35753c5f6221c31edad65a2f70802b856e642fe3 refs/remotes/origin/rooms2 -4a1358723a7ce288aeec9583da97166c260b38dd refs/remotes/origin/rtmp-ads -71f92aca8d631cbc800c8eed235535e0b0a52991 refs/remotes/origin/safe-amf-parser -87d1cebfe2822d75f9c97fe2487723029abc272a refs/remotes/origin/sample-access -57dd1406bd59224eea4e0aabf9dbfe4c82e6be9a refs/remotes/origin/session-relay -22de95e634b92e23eae85134c05e54c98404e34f refs/remotes/origin/shared-live-streams -5d7a5ea535ed40e7a9459967dc607bb52b10db12 refs/remotes/origin/shared_record -18e4762db29139ada9c8be4b36070005e8d01efc refs/remotes/origin/smart-drop -a8d148473db0fe5fb17e5e7527a3cafcfafb1fff refs/remotes/origin/smartos-compilation-fix -2cff2a58210c2f964f4d2ee76a8461fb81e28610 refs/remotes/origin/stat-no-underline -e3be78bc6b6f91fea27ba235a6393dee50817bcf refs/remotes/origin/stat-redesign -3bd60857bd5ea2f3024e7de248bdc3d64b58859d refs/remotes/origin/static-relay -7a35372e30dca2a10c843219597bc4bc481fdda0 refs/remotes/origin/static-relay-cleanup -882b4f15b287b3e313088a67b2a4a543fbb6511d refs/remotes/origin/static-relay2 -ac13bbf1af345532a009a88d93ac4b7869ffe456 refs/remotes/origin/sync -9b4725a01a9615dfa7133d659ff936bd69e91345 refs/remotes/origin/sync-atc -7fbfb36440d99786f3c4ecc723ae61fcdedc3ce5 refs/remotes/origin/sync-atc-fmle -466c1fdf168646d57f0f43c463ad524143917e01 refs/remotes/origin/sync-atc-fmle2 -93b669273561ebd80fbf106b8b482d28a4377b81 refs/remotes/origin/sync-enotify -c8ad56e2d232933453d54767db55e96e00dd3d6c refs/remotes/origin/video-key -6ad152ee4c43238bd6a9f71f36b8e5a1757909a0 refs/remotes/origin/video-on-demand -b6194ed6e6a01ce14026c1778148db61a9a6765e refs/remotes/origin/virtual -4adc5f7487b0bb27cf027c3e792b00821ad30ada refs/remotes/origin/vod-http -0f337fe9a482e3da10ca7e8055ae1d8a2ccb9037 refs/remotes/origin/vod-sample-access -98d959ac5374bd14123f53318e6c8a8d481ffd92 refs/remotes/origin/vod-seek -770e67b1f33134c7db41e99f27ef167b16be8032 refs/remotes/origin/vod-stat -5db5d5af24af798f698fcc0f6eeecbac52932139 refs/remotes/origin/vod-stat2 -658f5ec639e290476f19eb91f371e2bf453616c0 refs/remotes/origin/win -289ee42c53f49728eb134f2226a2ef9ca7a32414 refs/remotes/origin/win1 -92d4c071d91b9de67e7293efcb72ad97c28285a7 refs/tags/freebsd-native-hls -^1894d333aa9fd76e857532efe6c64d343df137e7 -316b05d54e7e290546872cb26ad5b431b2a935af refs/tags/v0.0.1 -^eda826a386f10109816c57db9ed0908bdca92330 -2ba5b409dfac19e28befd698e0e03ea8f3799517 refs/tags/v0.0.10 -^d943d519754d1c08073298114807a8afb154d07f -f00415d4264d303b1a2771a3c6a36c026217e000 refs/tags/v0.0.11 -^bcd601832a0a2dc968621e065f1dbeaa14b77bb6 -3080d5f1e2f6e7b4da23585fb538152cbe91bf77 refs/tags/v0.0.12 -^caec91b85772dc5e078a3152cb6ed436c26bfbc3 -740f8034ec343eeab3c19c5e777fc1af05af12e5 refs/tags/v0.0.13 -^d3c5ad11969c6bfba083a33c5c7540d79692ab0a -18719a9ae0332480c80acac56b54e87b6131f46c refs/tags/v0.0.14 -^cf1976cd05a6e73cdf5fb1506f84508a297688b6 -903e750ce238efa3cde37a40a00c83d0efa7190b refs/tags/v0.0.15 -^6295147db1d44c9e8430b09cf2bf3d0a43c16b56 -93cd6b10d401382dfc8f740dd8e995fc5241eacc refs/tags/v0.0.16 -^359c346d3516403f5545dac0e9d8fe57ff09238e -88536319dc71fa9e8202eb000dcce7f1aa864321 refs/tags/v0.0.17 -^15405e8edde4db9e3c6b56c3a17edbf7dcd974f0 -6eba477d8578b5c488e034ab25d45e34e30636f5 refs/tags/v0.0.2 -^8204245eb223290cfed21f6748860a4bec510ed1 -4793210ff635d428fc37692d88a1107e32f3839e refs/tags/v0.0.3 -^96ebed857347b368cb78749de3515797eb0d9364 -110118d72aa68bced1a7da6d427c4a1473153f8b refs/tags/v0.0.4 -^b9ee8dbe097b2ab9cd60786c1cfa9a48237c51dd -49d4548bbc229885290915256d3b75f5d0b2863e refs/tags/v0.0.5 -^1e9a7e6efcd6990662f41e54587f27ab3f28ba87 -1c620f4121a3c4c64ccc71ca9a3aee100b702221 refs/tags/v0.0.6 -^3980a5923715131c8ac011410e63250ef5d13c93 -dbad1b31d510f290c5ebac4f073f5b7c3ef97e04 refs/tags/v0.0.7 -^7b70e9241327b93d04554cd7b8d2eeadb2acc4e6 -41ca3077bdbd20c2ddefdcc5f03a26b9ab6c358b refs/tags/v0.0.8 -^e563c3146e31eb8ce48634262435978bab26f7f0 -dc702ef73579582157563de257bf906d5ac77e18 refs/tags/v0.0.9 -^31d18ed4478684571476aed6125e942bfc738d77 -e2dcb0bea3859e6a66a7601356a7d90434d5ef4f refs/tags/v0.1.0 -^c61d7ac56f4895dc3f0513344b45d74943d4da19 -a0e0796bff7e6a33181d4cb6a1981a9889cf791c refs/tags/v0.1.1 -^f6ccfb6fa1d05d3babc1bb20ca7003802f85f2f0 -80db4c48b3cc30ad12112b5bde3831520c81a92a refs/tags/v0.1.10 -^88346934e51595118518957553316afda5a8b771 -b103795c7f1f41a51451dace848f8de085d59840 refs/tags/v0.1.11 -^45cd9825a2bb882c3b65a9c1139342bc59e40750 -8c8410a1def03c6f535110352398a0fc463d08f8 refs/tags/v0.1.12 -^63c4269a9146370db970894512523b9f3893ffad -951872e641cbebbd925c17cb8e8cc8a0289fe9cd refs/tags/v0.1.13 -^1719ef4433de03e8d95be7838a933326d717f1ee -6432ba9937589a7bbd58975d2e253a65e433e17b refs/tags/v0.1.14 -^fa3630d63d77ec4e6dcfa14a88afb5804b1b3596 -4b89a9819cc22c6ca1852613c518e0f400c6c048 refs/tags/v0.1.15 -^8def5f394543b822b6b450e79bdbf9a73f1d0a99 -40d6554b7196933e96aff91bba15f6b31c99dedb refs/tags/v0.1.2 -^4e713b75e8e3cd8f5456303e2f7f4803776f33de -a33ca7451cbd32dc2f43e01b3b87552f055a56ae refs/tags/v0.1.3 -^d82c16499de14965ff1259c457b33b5a81614c40 -dd9683b203e09b13d08e717e20304060c1d320cb refs/tags/v0.1.4 -^a4f48c5baa427c9d9093c0ceee339820c2167624 -d216f3dd61f67da413503b492af4b1f5c3e58451 refs/tags/v0.1.5 -^32279ddf26a9d9e0f34ff62d460bf4c1b14e2088 -2dab9cce52024dbf7ae3273770e159e73db21618 refs/tags/v0.1.6 -^49382c826b041589badb32b5f5f512592405a736 -c83a64c91d926c1bc5ac35036d49c31f87165466 refs/tags/v0.1.7 -^63e19f8d67d4f442f2700103c4d8ee9d137c0116 -0ab4039b703078ddacd4e70adc67b99efd946de3 refs/tags/v0.1.8 -^4bb48483be9d91a74a2efd5cb80fa136918ae466 -c9d359554132dc807d599b8d28b3193c8e37d841 refs/tags/v0.1.9 -^6143abc41803be6da47bfc4e15bbfe1d315de832 -4d20bb15480652145358c20f444f77ddbe2eeac6 refs/tags/v0.2.0 -^eb4e9e8d9033cb7c1775eec114cd7b90af26b047 -9df13315600aa2752fc99e80fb8b73a78e0f0fbf refs/tags/v0.2.1 -^1a2a8e2867f4d1cd64853bc49af9e725ee7f8343 -7e8b090de600016d965d3080b0cd6bc81eb60f67 refs/tags/v0.2.2 -^4e475cccb507951e5091f0ff5f1d4ef1903fd439 -f7f24bade80cca3a09e7286f250bb464cfab2df1 refs/tags/v0.2.3 -^295551947a187a265e5c60e6cccdf4c894a21e24 -2bf2e04da1cd97187612ba73ce9010c96393b76a refs/tags/v0.3.0 -^58491f8feddbe801557704dd1d1ac9d0950cdf3f -aded30326d7e233283346dab1258d4fdf69c31e7 refs/tags/v0.4.0 -^3c2e29f215fb09e5b4cb29040d1e5e092ce73849 -3381f10c50c161b0350ca8030535a97f43977940 refs/tags/v0.4.1 -^067c73710d15f046945ada24d5ca25d50b2751c7 -943ca88b8160225ef8decfab7aa3c6ba40c012a7 refs/tags/v0.4.2 -^ff247dafff1cab945c85ceefcf97d76fa1972c0e -2864097d4bf7e81a95bc85d133121beaf8262fc9 refs/tags/v0.4.3 -^ed5f06db8a90746059730fe8b55cf9ddc64ca67e -ed9bef4dc07d34078749b79d072cde59f385084a refs/tags/v0.5.0 -^abc2704db1193bd993b886463063059d1ff5050e -eb94d37c69842eb563fa3e7c9cc286cc942fd2e8 refs/tags/v0.5.1 -^6485716fb4734d5fc25ba12d849e2dedab63707d -0b020f1757f052a24a4d4c2061fcc4f8e1dbd440 refs/tags/v0.5.2 -^87686029aa2cfddfea765c626be7161981583482 -053bdc9277034a6db7edcc3d46c042ab8c62989b refs/tags/v0.5.3 -^cc632eb6b683eacdced09bfbe905e510779d5efc -307f468efdffa4ad07e79c0e39eab9f9eb195307 refs/tags/v0.5.4 -^bff1c355ec7db875972da6682e2553d65ac847ad -98438d54995ad4d11d7a020ff6b77919ca368448 refs/tags/v0.6.0 -^72d175ed7f5dfb4874ac6e002b737d866a0553d7 -f1eeb39f851366614b7dc1afa1fba21e1595475f refs/tags/v0.6.1 -^21174b2ee743c9ea1a0bccb46436c56c871febd3 -2b20008d1f3cb4b357d74ee288e2c00ac801d415 refs/tags/v0.6.2 -^795c1538a3602d5eedf7617c6d13c775721a66b9 -6b1f2547203b946cbac8c60bd86e5f04ad1a9a1d refs/tags/v0.6.3 -^c86e30fd270103b00c244f136c8780fb3a51b921 -d623935695e9ac6418a1baa24283bd35a42fef81 refs/tags/v0.6.4 -^f65f07deb32565b144e22faece57638f8961d62f -d3a7be773484e670119dfa20ff56cb0a91a8554f refs/tags/v0.6.5 -^4adc5f7487b0bb27cf027c3e792b00821ad30ada -293ebabd1220ec4615e2eb89d19ca3e7a381d1a3 refs/tags/v0.7.0 -^101b43a478bb44018733e75a3bf3b1f8adc5b2e5 -4b12afb07c889648864458c3a6096dc274c7420e refs/tags/v0.7.1 -^98d959ac5374bd14123f53318e6c8a8d481ffd92 -eb5ccb5fb1f735b82da3a43ee0d8d398bd932840 refs/tags/v0.7.2 -^6f2808c7d11564e2269e9f64b9671f8c080c893d -23fe9e844ecafd18a5d713618a36fb68846db951 refs/tags/v0.7.3 -^62e03d710cd02043156ac86da3b07e5186c78e11 -09b1e2bab6467a8d50e37939b4d1fc0b9777adfd refs/tags/v0.7.4 -^696e488ecb089236a297939248d4616d4665d347 -fa8752466e94879be074386c2f0420640cec3b41 refs/tags/v0.8.0 -^02dd440a25097e8528d9cdfa85132b6920649547 -7c3df8e2c78a85ef7f5d2e8f100e5f54573c71c7 refs/tags/v0.8.1 -^9f4296c08382b1374018346cce3bb5d40036f47a -f8899c67c2508ded911a93117b3186df6df631bd refs/tags/v0.8.2 -^ac924d7f940f05063d7ef0503aa7f3a1576bf380 -683a29d4d0a536b6a97c07d1deeacb8cc11a6af7 refs/tags/v0.8.3 -^3d54d69e252bb537dc8fb03cc96ada084bd5da8d -2aeefa379b700de0c9c1b4ed94e186e0d1d1a580 refs/tags/v0.8.4 -^f2f28cbe487883caed333ffb4f5f7942bed64c09 -5ea2a003691a63630e6c1d492c96d6581338efb8 refs/tags/v0.8.5 -^bd562e4ff7c10cad71711828548cbb584bd4a80b -11ee9f81e8b8a077113cdf96d655d7cf9961a03d refs/tags/v0.8.6 -^e5e5766ebb51e1c36b6804fe0ddc02ee8ca19cc6 -544c73b3b27c93df0d61172c62a7eee2e8252953 refs/tags/v0.8.7 -^3eaa43a7a327646acdebe87000422c6fd086adbe -83055d17d104c267aeebda070246b0917dbfffb2 refs/tags/v0.9.0 -^406d3a9527e08ea148e7c10ffa4009e0e5070b11 -37a1511c0e7c6a1a522bab7355289a71a7876ad2 refs/tags/v0.9.1 -^ea65ac688cdd89dad65bcdc3b62d5e152b47f1ec -ee0df070f78e83f3857301aa0e4340c15743403d refs/tags/v0.9.10 -^6923889e5386abad1aa07e2c29462fc469d3a5d4 -cb5e1df91a1b8d020de63d6cbbacd9f74097a375 refs/tags/v0.9.11 -^3aa528fccd2c3500b2eeafa6589c3f8f07564186 -6d328d3291833a9991cb27df45d1c82cfc3bc5fb refs/tags/v0.9.12 -^11e3f53fd259f0297a4d8f440afceb8395b45622 -b63100856c3a795440047324aaf863c6339e859f refs/tags/v0.9.13 -^0a8f0ee6c560edc032f66a25d527e9cd7ed6b62b -e13bcdadf3b57f91e8eca678846480522eb214ba refs/tags/v0.9.14 -^612fc4dd7514b3da2ac774a6daeb7baa60314f36 -1c92b49d30e7215483d5c0c038da2d09d6ac1d16 refs/tags/v0.9.15 -^7b5c5e99327c19600ab2bab89960ba217be52949 -bc3fe7a8ebf166e5187f7bac00c70e40a9b192fe refs/tags/v0.9.16 -^c0fc4bbdccf1d328eaa098f3287e427e369517c0 -d5288d89f8c1e1c8c82218a23deedfabb845fa1c refs/tags/v0.9.17 -^f79aa206ec572c225c8bd32b5c2b1d7cc5ede692 -bce7ea3e62682b29d61d56cc6bcc0e794857d557 refs/tags/v0.9.18 -^c61e99a36878fc618e29633db0e9652be13f6284 -39cb7ca0a51e7e4bfc400b285141a71ac7b565c7 refs/tags/v0.9.19 -^a47b23204b43d5b823feeb52b0c868b2c96847ca -43dd6489282d965072eb48479af5e8d90ac6ad38 refs/tags/v0.9.2 -^af5703b35756667eb008bdffb22626616bbae020 -73e60038c62b281fd0e4ff5565f35797fed46a1a refs/tags/v0.9.20 -^e29e64ed7d262904d22ce0a708e67cc02115f497 -828fcd80c23df5caf0b7fdbf897ba45a92f3dce7 refs/tags/v0.9.3 -^aeae84bf8babcd7130f71b5941834eeb4fafa61a -31f684d189aec37550e82e4c7cf3ac751a781ade refs/tags/v0.9.4 -^f358a2e8f9269afef85d82549de4945942b39d6c -63540cc06386523c08857cf435ad9c2f6daaef8a refs/tags/v0.9.5 -^c0ad999f37675dd1bbed11d901f34259827bb405 -e7fe15e6ca0cb0f81ec42b5b309ce6f720525193 refs/tags/v0.9.6 -^5325df0135c467d21cf93cd5c5df6af60a87a9e8 -0dda255fe75318707bb20e0078ace6da1f160cd2 refs/tags/v0.9.7 -^138c330da2ace7617af3c6b671fbee049f387fb7 -568ce8f0a850d3d7e00c33247edffe366cff0d51 refs/tags/v0.9.8 -^6903ac23e430b4170b108bb2f631562560c37fe0 -2d5bc52527e46171d2e2a7c4d9c87fa2a4e39fee refs/tags/v0.9.9 -^af8446a0985ba76873c25a6aae5125e47c7a3194 -d27f964d1f45d546419795b058fea60f3f1f21ab refs/tags/v1.0.0 -^613234b866fd08ea2221d183edfd9eb6d8a8bf4d -421d9ff41f699cc344845df9869dccff0ce4ad86 refs/tags/v1.0.1 -^cbe760aa8ad43d3908b7c9408d7f3946747981b1 -e1ec6d2f08937878a985bfa7d4f49e93312dc7e0 refs/tags/v1.0.2 -^6b92cd6b29ddeea5a113b6e5d8d854b6986e3fd1 -7749d54fb000641dfa6c8eebfb8765175f187a13 refs/tags/v1.0.3 -^7b4df729c1c4d86589f8ccadc0bd20ee733416f9 -aaeca4ff01f858cd719ea5b86eef7dcc3ba259ca refs/tags/v1.0.4 -^67443c28b4aff60023ce143475c2d287c264f2f7 -d7e1af79c4d152d16bcacfcd2ca18d58e6b3201b refs/tags/v1.0.5 -^737ea5ce34c8270479811acfacba02112e202625 -0acf1123a044c8afd68112387712abd59e45a2eb refs/tags/v1.0.6 -^1cfb7aeb582789f3b15a03da5b662d1811e2a3f1 -bd4f1b4cf7c58e55298c326184e5ad1a15c3aff0 refs/tags/v1.0.7 -^995688b9cfea4fb01a5b8ad0e110fec0866e501c -5beda43a6b388af5e7c1bcc55384163d97dcf836 refs/tags/v1.0.8 -^d01ffc0c88d9ce736be3dee99b4f9d3fcc07b685 -f792dab070dbdedc3b968483287fa59e6ae48a03 refs/tags/v1.0.9 -^471d299f5d5348dfbba6132779587553c3a709a7 -a08c7835b05e2bd816efb1f8036cb7c9bf59b906 refs/tags/v1.1.0 -^8542e21e17587ee2e928cdfedc1cb82996df7719 -e9d11158cb1b18a0631a94c4e8599c0f8c64adb7 refs/tags/v1.1.1 -^8608faad1e0b25c80b1f9b93439d6fd450db5c15 -2a721794867c76e9ac9e653e76da9503cbc9d60f refs/tags/v1.1.2 -^65cd61e43350c0de0a69103aed1ecf7f2b081ab8 -c130de320738a9ae084ba3d54f033c98e6e82d65 refs/tags/v1.1.3 -^6f768dc4eb2a2cb7798e31c7465af77b94ca2733 -3fdbbcc01249d7a3f0559192debfe09f844aef6e refs/tags/v1.1.4 -^8c2229cce5d4d4574e8fb7b130281497f746f0fa -28618cde22c864eef6ecdba9da636a2f2f611b20 refs/tags/v1.1.5 -^7500b4bd90fc942468f94dd3a12dbcdf9c3199a6 -1706bc84f5b0882dec6f1854d9054be7e3d12ab2 refs/tags/v1.1.6 -^7a35372e30dca2a10c843219597bc4bc481fdda0 -c0a5fb42c214d585a84967b2e172889d9278d325 refs/tags/v1.1.7 -^f62a0838064baf089ad9fe3c8f6f2ffe0775afb2 | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/refs ^ |
-(directory) | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/refs/heads ^ |
-(directory) | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/refs/heads/master ^ |
@@ -1 +0,0 @@ -f62a0838064baf089ad9fe3c8f6f2ffe0775afb2 | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/refs/remotes ^ |
-(directory) | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/refs/remotes/origin ^ |
-(directory) | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/refs/remotes/origin/HEAD ^ |
@@ -1 +0,0 @@ -ref: refs/remotes/origin/master | ||
[+] | Deleted | nginx-rtmp-module-1.1.6.tar.gz/.git/refs/tags ^ |
-(directory) | ||
Deleted | nginx-rtmp-module-1.1.9.tar.gz ^ | |
Deleted | nginx-rtmp-module-dev.tar.gz ^ |