经过一周的努力,apache的模块最终开发完成,共200多行的c代码,一遍遍地检查,期待着下周一晚上的上线,第一次做这个小模块出来,心情非常激动。
这次模块开发过程中积累了很多经验,对自己的提高有非常大的帮助,看看上周六写的那个初步模块,呵呵,已经改的面貌全变了,说说现在实现的功能:
1、支持HEAD、GET、POST请求(对HEAD的支持是历史原因)
2、对请求的url做了严格的限制,避免恶意的url
3、简单地压了一下,每秒响应7500
下面既是这一周的完整经验,弥足珍贵,开发伊始,一穷二白,几次重要的关头,几放弃:
2008.12.8 ,周一
根据王斌的指点,加强了对url参数的错误控制,加了日志记录函数,打印debug日志到apache的error_log
用ap_rputs 搞定了callback输出一个字符串的问题
2008.12.9 ,周二
1、解决setcookie.jsp不让resin处理,交给apache处理的大问题,这样所有的在线程序都不用任何修改,其他产品调我们的这个页面也不需要做任何改动,解决办法是在
resin的文档中的一个非常偏僻的角落找到这么一句话,弥足珍贵:
servlet-name='plugin_ignore'/>
2、确认清cookie时候要传domain的细节,由这个细节引申了对空指针的每次都检查,特地定义了一个方便的宏,同时修改了程序中清cookie的bug:
#define IfNull(p) (p==NULL?"null":p)
方便判断指针是否为空,谢石提供了 gcc -E 可以看到c的预处理后结果。
3、解决在apache有https时候用模块的大问题:
[warn] Loaded DSO libexec/mod_setcookie.so uses plain Apache 1.3 API, this module might crash under EAPI! (please recompile it with -DEAPI)
看了apxs编译时候已经有了-DEAPI参数了啊,但是变化loadmodule的顺序,不启动https,只启动80端口等都不行,google了大半天,终于在一个老外的指点下一步步完成,
真是非常感谢他!
解决办法是:
查看apache是否编译了DAPI支持:
httpd -V
If the output contains the line -D EAPI, you have an EAPI version of Apache.
解决办法:
1. vi 模块的 Makefile
#DEF=-Dmy_define=my_value
改成:
DEF=-DEAPI
2. touch setcookie.c 然后make 即可
3. 把生成的so文件拷贝到apache的libexec目录下,重启,再也没有那个可恶的报错啦。
4. 这种有EAPI支持的模块是不能给没有EAPI支持的apache使用的,否则会报错:
Syntax error on line 380 of /home/liufeng/webadm_dev/conf/httpd.conf:
API module structure `setcookie_module' in file /home/liufeng/webadm_dev/libexec/mod_setcookie.so is garbled - perhaps this is not an Apache module DSO?
/home/liufeng/webadm_dev/bin/apachectl start: httpd could not be started
2008.12.10 ,周三
在各种浏览器下进行测试,抓http头,测试功能,包括:
ie6 ok
firefox ok
oprea ok
safari ok
谷歌浏览器
ie7 ok
2008.12.13,周五
增加了对post的支持,重要api如:
ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK)
ap_should_client_block(r)
ap_get_client_block(r, read_data, (POST_MAXLENGTH-1))
特别是ap_get_client_block这个api,一定要对长度做限制,否则会有bug。
2008.12.14,周六:
模拟各种HTTP请求
telnet kaixin.sina.com 80
快捷键"Ctrl+](右中括号)"来打开本地回显功能
GET /post?username=liufeng&kie=ayaheihei..firn&domain=sina.com HTTP/1.1
HOST:
GET / HTTP/1.0
阅读(1505) | 评论(0) | 转发(0) |