static ngx_int_t ngx_rtmp_control_handler(ngx_http_request_t *r) { ngx_rtmp_control_loc_conf_t *llcf; ngx_str_t section, method; u_char *p; ngx_uint_t n; llcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_control_module); if (llcf->control == 0) { return NGX_DECLINED; } /* uri format: .../section/method?args */ ngx_memzero(§ion, sizeof(section)); ngx_memzero(&method, sizeof(method)); for (n = r->uri.len; n; --n) { p = &r->uri.data[n - 1]; if (*p != '/') { continue; } if (method.data) { section.data = p + 1; section.len = method.data - section.data - 1; break; } method.data = p + 1; method.len = r->uri.data + r->uri.len - method.data; } ngx_log_debug2(NGX_LOG_DEBUG_RTMP, r->connection->log, 0, "rtmp_control: section='%V' method='%V'", §ion, &method); #define NGX_RTMP_CONTROL_SECTION(flag, secname) \ if (llcf->control & NGX_RTMP_CONTROL_##flag && \ section.len == sizeof(#secname) - 1 && \ ngx_strncmp(section.data, #secname, sizeof(#secname) - 1) == 0) \ { \ return ngx_rtmp_control_##secname(r, &method); \ } NGX_RTMP_CONTROL_SECTION(RECORD, record); #undef NGX_RTMP_CONTROL_SECTION return NGX_DECLINED; }
static ngx_int_t ngx_rtmp_control_handler(ngx_http_request_t *r) { u_char *p; ngx_str_t section, method; ngx_uint_t n; ngx_rtmp_control_ctx_t *ctx; ngx_rtmp_control_loc_conf_t *llcf; llcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_control_module); if (llcf->control == 0) { return NGX_DECLINED; } /* uri format: .../section/method?args */ ngx_str_null(§ion); ngx_str_null(&method); for (n = r->uri.len; n; --n) { p = &r->uri.data[n - 1]; if (*p != '/') { continue; } if (method.data) { section.data = p + 1; section.len = method.data - section.data - 1; break; } method.data = p + 1; method.len = r->uri.data + r->uri.len - method.data; } ngx_log_debug2(NGX_LOG_DEBUG_RTMP, r->connection->log, 0, "rtmp_control: section='%V' method='%V'", §ion, &method); ctx = ngx_pcalloc(r->pool, sizeof(ngx_rtmp_control_ctx_t)); if (ctx == NULL) { return NGX_ERROR; } ngx_http_set_ctx(r, ctx, ngx_rtmp_control_module); if (ngx_array_init(&ctx->sessions, r->pool, 1, sizeof(void *)) != NGX_OK) { return NGX_ERROR; } ctx->method = method; #define NGX_RTMP_CONTROL_SECTION(flag, secname) \ if (llcf->control & NGX_RTMP_CONTROL_##flag && \ section.len == sizeof(#secname) - 1 && \ ngx_strncmp(section.data, #secname, sizeof(#secname) - 1) == 0) \ { \ return ngx_rtmp_control_##secname(r, &method); \ } NGX_RTMP_CONTROL_SECTION(RECORD, record); NGX_RTMP_CONTROL_SECTION(DROP, drop); NGX_RTMP_CONTROL_SECTION(REDIRECT, redirect); NGX_RTMP_CONTROL_SECTION(RELAY, relay); #undef NGX_RTMP_CONTROL_SECTION return NGX_DECLINED; }