我想为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做些什么让我来处理这个?
顺祝商祺
1条答案
按热度按时间vlju58qv1#
我在问题中提供的代码非常接近。
rtmp_register_hooks函数缺少所需的挂接:
这个钩子可以让我处理所有进入的交通。