diff options
Diffstat (limited to 'sapi/cgi/libfcgi/fcgiapp.c')
-rw-r--r-- | sapi/cgi/libfcgi/fcgiapp.c | 58 |
1 files changed, 37 insertions, 21 deletions
diff --git a/sapi/cgi/libfcgi/fcgiapp.c b/sapi/cgi/libfcgi/fcgiapp.c index 863b5e8d6e..75d91f5b93 100644 --- a/sapi/cgi/libfcgi/fcgiapp.c +++ b/sapi/cgi/libfcgi/fcgiapp.c @@ -980,24 +980,7 @@ void FCGX_ClearError(FCGX_Stream *stream) { */ } -/* - *====================================================================== - * Parameters - *====================================================================== - */ -/* - * A vector of pointers representing the parameters received - * by a FastCGI application server, with the vector's length - * and last valid element so adding new parameters is efficient. - */ - -typedef struct Params { - FCGX_ParamArray vec; /* vector of strings */ - int length; /* number of string vec can hold */ - char **cur; /* current item in vec; *cur == NULL */ -} Params; -typedef Params *ParamsPtr; /* *---------------------------------------------------------------------- @@ -1071,13 +1054,45 @@ static void PutParam(ParamsPtr paramsPtr, char *nameValue) *paramsPtr->cur++ = nameValue; size = paramsPtr->cur - paramsPtr->vec; if(size >= paramsPtr->length) { - paramsPtr->length *= 2; - paramsPtr->vec = (FCGX_ParamArray)realloc(paramsPtr->vec, paramsPtr->length * sizeof(char *)); - paramsPtr->cur = paramsPtr->vec + size; + paramsPtr->length *= 2; + paramsPtr->vec = (FCGX_ParamArray)realloc(paramsPtr->vec, paramsPtr->length * sizeof(char *)); + paramsPtr->cur = paramsPtr->vec + size; } *paramsPtr->cur = NULL; } + +void FCGX_PutEnv(FCGX_Request *request, char *var) +{ + char *nameValue; + char *e, **p; + int len; + + if (!strchr(var,'=')) { + return; + } + nameValue = StringCopy(var); + e = strchr(nameValue,'='); + *e = 0; + + /* find the name and replace it */ + len = strlen(nameValue); + + for (p = request->envp; p && *p; ++p) { + if((strncmp(nameValue, *p, len) == 0) && ((*p)[len] == '=')) { + free(*p); + *e = '='; + *p = nameValue; + return; + } + } + *e = '='; + /* this is a new var, add it to the environment */ + PutParam(request->paramsPtr,nameValue); + request->envp = request->paramsPtr->vec; +} + + /* *---------------------------------------------------------------------- * @@ -1100,7 +1115,7 @@ char *FCGX_GetParam(const char *name, FCGX_ParamArray envp) len = strlen(name); - for (p = envp; *p; ++p) { + for (p = envp; p && *p; ++p) { if((strncmp(name, *p, len) == 0) && ((*p)[len] == '=')) { return *p+len+1; } @@ -2027,6 +2042,7 @@ void FCGX_Free(FCGX_Request * request, int close) _FCGX_FreeStream(&request->out, FALSE); _FCGX_FreeStream(&request->err, FALSE); FreeParams(&request->paramsPtr); + request->envp = NULL; if (close) { OS_IpcClose(request->ipcFd); |