sniper Sun Feb 9 18:27:50 2003 EDT Modified files: (Branch: PHP_4_3) /php4/sapi/nsapi nsapi.c Log: MFH: Fixed _SERVER[] variables, memleaks
Index: php4/sapi/nsapi/nsapi.c diff -u php4/sapi/nsapi/nsapi.c:1.28.2.1 php4/sapi/nsapi/nsapi.c:1.28.2.2 --- php4/sapi/nsapi/nsapi.c:1.28.2.1 Tue Dec 31 11:27:13 2002 +++ php4/sapi/nsapi/nsapi.c Sun Feb 9 18:27:50 2003 @@ -13,6 +13,7 @@ | [EMAIL PROTECTED] so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Jayakumar Muthukumarasamy <[EMAIL PROTECTED]> | + | Uwe Schindler <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ @@ -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 @@ 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 @@ { "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 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 @@ 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 @@ 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 @@ } } + 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 @@ 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 module", rc->sn, rc->rq, "%s", message); } @@ -386,34 +445,16 @@ 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), @@ -452,7 +493,7 @@ nsapi_free(SG(request_info).content_type); } -int +int nsapi_module_main(NSLS_D TSRMLS_DC) { zend_file_handle file_handle; @@ -481,7 +522,7 @@ return SUCCESS; } -void NSAPI_PUBLIC +void NSAPI_PUBLIC php4_close(void *vparam) { if (nsapi_sapi_module.shutdown) { @@ -545,7 +586,7 @@ / <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
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php