@ -13,6 +13,7 @@
| license @ php . net so we can mail you a copy immediately . |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Author : Jayakumar Muthukumarasamy < jk @ kasenna . com > |
| Uwe Schindler < uwe @ thetaphi . de > |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*/
@ -66,6 +67,8 @@
# define NSLS_CC , NSLS_C
# define NSG(v) (request_context->v)
# define NS_BUF_SIZE 2048
/*
* ZTS needs to be defined for NSAPI to work
*/
@ -95,17 +98,7 @@ typedef struct nsapi_equiv {
static nsapi_equiv nsapi_headers [ ] = {
{ " CONTENT_LENGTH " , " content-length " } ,
{ " CONTENT_TYPE " , " content-type " } ,
{ " HTTP_ACCEPT " , " accept " } ,
{ " HTTP_ACCEPT_ENCODING " , " accept-encoding " } ,
{ " HTTP_ACCEPT_LANGUAGE " , " accept-language " } ,
{ " HTTP_ACCEPT_CHARSET " , " accept-charset " } ,
{ " HTTP_AUTHORIZATION " , " authorization " } ,
{ " HTTP_COOKIE " , " cookie " } ,
{ " HTTP_IF_MODIFIED_SINCE " , " if-modified-since " } ,
{ " HTTP_REFERER " , " referer " } ,
{ " HTTP_USER_AGENT " , " user-agent " } ,
{ " HTTP_USER_DEFINED " , " user-defined " }
{ " CONTENT_TYPE " , " content-type " }
} ;
static size_t nsapi_headers_size = sizeof ( nsapi_headers ) / sizeof ( nsapi_headers [ 0 ] ) ;
@ -113,14 +106,14 @@ static nsapi_equiv nsapi_reqpb[] = {
{ " QUERY_STRING " , " query " } ,
{ " REQUEST_LINE " , " clf-request " } ,
{ " REQUEST_METHOD " , " method " } ,
{ " SCRIPT_NAME " , " uri " } ,
{ " PHP_SELF " , " uri " } ,
{ " SERVER_PROTOCOL " , " protocol " }
} ;
static size_t nsapi_reqpb_size = sizeof ( nsapi_reqpb ) / sizeof ( nsapi_reqpb [ 0 ] ) ;
static nsapi_equiv nsapi_vars [ ] = {
{ " PATH_INFO " , " path-info " } ,
{ " PATH_TRANSLATED " , " path " } ,
{ " SCRIPT_FILENAME " , " path " } ,
{ " AUTH_TYPE " , " auth-type " } ,
{ " CLIENT_CERT " , " auth-cert " } ,
{ " REMOTE_USER " , " auth-user " }
@ -130,10 +123,26 @@ static size_t nsapi_vars_size = sizeof(nsapi_vars)/sizeof(nsapi_vars[0]);
static nsapi_equiv nsapi_client [ ] = {
{ " HTTPS_KEYSIZE " , " keysize " } ,
{ " HTTPS_SECRETSIZE " , " secret-keysize " } ,
{ " REMOTE_ADDR " , " ip " }
{ " REMOTE_ADDR " , " ip " } ,
{ " REMOTE_HOST " , " ip " }
} ;
static size_t nsapi_client_size = sizeof ( nsapi_client ) / sizeof ( nsapi_client [ 0 ] ) ;
static char *
nsapi_strdup ( char * str )
{
if ( str ! = NULL )
return STRDUP ( str ) ;
return NULL ;
}
static void
nsapi_free ( void * addr )
{
if ( addr ! = NULL )
FREE ( addr ) ;
}
static int
sapi_nsapi_ub_write ( const char * str , unsigned int str_length TSRMLS_DC )
{
@ -280,9 +289,10 @@ static void
sapi_nsapi_register_server_variables ( zval * track_vars_array TSRMLS_DC )
{
nsapi_request_context * rc = ( nsapi_request_context * ) SG ( server_context ) ;
size_t i ;
char * value ;
char buf [ 128 ] ;
register size_t i ;
char * value , * p ;
char buf [ NS_BUF_SIZE + 1 ] ;
struct pb_entry * entry ;
for ( i = 0 ; i < nsapi_reqpb_size ; i + + ) {
value = pblock_findval ( nsapi_reqpb [ i ] . nsapi_eq , rc - > rq - > reqpb ) ;
@ -290,7 +300,7 @@ sapi_nsapi_register_server_variables(zval *track_vars_array TSRMLS_DC)
php_register_variable ( ( char * ) nsapi_reqpb [ i ] . env_var , value , track_vars_array TSRMLS_CC ) ;
}
}
for ( i = 0 ; i < nsapi_headers_size ; i + + ) {
value = pblock_findval ( nsapi_headers [ i ] . nsapi_eq , rc - > rq - > headers ) ;
if ( value ) {
@ -298,6 +308,21 @@ sapi_nsapi_register_server_variables(zval *track_vars_array TSRMLS_DC)
}
}
for ( i = 0 ; i < rc - > rq - > headers - > hsize ; i + + ) {
entry = rc - > rq - > headers - > ht [ i ] ;
while ( entry ) {
snprintf ( buf , NS_BUF_SIZE , " HTTP_%s " , entry - > param - > name ) ;
for ( p = buf + 5 ; * p ; p + + ) {
* p = toupper ( * p ) ;
if ( * p < ' A ' | | * p > ' Z ' ) {
* p = ' _ ' ;
}
}
php_register_variable ( buf , entry - > param - > value , track_vars_array TSRMLS_CC ) ;
entry = entry - > next ;
}
}
for ( i = 0 ; i < nsapi_vars_size ; i + + ) {
value = pblock_findval ( nsapi_vars [ i ] . nsapi_eq , rc - > rq - > vars ) ;
if ( value ) {
@ -311,35 +336,69 @@ sapi_nsapi_register_server_variables(zval *track_vars_array TSRMLS_DC)
php_register_variable ( ( char * ) nsapi_client [ i ] . env_var , value , track_vars_array TSRMLS_CC ) ;
}
}
value = session_dns ( rc - > sn ) ;
if ( value ) {
if ( value = session_dns ( rc - > sn ) ) {
php_register_variable ( " REMOTE_HOST " , value , track_vars_array TSRMLS_CC ) ;
nsapi_free ( value ) ;
}
sprintf ( buf , " %d " , conf_getglobals ( ) - > Vport ) ;
php_register_variable ( " SERVER_PORT " , buf , track_vars_array TSRMLS_CC ) ;
if ( ( value = util_hostname ( ) ) ) {
php_register_variable ( " SERVER_NAME " , value , track_vars_array TSRMLS_CC ) ;
}
php_register_variable ( " SERVER_URL " , http_uri2url ( " " , " " ) , track_vars_array TSRMLS_CC ) ;
php_register_variable ( " SERVER_NAME " , conf_getglobals ( ) - > Vserver_hostname , track_vars_array TSRMLS_CC ) ;
value = http_uri2url_dynamic ( " " , " " , rc - > sn , rc - > rq ) ;
php_register_variable ( " SERVER_URL " , value , track_vars_array TSRMLS_CC ) ;
nsapi_free ( value ) ;
php_register_variable ( " SERVER_SOFTWARE " , system_version ( ) , track_vars_array TSRMLS_CC ) ;
php_register_variable ( " HTTPS " , ( security_active ? " ON " : " OFF " ) , track_vars_array TSRMLS_CC ) ;
/* php_register_variable("SERVER_SOFTWARE", MAGNUS_VERSION_STRING, track_vars_array TSRMLS_CC ); */
/*
* Special PHP_SELF variable .
*/
value = pblock_findval ( " uri " , rc - > rq - > reqpb ) ;
if ( value ! = NULL ) {
php_register_variable ( " PHP_SELF " , value , track_vars_array TSRMLS_CC ) ;
}
php_register_variable ( " GATEWAY_INTERFACE " , " CGI/1.1 " , track_vars_array TSRMLS_CC ) ;
/* DOCUMENT_ROOT */
if ( value = request_translate_uri ( " / " , rc - > sn ) ) {
value [ strlen ( value ) - 1 ] = 0 ;
php_register_variable ( " DOCUMENT_ROOT " , value , track_vars_array TSRMLS_CC ) ;
nsapi_free ( value ) ;
}
/* PATH_TRANSLATED */
if ( value = pblock_findval ( " path-info " , rc - > rq - > vars ) ) {
if ( value = request_translate_uri ( value , rc - > sn ) ) {
php_register_variable ( " PATH_TRANSLATED " , value , track_vars_array TSRMLS_CC ) ;
nsapi_free ( value ) ;
}
}
/* Create full Request-URI */
if ( value = pblock_findval ( " uri " , rc - > rq - > reqpb ) ) {
snprintf ( buf , NS_BUF_SIZE , " %s " , value ) ;
if ( value = pblock_findval ( " query " , rc - > rq - > reqpb ) ) {
p = strchr ( buf , 0 ) ;
snprintf ( p , NS_BUF_SIZE - ( p - buf ) , " ?%s " , value ) ;
}
php_register_variable ( " REQUEST_URI " , buf , track_vars_array TSRMLS_CC ) ;
}
/* Create Script-Name */
if ( value = pblock_findval ( " uri " , rc - > rq - > reqpb ) ) {
snprintf ( buf , NS_BUF_SIZE , " %s " , value ) ;
if ( value = pblock_findval ( " path-info " , rc - > rq - > vars ) ) {
buf [ strlen ( buf ) - strlen ( value ) ] = 0 ;
}
php_register_variable ( " SCRIPT_NAME " , buf , track_vars_array TSRMLS_CC ) ;
}
}
static void
nsapi_log_message ( char * message )
{
TSRMLS_FETCH ( ) ;
nsapi_request_context * rc = ( nsapi_request_context * ) SG ( server_context ) ;
log_error ( LOG_INFORM , " PHP_log_message " , rc - > sn , rc - > rq ,
log_error ( LOG_INFORM , " PHP modul e " , rc - > sn , rc - > rq ,
" %s " , message ) ;
}
@ -380,37 +439,22 @@ static sapi_module_struct nsapi_sapi_module = {
sapi_nsapi_register_server_variables , /* register server variables */
nsapi_log_message , /* Log message */
NULL , /* Block interruptions */
NULL , /* Unblock interruptions */
STANDARD_SAPI_MODULE_PROPERTIES
} ;
static char *
nsapi_strdup ( char * str )
{
if ( str ! = NULL )
return STRDUP ( str ) ;
return NULL ;
}
static void
nsapi_free ( void * addr )
{
if ( addr ! = NULL )
FREE ( addr ) ;
}
static void
nsapi_request_ctor ( NSLS_D TSRMLS_DC )
{
char * query_string = pblock_findval ( " query " , NSG ( rq ) - > reqpb ) ;
char * uri = pblock_findval ( " uri " , NSG ( rq ) - > reqpb ) ;
char * path_info = pblock_findval ( " path-info " , NSG ( rq ) - > vars ) ;
char * path_translated = pblock_findval ( " path " , NSG ( rq ) - > vars ) ;
char * request_method = pblock_findval ( " method " , NSG ( rq ) - > reqpb ) ;
char * content_type = pblock_findval ( " content-type " , NSG ( rq ) - > headers ) ;
char * content_length = pblock_findval ( " content-length " , NSG ( rq ) - > headers ) ;
if ( ( path_translated = = NULL ) & & ( uri ! = NULL ) )
path_translated = request_translate_uri ( uri , NSG ( sn ) ) ;
char * path_translated = pblock_findval ( " path " , NSG ( rq ) - > vars ) ; ;
# if defined(NSAPI_DEBUG)
log_error ( LOG_INFORM , " nsapi_request_ctor " , NSG ( sn ) , NSG ( rq ) ,
@ -449,7 +493,7 @@ nsapi_request_dtor(NSLS_D TSRMLS_DC)
nsapi_free ( SG ( request_info ) . content_type ) ;
}
int
int
nsapi_module_main ( NSLS_D TSRMLS_DC )
{
zend_file_handle file_handle ;
@ -478,7 +522,7 @@ nsapi_module_main(NSLS_D TSRMLS_DC)
return SUCCESS ;
}
void NSAPI_PUBLIC
void NSAPI_PUBLIC
php4_close ( void * vparam )
{
if ( nsapi_sapi_module . shutdown ) {
@ -542,7 +586,7 @@ php4_execute(pblock *pb, Session *sn, Request *rq)
/ < Object ppath = " path/to/be/authenticated/by/php/* " >
/ AuthTrans fn = " php4_auth_trans "
/*********************************************************/
int NSAPI_PUBLIC
int NSAPI_PUBLIC
php4_auth_trans ( pblock * pb , Session * sn , Request * rq )
{
/*This is a DO NOTHING function that allows authentication information