向Apache2传授新协议

iq0todco  于 2022-11-16  发布在  Apache
关注(0)|答案(1)|浏览(154)

我想为Apache 2写一个模块,我想实现rtmp协议。
所以我从一个简单的模块开始,注册了一个Handler、HTTP Sheme和Port。

typedef uint bool;

typedef struct {
    bool enabled;
} rtmp_config;

static rtmp_config config;

const char *rtmp_set_enabled(cmd_parms *cmd, void *cfg, const char *arg)
{
    if(!strcasecmp(arg, "on")) config.enabled = 1;
    else config.enabled = 0;
    return NULL;
}

static const command_rec rtmp_directives[] = {
    AP_INIT_TAKE1("rtmp_enabled", rtmp_set_enabled, NULL, RSRC_CONF, "Enable or disable mod_rtmp"),
    { NULL }
};

static const char* rtmp_sheme_hook(const request_rec *r){
    if(config.enabled == FALSE) return NULL;
    return "rtmp";
}

static apr_port_t rtmp_default_port(const request_rec *r){
    if(config.enabled == FALSE) return 0;
    return 1935;
}

/* The sample content handler */
static int mod_rtmp_handler(request_rec *r)
{
    if (strcmp(r->handler, "mod_rtmp")) {
        return DECLINED;
    }

    r->content_type = "text/html";      

    ap_rputs("3", r);

    return OK;
}

static void mod_rtmp_register_hooks(apr_pool_t *p)
{
    config.enabled = TRUE;
    ap_hook_handler(mod_rtmp_handler, NULL, NULL, APR_HOOK_MIDDLE);
    ap_hook_http_scheme(rtmp_sheme_hook, NULL, NULL, APR_HOOK_MIDDLE);
    ap_hook_default_port(rtmp_default_port, NULL, NULL, APR_HOOK_MIDDLE);
}

/* Dispatch list for API hooks */
module AP_MODULE_DECLARE_DATA mod_rtmp_module = {
    STANDARD20_MODULE_STUFF, 
    NULL,                  /* create per-dir    config structures */
    NULL,                  /* merge  per-dir    config structures */
    NULL,                  /* create per-server config structures */
    NULL,                  /* merge  per-server config structures */
    rtmp_directives,       /* table of config file commands       */
    mod_rtmp_register_hooks  /* register hooks                      */
};

它编译得很好。
我在虚拟主机中激活了这个:

<VirtualHost *:1935>
        LogLevel debug

        Protocols rtmp RTMP
        rtmp_enabled on
        <Location "/">
                SetHandler mod_rtmp
                Require all granted
        </Location>

</VirtualHost>

我用curl作为请求的开头:rtmp://本地主机/
Apache 2服务器使用以下行拒绝此请求:

[Sun Dec 05 23:34:23.251495 2021] [core:debug] [pid 603:tid 140402319763200] protocol.c(1447): [client ::1:37804] AH00566: request failed: malformed request line

访问日志如下所示

::1 - - [05/Dec/2021:23:34:23 +0100] "\x03" 400 485 "-" "-"

为什么这个请求被拒绝了?我能对apache做些什么让我来处理这个?
顺祝商祺

vlju58qv

vlju58qv1#

我在问题中提供的代码非常接近。
rtmp_register_hooks函数缺少所需的挂接:

ap_hook_process_connection(rtmp_hook_process_connection, NULL, NULL, APR_HOOK_MIDDLE);

这个钩子可以让我处理所有进入的交通。

相关问题