mirror of
https://github.com/php/php-src.git
synced 2024-09-22 02:17:32 +00:00
(NSAPI SAPI) Fixed _SERVER[] variables (all headers included) to be now similar to apache SAPI; with this new file the memory leaks (webserver eats up memory during a few days running) are also disappeared (all by NSAPI allocated strings are freed).
This commit is contained in:
parent
419108f805
commit
738b662b72
@ -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("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("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("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);
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user