首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >教Apache2一个新的协议

教Apache2一个新的协议
EN

Stack Overflow用户
提问于 2021-12-05 22:48:00
回答 1查看 82关注 0票数 1

我想为Apache2编写一个模块。我想实现rtmp协议。

因此,我从一个简单的模块开始,注册了Handler、。

代码语言:javascript
运行
复制
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                      */
};

它编译得很好。

我在一个虚拟主机中激活了它:

代码语言:javascript
运行
复制
<VirtualHost *:1935>
        LogLevel debug

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

</VirtualHost>

我以curl: rtmp://localhost/启动请求

Apache2服务器拒绝此请求,其行如下:

代码语言:javascript
运行
复制
[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

访问日志如下所示

代码语言:javascript
运行
复制
::1 - - [05/Dec/2021:23:34:23 +0100] "\x03" 400 485 "-" "-"

为什么这个要求被拒绝了?我能对apache做什么让我来处理这个?

诚挚的问候

EN

回答 1

Stack Overflow用户

发布于 2022-10-26 23:42:35

我在问题中提供的守则非常接近。

rtmp_register_hooks函数遗漏了所需的钩子:

代码语言:javascript
运行
复制
ap_hook_process_connection(rtmp_hook_process_connection, NULL, NULL, APR_HOOK_MIDDLE);

这个钩子让我处理所有无法通行的交通。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70239241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档