Hi Derick,

>
> can you resend that patch to php-dev?


Ofcourse. The patch against the php-4.0.6 php4isapi.c is attached.
If you would like to have a patch against the current CVS version then
please let me know so i can make time to test it first.

Please note that we weren't able to test this fix with other webservers
than IIS.

Regards,
Gijsbert te Riet.
Muze.

--- php4isapi.c Fri Nov 30 12:33:52 2001
+++ isapi.fix   Fri Nov 30 12:35:29 2001
@@ -17,6 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
+
 #ifdef PHP_WIN32
 # include <windows.h>
 # include <process.h>
@@ -81,11 +82,13 @@
        "CONTENT_LENGTH",
        "CONTENT_TYPE",
        "PATH_TRANSLATED",
+       "PATH_INFO",
        "QUERY_STRING",
        "REMOTE_ADDR",
        "REMOTE_HOST",
        "REMOTE_USER",
        "REQUEST_METHOD",
+       "REQUEST_URI",
        "SERVER_NAME",
        "SERVER_PORT",
        "SERVER_PROTOCOL",
@@ -462,38 +465,73 @@
 #endif
 
 
+static char *sapi_isapi_get_server_var(LPEXTENSION_CONTROL_BLOCK lpECB, char 
+*varname, DWORD *buffer_len) {
+       char    *buffer;
+
+       buffer=emalloc(*buffer_len=ISAPI_SERVER_VAR_BUF_SIZE);
+       if (!lpECB->GetServerVariable(lpECB->ConnID, varname, buffer, buffer_len)) {
+               if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
+
+                       buffer = (char *) erealloc(buffer, *buffer_len);
+                       if (!lpECB->GetServerVariable(lpECB->ConnID, varname, buffer, 
+buffer_len)) {
+
+                               efree(buffer);
+                               buffer=0;
+
+                       }
+
+               } else {
+
+                       efree(buffer);
+                       buffer=0;
+               }
+       }
+
+       return buffer;
+}
+
 static void sapi_isapi_register_server_variables2(char **server_variables, 
LPEXTENSION_CONTROL_BLOCK lpECB, zval *track_vars_array, char **recorded_values ELS_DC 
PLS_DC)
 {
        char **p=server_variables;
-       DWORD variable_len;
-       char static_variable_buf[ISAPI_SERVER_VAR_BUF_SIZE];
+       DWORD varsize, varbufsize; 
        char *variable_buf;
+       char *var_buf1, *var_buf2;
 
        while (*p) {
-               variable_len = ISAPI_SERVER_VAR_BUF_SIZE;
-               if (lpECB->GetServerVariable(lpECB->ConnID, *p, static_variable_buf, 
&variable_len)
-                       && static_variable_buf[0]) {
-                       php_register_variable(*p, static_variable_buf, 
track_vars_array ELS_CC PLS_CC);
-                       if (recorded_values) {
-                               recorded_values[p-server_variables] = 
estrndup(static_variable_buf, variable_len);
+
+               if (variable_buf=sapi_isapi_get_server_var(lpECB, *p, &varsize)) {
+                       // translate PATH_INFO to Apache compatible PATH_INFO
+                       if (strcmp(*p, "PATH_INFO") == 0) {
+                               if (var_buf1=sapi_isapi_get_server_var(lpECB, 
+"SCRIPT_NAME", &varbufsize)) {
+                                       memmove(variable_buf, variable_buf + 
+strlen(var_buf1), strlen(variable_buf) - strlen(var_buf1) + 1);
+                                       efree(var_buf1);
+                               }
                        }
-               } else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
-                       variable_buf = (char *) emalloc(variable_len);
-                       if (lpECB->GetServerVariable(lpECB->ConnID, *p, variable_buf, 
&variable_len)
-                               && variable_buf[0]) {
-                               php_register_variable(*p, variable_buf, 
track_vars_array ELS_CC PLS_CC);
+
+                       // translate PATH_TRANSLATED to Apache compatible 
+PATH_TRANSLATED 
+                       if (strcmp(*p, "PATH_TRANSLATED") == 0) {
+                               if (var_buf1=sapi_isapi_get_server_var(lpECB, 
+"PATH_INFO", &varbufsize)) {
+                                       if (var_buf2=sapi_isapi_get_server_var(lpECB, 
+"SCRIPT_NAME", &varbufsize)) {
+                                               
+variable_buf[strlen(variable_buf)-(strlen(var_buf1)-strlen(var_buf2))]='\0';
+                                               efree(var_buf2);
+                                       }
+                                       efree(var_buf1);
+                               }
                        }
+
+                       php_register_variable(*p, variable_buf, track_vars_array 
+ELS_CC PLS_CC);
                        if (recorded_values) {
-                               recorded_values[p-server_variables] = variable_buf;
-                       } else {
-                               efree(variable_buf);
+                               recorded_values[p-server_variables] = 
+estrndup(variable_buf, varsize);
                        }
+
+                       efree(variable_buf);
                }
                p++;
        }
 }
 
 
+
 static void sapi_isapi_register_server_variables(zval *track_vars_array ELS_DC SLS_DC 
PLS_DC)
 {
        DWORD variable_len = ISAPI_SERVER_VAR_BUF_SIZE;
@@ -647,9 +685,25 @@
 
 static void init_request_info(sapi_globals_struct *sapi_globals, 
LPEXTENSION_CONTROL_BLOCK lpECB)
 {
+       DWORD   varbufsize; 
+       char    *var_buf1, *var_buf2;
+
+
        SG(request_info).request_method = lpECB->lpszMethod;
        SG(request_info).query_string = lpECB->lpszQueryString;
        SG(request_info).path_translated = lpECB->lpszPathTranslated;
+
+       // translate PATH_TRANSLATED to Apache compatible PATH_TRANSLATED 
+       if (var_buf1=sapi_isapi_get_server_var(lpECB, "PATH_INFO", &varbufsize)) {
+               if (var_buf2=sapi_isapi_get_server_var(lpECB, "SCRIPT_NAME", 
+&varbufsize)) {
+                       
+SG(request_info).path_translated[strlen(SG(request_info).path_translated)-(strlen(var_buf1)-strlen(var_buf2))]='\0';
+
+
+                       efree(var_buf2);
+               }
+               efree(var_buf1);
+       }
+       
+       
        SG(request_info).request_uri = lpECB->lpszPathInfo;
        SG(request_info).content_type = lpECB->lpszContentType;
        SG(request_info).content_length = lpECB->cbTotalBytes;
-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to