分类: C/C++
2008-12-06 22:34:09
用了整整一天的时间,明白了什么是cookie、apache模块编程的基础知识,然后,用今天一整天的时间,写出来一个设置cookie的apache模块,测试一切正常,加了简单的出错控制,如在url里面不传domain或者其他参数的时候,不至于apache报错:
[Sat Dec 6 21:51:06 2008] [notice] child pid 3454 exit signal Segmentation fault (11)
今天调试出来这个模块,应该是我的处女作了吧,呵呵,还有很多需要继续完善的,特别是出错控制,以及数组大小设置多大合适上,明天继续弄,争取明天搞定它,达到“完美”呵呵,以下是全部的代码,希望能给做这方面的同学节省时间。
如需要转载,请注明出处:刘峰blog,谢谢!
/*
** mod_setcookie.c -- Apache sample setcookie module
** [Autogenerated via ``apxs -n setcookie -g'']
**
** To play with this sample module, first compile it into a
** DSO file and install it into Apache's libexec directory
** by running:
**
** $ apxs -c -i mod_setcookie.c
**
** Then activate it in Apache's httpd.conf file, for instance
** for the URL /setcookie, as follows:
**
** # httpd.conf
** LoadModule setcookie_module libexec/mod_setcookie.so
**
** SetHandler setcookie
**
**
** Then after restarting Apache via
**
** $ apachectl restart
**
** you immediately can request the URL /%NAME and watch for the
** output of this module. This can be achieved for instance via:
**
** $ lynx -mime_header
**
** The output should be similar to the following one:
**
** HTTP/1.1 200 OK
** Date: Tue, 31 Mar 1998 14:42:22 GMT
** Server: Apache/1.3.4 (Unix)
** Connection: close
** Content-Type: text/html
**
** The sample page from mod_setcookie.c
*/
#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "ap_config.h"
/* The sample content handler */
static int setcookie_handler(request_rec *r)
{
r->content_type = "text/html";
if (!r->header_only)
// ap_rputs("The sample page from mod_setcookie.c\n", r);
{
char cookie[300] = "SINA_SESS=";
char URL[100];
char URL2[100];
strcpy(URL,r->args);
strcpy(URL2,r->args);
char *p;
char *cookie_name;
char *domain_name;
p = strtok(URL, "&");
while (p)
{
if(cookie_name = strstr(p,"SNCookie"))
{
cookie_name = strtok(cookie_name,"=");
cookie_name = strtok(NULL,"=");
//printf("cookie_name:%s\n", cookie_name);
}
p = strtok(NULL, "&");
}
p = strtok(URL2, "&");
while (p)
{
if(domain_name = strstr(p,"domain"))
{
domain_name = strtok(domain_name,"=");
domain_name = strtok(NULL,"=");
//printf("domain_name:%s\n", domain_name);
}
p = strtok(NULL, "&");
}
if(cookie_name)
{
strcat(cookie,cookie_name);
strcat(cookie,"; domain=.");
}
if(domain_name)
{
strcat(cookie,domain_name);
strcat(cookie,"; path=/");
}
if(cookie)
ap_table_add(r->headers_out,"Set-Cookie",cookie);
ap_send_http_header(r);
}
return OK;
}
/* Dispatch list of content handlers */
static const handler_rec setcookie_handlers[] = {
{ "setcookie", setcookie_handler },
{ NULL, NULL }
};
/* Dispatch list for API hooks */
module MODULE_VAR_EXPORT setcookie_module = {
STANDARD_MODULE_STUFF,
NULL, /* module initializer */
NULL, /* create per-dir config structures */
NULL, /* merge per-dir config structures */
NULL, /* create per-server config structures */
NULL, /* merge per-server config structures */
NULL, /* table of config file commands */
setcookie_handlers, /* [#8] MIME-typed-dispatched handlers */
NULL, /* [#1] URI to filename translation */
NULL, /* [#4] validate user id from request */
NULL, /* [#5] check if the user is ok _here_ */
NULL, /* [#3] check access by host address */
NULL, /* [#6] determine MIME type */
NULL, /* [#7] pre-run fixups */
NULL, /* [#9] log a transaction */
NULL, /* [#2] header parser */
NULL, /* child_init */
NULL, /* child_exit */
NULL /* [#0] post read-request */
};
测试方法为:
1、hosts指向开发服务器
2、浏览器输入:
3、如何判断成功?
在http头的输出中会received:
SINA_SESS Sent ayaheihei..first..login
SINA_SESS Received ayaheihei..second..login / .sina.com
多测试几次,cookie头发送、接收都没有问题,初步搞定!
附:apache模块编译的大体过程和编译方法
建立工作项目
/home/liufeng/webadm_dev/bin/apxs -g -n setcookie
快速编译并部署:
/home/liufeng/webadm_dev/bin/apxs -c -a -i -I/home/liufeng/webadm_dev/apache_.1.3.34_src/apache_1.3.34/src/include/ mod_setcookie.c
/home/liufeng/webadm_dev/bin/apachectl stop
sleep 2
/home/liufeng/webadm_dev/bin/apachectl start