[PHP-DEV] anyone care to poke holes in the apache_hooks stuff

2002-08-30 Thread George Schlossnagle

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.

// 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




Re: [PHP-DEV] anyone care to poke holes in the apache_hooks stuff

2002-08-30 Thread Edin Kadribasic

 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




Re: [PHP-DEV] anyone care to poke holes in the apache_hooks stuff

2002-08-30 Thread George Schlossnagle

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