壊れたメガネ

ホッチキスの達人の意識の高いブログ。

apacheモジュール request_rec構造体をちょっとだけダンプ

apacheモジュールを作成するにあたってrequest_rec構造体を知らなければ何もできないので、
中身をちょっとだけダンプするモジュール作って確認することにしました。
これはそのメモです。

ちょっとだけというのはrequest_rec構造体にはいろいろなメンバがあるのですが、その中でもchar型とint型だけに限りました。
request_rec.serverメンバあたりも興味がありますが、テキトーに時間見つけてやることにしました。

ソースコード


1 #include "httpd.h"
2 #include "http_config.h"
3 #include "http_protocol.h"
4 #include "ap_config.h"
5
6 #define frputs(f, buff, r, prop) \
7 sprintf(buff, "%s:" f "\n", #prop, r->prop); \
8 ap_rputs(buff, r);
9 #define crputs(buff, r, prop) frputs("%s", buff, r, prop)
10 #define irputs(buff, r, prop) frputs("%d", buff, r, prop)
11
12 static int print_request_handler(request_rec *r)
13 {
14 if (strcmp(r->handler, "print_request")) {
15 return DECLINED;
16 }
17 r->content_type = "text/plain";
18
19 if (r->header_only) {
20 return OK;
21 }
22
23 char buff[4096];
24
25 ap_rputs("request_rec構造体のchar型のメンバをちょっとダンプします。\n", r);
26 crputs(buff, r, the_request);
27 crputs(buff, r, protocol);
28 crputs(buff, r, hostname);
29 crputs(buff, r, status_line);
30 crputs(buff, r, method);
31 crputs(buff, r, range);
32 crputs(buff, r, content_type);
33 crputs(buff, r, handler);
34 crputs(buff, r, content_encoding);
35 crputs(buff, r, vlist_validator);
36 crputs(buff, r, user);
37 crputs(buff, r, ap_auth_type);
38 crputs(buff, r, unparsed_uri);
39 crputs(buff, r, uri);
40 crputs(buff, r, filename);
41 crputs(buff, r, canonical_filename);
42 crputs(buff, r, path_info);
43 crputs(buff, r, args);
44
45 irputs(buff, r, assbackwards);
46 irputs(buff, r, proxyreq);
47 irputs(buff, r, header_only);
48 irputs(buff, r, proto_num);
49 irputs(buff, r, status);
50 irputs(buff, r, method_number);
51 irputs(buff, r, chunked);
52 irputs(buff, r, read_body);
53 irputs(buff, r, read_chunked);
54 irputs(buff, r, no_cache);
55 irputs(buff, r, no_local_copy);
56 irputs(buff, r, used_path_info);
57 irputs(buff, r, eos_sent);
58
59
60 return OK;
61 }
62
63 static void print_request_register_hooks(apr_pool_t *p)
64 {
65 ap_hook_handler(print_request_handler, NULL, NULL, APR_HOOK_MIDDLE);
66 }
67
68 /* Dispatch list for API hooks */
69 module AP_MODULE_DECLARE_DATA print_request_module = {
70 STANDARD20_MODULE_STUFF,
71 NULL, /* create per-dir config structures */
72 NULL, /* merge per-dir config structures */
73 NULL, /* create per-server config structures */
74 NULL, /* merge per-server config structures */
75 NULL, /* table of config file commands */
76 print_request_register_hooks /* register hooks */
77 };
78
79
80

次のURLにアクセスした結果
http://localhost/print_request?foo=bar&baz=foobar

request_rec構造体のchar型のメンバをちょっとダンプします。
the_request:GET /print_request?foo=bar&baz=foobar HTTP/1.1
protocol:HTTP/1.1
hostname:localhost
status_line:(null)
method:GET
range:(null)
content_type:text/plain
handler:print_request
content_encoding:(null)
vlist_validator:(null)
user:(null)
ap_auth_type:(null)
unparsed_uri:/print_request?foo=bar&baz=foobar
uri:/print_request
filename:/var/www/html/print_request
canonical_filename:/var/www/html/print_request
path_info:
args:foo=bar&baz=foobar
assbackwards:0
proxyreq:0
header_only:0
proto_num:1001
status:200
method_number:0
chunked:0
read_body:0
read_chunked:0
no_cache:0
no_local_copy:0
used_path_info:2
eos_sent:0