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]