Apache 避免在我的虚拟FS模块中进行头处理
我想写一个模块,提供一个巨大的virtual.wav文件(还计划在将来添加一个virtual.ogg文件) 我知道文件的大小(2Gb)及其伪修改时间(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
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 */
};