Skip to content

Commit 010fd97

Browse files
author
George Schlossnagle
committed
brief v1 documentation
1 parent 3bdfbd6 commit 010fd97

File tree

1 file changed

+206
-0
lines changed

1 file changed

+206
-0
lines changed

sapi/apache_hooks/README

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
This is very beta documentation. Clearly better stuff can and will follow.
2+
3+
INTRO:
4+
5+
apache_hooks is a full super-set enhancement of the apache 1.3 sapi that allows for
6+
php code to be run on the apache request object at every stage of the apache
7+
request. It supports all of the apache 1.3 sapi commands and configurations, and
8+
additionally supports the following httpd.conf directives:
9+
10+
11+
HTTPD.CONF DIRECTIEVS:
12+
13+
phpRequire /path/to/file = requires a file at the beginning of an
14+
initial apache request
15+
16+
phpUriHandler /path/to/file = registers a hook that will run the
17+
specified file at the uri translation stage of the apache request
18+
phpUriHandler Class::Method = registers a hook to run Class::Method at
19+
the uri translation stage of the apache request
20+
21+
phpPostReadHandler /path/to/file = hook for post-read phase
22+
phpPostReadHandlerMethod Class::Method
23+
24+
phpHeaderHandler = hook for header parsing phase
25+
phpHeaderHandlerMethod
26+
27+
phpAuthHandler = hook for authentication phase
28+
phpAuthHandlerMethod
29+
30+
phpAccessHandler = hook for access control phase
31+
phpAccessHandlerMethod
32+
33+
phpTypeHandler = hook for Type Checking phase
34+
phpTypeHandlerMethod
35+
36+
phpFixupHandler = hook for 'fixup' phase
37+
phpFixupHandlerMethod
38+
39+
phpLoggerHandler = hook for logging phase
40+
phpLoggerHandlerMethod
41+
42+
AddHandler php-script = set's up a special type handler
43+
phpResponseHandler /path/to/file = sets file to be called to handle
44+
response phase
45+
phpResponseHandlerMethod Class::Method
46+
47+
48+
All handlers may be stacked, i.e. you can list multiple handler directives
49+
in a single scope and they will be run in order.
50+
51+
52+
EXAMPLES:
53+
54+
So, to set up a 'hello world' location handler (so that any request to
55+
/hello/* returns hello world) you can:
56+
57+
phpRequire /tmp/setup.php
58+
<Location /hello>
59+
AddHandler php-script
60+
phpResponseHandlerMethod Hello::World
61+
</Location>
62+
63+
with
64+
#/tmp/setup.php
65+
<?
66+
class Hello {
67+
function World() {
68+
global $request;
69+
$request->send_http_header();
70+
echo "Hello World";
71+
}
72+
}
73+
?>
74+
75+
$request is the apache request. It is instantiated at all stages
76+
automatically. The methods of that class are:
77+
78+
getallheaders
79+
args
80+
boundary
81+
content_encoding
82+
content_type
83+
filename
84+
handler
85+
hostname
86+
method
87+
path_info
88+
protocol
89+
status_line
90+
the_request
91+
unparsed_uri
92+
uri
93+
allowed
94+
bytes_sent
95+
chunked
96+
content_length
97+
header_only
98+
method_number
99+
mtime
100+
no_cache
101+
no_local_copy
102+
proto_num
103+
proxyreq
104+
read_body
105+
remaining
106+
request_time
107+
status
108+
headers_in
109+
headers_out
110+
err_headers_out
111+
auth_name
112+
auth_type
113+
basic_auth_pw
114+
discard_request_body
115+
is_initial_req
116+
meets_conditions
117+
remote_host
118+
satisfies
119+
server_port
120+
set_etag
121+
set_last_modified
122+
some_auth_required
123+
update_mtime
124+
send_http_header
125+
basic_http_header
126+
send_header_field
127+
send_http_trace
128+
send_http_options
129+
send_error_response
130+
set_content_length
131+
set_keepalive
132+
rputs
133+
log_error
134+
lookup_uri
135+
lookup_file
136+
method_uri
137+
run
138+
internal_redirect
139+
140+
141+
These all wrap the ap_* apache EXPORT_API functions using the same
142+
semantics (and are also the same as the Apache::Request methods in
143+
mod_perl if you are familiar with that)
144+
145+
So, a uri handler to redirect all non-local traffic to /404.php (an
146+
error page) would be
147+
148+
phpUriHandler /tmp/uri.php
149+
150+
#/tmp/uri.php
151+
<?
152+
if($REMOTE_ADDR != '127.0.0.1') {
153+
$request->uri('/404.php');
154+
}
155+
return OK;
156+
?>
157+
158+
It's important to note that since this is called from the uri
159+
translations phase, this validation is performed for every request to
160+
the server, not just for php pages.
161+
162+
Also, scope is shared between all the hooks. So in the above, we could
163+
merge the two and do something like:
164+
165+
#/tmp/uri.php
166+
<?
167+
if($REMOTE_ADDR != '127.0.0.1') {
168+
$whoami = 'Stranger';
169+
}
170+
else {
171+
$whoami = 'Friend';
172+
}
173+
return DECLINED; # because we're not redirecting, just messing around
174+
?>
175+
176+
and then:
177+
178+
#/tmp/setup.php
179+
<?
180+
class Hello {
181+
function World() {
182+
global $request;
183+
global $whoami;
184+
$request->send_http_header();
185+
echo "Hello $whoami";
186+
}
187+
}
188+
?>
189+
190+
These variables are also in the same scope as a script if your script is
191+
being handled by the standard application/x-httpd-php handler.
192+
193+
This allows you to make decisions and pass data between your handlers
194+
and scripts at all stages.
195+
196+
The above are clearly trite examples, but hopefully give you a starting
197+
point.
198+
199+
One note: all handlers can be validly re-entered 'in sub-requests'.
200+
For this reason you should not define functions/classes here without
201+
anti-redefinition guards (I would just recommend putting them in an
202+
include and using include_one). This is not true for phpRequire, which
203+
is only entered once, at the main request, and so it is safe to make
204+
function/class declarations there (in fact that's what it's for).
205+
206+
Hope that helps!

0 commit comments

Comments
 (0)