Sure. First to build it, you will need to check out HEAD and update main/main.c main/SAPI.* and sapi/apache/* to the apache_hooks branch. Now you can register handlers for any of the apache request api hooks. Valid httpd.conf commands are:
phpRequire /path/to/file = requires a file at the beginning of an initial apache request phpUriHandler /path/to/file = registers a hook that will run the specified file at the uri translation stage of the apache request phpUriHandler Class::Method = registers a hook to run Class::Method at the uri translation stage of the apache request phpPostReadHandler /path/to/file = hook for post-read phase phpPostReadHandlerMethod Class::Method phpHeaderHandler = hook for header parsing phase phpHeaderHandlerMethod phpAuthHandler = hook for authentication phase phpAuthHandlerMethod phpAccessHandler = hook for access control phase phpAccessHandlerMethod phpTypeHandler = hook for Type Checking phase phpTypeHandlerMethod phpFixupHandler = hook for 'fixup' phase phpFixupHandlerMethod phpLoggerHandler = hook for logging phase phpLoggerHandlerMethod AddHandler php-script = set's up a special type handler phpResponseHandler /path/to/file = sets file to be called to handle response phase phpResponseHandlerMethod Class::Method So, to set up a 'hello world' location handler (so that any request to /hello/* returns hello world) you can: phpRequire /tmp/setup.php <Location /hello> AddHandler php-script phpResponseHandlerMethod Hello::World </Location> with #/tmp/setup.php <? class Hello { function World() { global $request; $request->send_http_header(); echo "Hello World"; } } ?> $request is the apache request. It is instantiated at all stages automatically. The methods of that class are: getallheaders args boundary content_encoding content_type filename handler hostname method path_info protocol status_line the_request unparsed_uri uri allowed bytes_sent chunked content_length header_only method_number mtime no_cache no_local_copy proto_num proxyreq read_body remaining request_time status headers_in headers_out err_headers_out auth_name auth_type basic_auth_pw discard_request_body is_initial_req meets_conditions remote_host satisfies server_port set_etag set_last_modified some_auth_required update_mtime send_http_header basic_http_header send_header_field send_http_trace send_http_options send_error_response set_content_length set_keepalive rputs log_error lookup_uri lookup_file method_uri run internal_redirect These all wrap the ap_* apache EXPORT_API functions using the same semantics (and are also the same as the Apache::Request methods in mod_perl if you are familiar with that) So, a uri handler to redirect all non-local traffic to /404.php (an error page) would be phpUriHandler /tmp/uri.php #/tmp/uri.php <? if($REMOTE_ADDR != '127.0.0.1') { $request->uri('/404.php'); } return OK; ?> It's important to note that since this is called from the uri translations phase, this validation is performed for every request to the server, not just for php pages. Also, scope is shared between all the hooks. So in the above, we could merge the two and do something like: #/tmp/uri.php <? if($REMOTE_ADDR != '127.0.0.1') { $whoami = 'Stranger'; } else { $whoami = 'Friend'; } return DECLINED; # because we're not redirecting, just messing around ?> and then: #/tmp/setup.php <? class Hello { function World() { global $request; global $whoami; $request->send_http_header(); echo "Hello $whoami"; } } ?> These variables are also in the same scope as a script if your script is being handled by the standard application/x-httpd-php handler. This allows you to make decisions and pass data between your handlers and scripts at all stages. The above are clearly trite examples, but hopefully give you a starting point. One note: all handlers can be validly re-entered 'in sub-requests'. For this reason you should not define functions/classes here without anti-redefinition guards (I would just recommend putting them in an include and using include_one). This is not true for phpRequire, which is only entered once, at the main request, and so it is safe to make function/class declarations there (in fact that's what it's for). Hope that helps! George On Friday, August 30, 2002, at 03:31 PM, Edin Kadribasic wrote: >> The apache_hooks stuff is about at the stage where people poking >> holes/finding bugs/making suggestions would be very beneficial. Any >> feedback would be appreciated. > > apache_hooks stuff sounds very interesting, but it's kind of difficult > start > playing with it without any pointers. Could you give us some hints/usage > tips on how to get started? > > Edin > > > > -- > PHP Development Mailing List <http://www.php.net/> > To unsubscribe, visit: http://www.php.net/unsub.php > > > // George Schlossnagle // Principal Consultant // OmniTI, Inc http://www.omniti.com // (c) 240.460.5234 (e) [EMAIL PROTECTED] // 1024D/1100A5A0 1370 F70A 9365 96C9 2F5E 56C2 B2B9 262F 1100 A5A0 -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php