Apache 避免在我的虚拟FS模块中进行头处理

Apache 避免在我的虚拟FS模块中进行头处理,apache,apr,apache-modules,Apache,Apr,Apache Modules,我想写一个模块,提供一个巨大的virtual.wav文件(还计划在将来添加一个virtual.ogg文件) 我知道文件的大小(2Gb)及其伪修改时间(2000-01-01 0:00:00),我有一个读取文件部分的功能: void virtwav_read(void *buf, ssize_t bufsz, uint32_t virtofs); 我想挂接低级文件操作,如stat、read、seek,等等。标准apache代码应该负责解析头(包括范围请求、缓存相关内容)并生成内容类型、内容长度、E

我想写一个模块,提供一个巨大的virtual.wav文件(还计划在将来添加一个virtual.ogg文件)

我知道文件的大小(2Gb)及其伪修改时间(
2000-01-01 0:00:00
),我有一个读取文件部分的功能:

void virtwav_read(void *buf, ssize_t bufsz, uint32_t virtofs);
我想挂接低级文件操作,如
stat
read
seek
,等等。标准apache代码应该负责解析头(包括范围请求、缓存相关内容)并生成
内容类型
内容长度
、ETag、
上次修改的
,等等

解析
请求\u rec.range
不是什么大事。更让我担心的是在适当的时候发送正确的缓存相关头和HTTP 206和304。我相信apache会比我的代码做得更好

我以为设置
request\u rec.mtime
request\u rec.clength
就可以了,但它们似乎不是输出字段

最后,VFS是一个令人惊讶的不受欢迎的话题。我只发现了一个2003年的古代项目

这是我的最小模块及其配置。右侧的
内容类型
是由apache添加的,但没有
ETag

LoadModule virtwav_module     modules/mod_virtwav.so
AddHandler virtwav-handler .wav
_

#包括“apr_hash.h”
#包括“ap_config.h”
#包括“ap_provider.h”
#包括“httpd.h”
#包括“http_core.h”
#包括“http_config.h”
#包括“http_log.h”
#包括“http_protocol.h”
#包括“http_request.h”
#包括/*用于睡眠()*/
静态int示例\u处理程序(请求\u rec*r)
{
如果(!r->handler | | strcmp(r->handler,“virtwav handler”))返回(拒绝);
//r->clength=42;
//r->mtime=apr\u time\u now();
ap_rprintf(r,“长度:%”APR_INT64_T_FMT“\n”,(APR_INT64_T)r->clength);
ap\u rprintf(r,“mtime:%”APR\u INT64\u FMT“\n”,(APR\u INT64\u T)r->mtime);
ap_rwrite(“虚拟”,5,r);
ap_rflush(r);
睡眠(50);
返回OK;
}
静态无效寄存器挂钩(apr\U pool\U t*pool)
{
/*在请求处理程序中创建一个钩子,以便在请求到达时调用我们*/
ap_hook_handler(示例_handler,NULL,NULL,APR_hook_LAST);
//ap_hook_dirwalk_stat?
//这个钩子允许模块处理/模拟apr_stat()
//ap\u挂钩\u映射到\u存储?
//这个钩子允许模块根据自己的设置per_dir_配置
}
模块AP\u模块声明\u数据virtwav\u模块=
{
标准20_模块_材料,
无效的
无效的
无效的
无效的
无效的
register\u hooks/*我们的hook注册函数*/
};
#include "apr_hash.h"
#include "ap_config.h"
#include "ap_provider.h"
#include "httpd.h"
#include "http_core.h"
#include "http_config.h"
#include "http_log.h"
#include "http_protocol.h"
#include "http_request.h"

#include <unistd.h> /* for sleep() */

static int example_handler(request_rec *r)
{
    if (!r->handler || strcmp(r->handler, "virtwav-handler")) return (DECLINED);

    //r->clength = 42;
    //r->mtime = apr_time_now();
    ap_rprintf(r, "clength: %" APR_INT64_T_FMT "\n", (apr_int64_t)r->clength);
    ap_rprintf(r, "mtime: %" APR_INT64_T_FMT "\n", (apr_int64_t)r->mtime);
    ap_rwrite("dummy", 5, r);
    ap_rflush(r);
    sleep(50);

    return OK;
}

static void register_hooks(apr_pool_t *pool)
{
    /* Create a hook in the request handler, so we get called when a request arrives */
    ap_hook_handler(example_handler, NULL, NULL, APR_HOOK_LAST);

    // ap_hook_dirwalk_stat ?
    // This hook allows modules to handle/emulate the apr_stat()

    // ap_hook_map_to_storage ?
    // This hook allow modules to set the per_dir_config based on their own
}

module AP_MODULE_DECLARE_DATA   virtwav_module =
{
    STANDARD20_MODULE_STUFF,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    register_hooks   /* Our hook registering function */
};