apache 模块编写 之 helloworld篇

关于apache模块的资料比较少,这里给出两个比较简单的例子,来揭开apache模块神秘的面纱,当然例子很初级,不过只有初级才容易入门,写一个helloworld吧:

/**
 * filename:    helloworld.c
 * author:      lijunjie <lijunjie1982@yahoo.com.cn>
 * version:     1.0
 */
#include <httpd.h>
#include <http_protocol.h>
#include <http_config.h>

static int helloworld_handler(request_rec *r) {
        if (!
r->handler || strcmp(r->handler"helloworld"
)) {
                return 
DECLINED
;
        }
        if (
r->method_number != M_GET
){
                return 
HTTP_METHOD_NOT_ALLOWED
;
        }
        
ap_set_content_type(r,"text/html;charset=asscii"
);
        
ap_rputs("hello world"r
);
        return 
OK
;
}

static void helloworld_hooks(apr_pool_t *pool) {
        
ap_hook_handler(helloworld_handlerNULLNULLAPR_HOOK_MIDDLE
);
}

module AP_MODULE_DECLARE_DATA helloworld_module = {
        
STANDARD20_MODULE_STUFF
,
        
NULL
,
        
NULL
,
        
NULL
,
        
NULL
,
        
NULL
,
        
helloworld_hooks
};

/****** install ***********
compile: apxs -i -c mod_helloworld.c

modify httpd.conf, add

LoadModule helloworld_module modules/mod_helloworld.so

<Location /helloworld>
    SetHandler helloworld
</Location>

********************************/

 

下面给出一个稍微复杂一点的,对我们进一步的了解有很大帮助的,它可以输出一些比较有意义的东西了

/**
 * filename:    helloworld.c
 * author:      lijunjie <lijunjie1982@yahoo.com.cn>
 * version:     1.1
 */
#include <httpd.h>
#include <http_protocol.h>
#include <http_config.h>

static int printitem(void *rec, const char *key, const char *value){
        
// recive rec pointer , we will send  some request use it
        
request_rec *rec;
        
ap_rprintf(r"<tr><th scope=’row’>%s</th><td>%s</td></tr>\n"
                                        
ap_escape_html(r->poolkey), 
                                        
ap_escape_html(r->poolvalue));
        return 
1;
}

static void printtable(request_rec *rapr_table_t *t
                                const 
char *caption, const char *keyhead,
                                const 
char *valhead) {
                
ap_rprintf(r,"<table border=’1′ width=’100%’><caption>%s</caption><thead>"
                                                "<tr><th scope=’col’>%s</th><th scope=’col’>%s"
                                                "</th></tr></thead><tbody>"
,
                                                 
captionkeyheadvalhead);
                
apr_table_do(printitemrtNULL);

                ap_rputs("</tbody></table>\n",r);

}
static int helloworld_handler(request_rec *r) {
        if (!
r->handler || strcmp(r->handler"helloworld")) {
                return 
DECLINED;
        }
        if (
r->method_number != M_GET){
                return 
HTTP_METHOD_NOT_ALLOWED;
        }
        
ap_set_content_type(r,"text/html;charset=asscii");
        
ap_rputs("This is the Apache hello world module<br>"r);
        
printtable(rr->headers_in"Request Headers""Header""Value");
        
printtable(rr->headers_out"Response Headers""Header""Value");
        
printtable(rr->headers_in"Environment""Variable""Value");

        return OK;
}

static void helloworld_hooks(apr_pool_t *pool) {
        
ap_hook_handler(helloworld_handlerNULLNULLAPR_HOOK_MIDDLE);
}

module AP_MODULE_DECLARE_DATA helloworld_module = {
        
STANDARD20_MODULE_STUFF,
        
NULL,
        
NULL,
        
NULL,
        
NULL,
        
NULL,
        
helloworld_hooks
};
/****** install ***********
compile: apxs -i -c mod_helloworld.c

modify httpd.conf, add

LoadModule helloworld_module modules/mod_helloworld.so

<Location /helloworld>
    SetHandler helloworld
</Location>

********************************/

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据