扩展mod_helloworld -- 使用stdio-like IO2008-11-10 22:19上一篇文章我介绍了如何编写第一个Apache模块,也是最简单的模块mod_helloworld,这里我们要对mod_helloworld进行一些简单的扩展。
这里我们还是来举一个例子,这个例子做的事情会比上一篇文章中介绍的mod_helloworld模块做的事情要多,但编写模块的整体框架不变,我们只是在处理函数中多做了一些事情。
我们扩展的mod_helloworld模块功能要实现的是根据客户端请求从服务器本地读取文件内容然后反馈给客户端。
要实现这个功能,我们要用到request_rec数据结构中的filename字段,它表示了客户端请求文件的文件名,我们还使用了文件信息对象来实现这一过程的优化。处理函数代码如下:
static int helloworld_handler(request_rec *r)
{
apr_file_t *fd;
apr_size_t sz;
apr_status_t rv;
if (r->filename == NULL) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Incomplete request_rec!") ;
return HTTP_INTERNAL_SERVER_ERROR ;
}
ap_set_content_type(r, "text/html;charset=ascii");
/* Now we can usefully set some additional headers from file info
* (1) Content-Length
* (2) Last-Modified
*/
ap_set_content_length(r, r->finfo.size);
if (r->finfo.mtime) {
char *datestring = apr_palloc(r->pool, APR_RFC822_DATE_LEN);
apr_rfc822_date(datestring, r->finfo.mtime);
apr_table_setn(r->headers_out, "Last-Modified", datestring);
}
rv = apr_file_open(&fd, r->filename, APR_READ|APR_SHARELOCK|APR_SENDFILE_ENABLED, APR_OS_DEFAULT, r->pool);
if (rv != APR_SUCCESS) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "can't open %s", r->filename);
return HTTP_NOT_FOUND ;
}
ap_send_fd(fd, r, 0, r->finfo.size, &sz);
/* file_close here is purely optional. If we omit it, APR will close
* the file for us when r is destroyed, because apr_file_open
* registered a close on r->pool.
*/
apr_file_close(fd);
return OK;
}
这里的ap_log_rerror是登记日志的函数,他登记的是request类型的日志。
r->finfo中包含了请求文件的统计信息。根据r->finfo.mtime设置Last-Modified,可以使浏览器在请求文件时先检查缓存。
这里我们响应文件内容没有采用先读文件再使用ap_rwrite把文件内容发送出去的方式,而是使用了一个更简单的函数ap_send_fd,直接发送文件
分享到:
相关推荐
标题 "api-ms-win-crt-stdio-l1-1-0.dll" 指的是一个动态链接库文件,它是Microsoft Visual C++运行时库的一部分。这个特定的库文件提供了标准输入/输出(stdio)功能,是许多Windows应用程序所依赖的基础组件。 在...
标题中的"HelloWorld_helloworld_project_"表明这是一个与“Hello World”项目相关的编程实践,通常用于初学者学习编程语言的基础知识。在IT行业中,“Hello World”是编写第一个简单程序的通用术语,它会在控制台上...
【标题】"hello_world.zip_hello world.e_world" 暗示了一个C语言编程的入门教程,其中包含了打印“Hello World”这一经典语句的代码。这个压缩包可能包含了一个简单的源代码文件,用于演示基本的C语言输出功能。 ...
标题中的"helloWorld_helloworld_outuxg_"似乎是一个组合,其中"helloWorld"和"helloworld"都是对经典的“Hello, World!”程序的引用,而"outuxg"可能是一个用户名或者项目的标识。描述中提到的“我的第一个C语言...
【标题】"hello world_helloworld_world_turnn6q_源码.zip" 提供的信息表明,这是一个包含源代码的压缩文件,很可能是一个初学者入门编程的示例项目。"hello world"是许多编程语言中用于教学的第一课,通常用于打印...
接下来,使用`javah`命令生成JNI头文件`com_helloworld_HelloWorld.h`。注意执行该命令时必须位于`src`目录下: ```bash cd src javah -jni com.helloworld.HelloWorld ``` 这一步会根据`HelloWorld.java`中的`...
标题 "SourceCode_helloworld_world_" 暗示我们讨论的是一个基本的编程示例,可能是一个初学者入门的 HelloWorld 程序。在编程领域,Hello World 是一个经典的例子,通常用于展示一种新语言的基本语法。这个程序的...
"hello world_helloworld_"这个标题是对这一经典的致敬,它通常代表了编程之旅的起点。这个简单的程序,尽管代码量小,但其背后蕴含的概念和意义却相当深远。 C语言是一种强大的、底层的、结构化的编程语言,由...
《HelloWorld-源码》项目解析 在编程学习的初期,我们通常会遇到一个非常基础且经典的示例——"Hello, World!"程序。这个简单的程序是每个程序员的起点,它帮助初学者理解如何在计算机上打印出一行文字。在这个名为...
#### 标题解析:“opencl_helloworld” 该标题表明这是一个OpenCL环境下的Hello World程序,通常用于帮助初学者快速入门OpenCL的基础操作。 #### 描述解析: “此实例是学习openl 的初学者必应用的例子,将带你...
io:fwrite("Hello, World!\n"). ``` 5. **GO**: Go(Golang)是Google开发的一种静态类型语言,强调效率和简洁性。它的"Hello, World!"程序如下: ```go package main import "fmt" func main() { fmt....
### 使用openWrt SDK开发第一个HelloWorld应用程序 #### 一、引言 OpenWrt 是一个基于 Linux 的开源操作系统,广泛应用于嵌入式设备中,尤其是无线路由器等网络设备。对于开发者来说,能够利用 OpenWrt SDK ...
标题中的“holle-world.zip_holle world_holleworld_holleworld 代码_world_你好世界代”似乎是一个拼写错误,应该是“hello-world.zip_hello world_hello_world 代码_world_你好世界代码”。这通常代表着一个初学者...
《Hello World 源码解析》 在编程世界中,"Hello, World!"程序是我们的第一课,它象征着编程之旅的开始。这个名为"hello-world-master"的压缩包文件,很可能包含了某个编程语言实现的"Hello, World!"示例项目。让...
2. **标准库**:遵循ANSI C标准,包括了标准I/O流库(stdio.h)、字符串处理库(string.h)、内存操作库(mem.h)等。这些库函数为编写跨平台的应用程序提供了便利。 3. **设备驱动库**:针对特定的PIC微控制器,...
#include <stdio.h> void main(void) { ; } // Prog2 #include <stdio.h> const char a = 5; void main(void) { ; } ``` 编译输出如下: | | Code | RO Data | RW Data | ZI Data | Debug | Total | |---------...