📄 php4isapi.c
字号:
{ LPEXTENSION_CONTROL_BLOCK lpECB = (LPEXTENSION_CONTROL_BLOCK) SG(server_context); DWORD read_from_buf=0; DWORD read_from_input=0; DWORD total_read=0; if ((DWORD) SG(read_post_bytes) < lpECB->cbAvailable) { read_from_buf = MIN(lpECB->cbAvailable-SG(read_post_bytes), count_bytes); memcpy(buffer, lpECB->lpbData+SG(read_post_bytes), read_from_buf); total_read += read_from_buf; } if (read_from_buf<count_bytes && (SG(read_post_bytes)+read_from_buf) < lpECB->cbTotalBytes) { DWORD cbRead=0, cbSize; read_from_input = MIN(count_bytes-read_from_buf, lpECB->cbTotalBytes-SG(read_post_bytes)-read_from_buf); while (cbRead < read_from_input) { cbSize = read_from_input - cbRead; if (!lpECB->ReadClient(lpECB->ConnID, buffer+read_from_buf+cbRead, &cbSize) || cbSize==0) { break; } cbRead += cbSize; } total_read += cbRead; } return total_read;}static char *sapi_isapi_read_cookies(TSRMLS_D){ LPEXTENSION_CONTROL_BLOCK lpECB = (LPEXTENSION_CONTROL_BLOCK) SG(server_context); char variable_buf[ISAPI_SERVER_VAR_BUF_SIZE]; DWORD variable_len = ISAPI_SERVER_VAR_BUF_SIZE; if (lpECB->GetServerVariable(lpECB->ConnID, "HTTP_COOKIE", variable_buf, &variable_len)) { return estrndup(variable_buf, variable_len); } else if (GetLastError()==ERROR_INSUFFICIENT_BUFFER) { char *tmp_variable_buf = (char *) emalloc(variable_len+1); if (lpECB->GetServerVariable(lpECB->ConnID, "HTTP_COOKIE", tmp_variable_buf, &variable_len)) { tmp_variable_buf[variable_len] = 0; return tmp_variable_buf; } else { efree(tmp_variable_buf); } } return estrndup("", sizeof("")-1);}#ifdef WITH_ZEUSstatic void sapi_isapi_register_zeus_ssl_variables(LPEXTENSION_CONTROL_BLOCK lpECB, zval *track_vars_array TSRMLS_DC){ char static_variable_buf[ISAPI_SERVER_VAR_BUF_SIZE]; DWORD variable_len = ISAPI_SERVER_VAR_BUF_SIZE; char static_cons_buf[ISAPI_SERVER_VAR_BUF_SIZE]; /* * We need to construct the /C=.../ST=... * DN's for SSL_CLIENT_DN and SSL_CLIENT_I_DN */ strcpy( static_cons_buf, "/C=" ); if( lpECB->GetServerVariable( lpECB->ConnID, "SSL_CLIENT_C", static_variable_buf, &variable_len ) && static_variable_buf[0] ) { strlcat( static_cons_buf, static_variable_buf, ISAPI_SERVER_VAR_BUF_SIZE ); } strlcat( static_cons_buf, "/ST=", ISAPI_SERVER_VAR_BUF_SIZE ); variable_len = ISAPI_SERVER_VAR_BUF_SIZE; if( lpECB->GetServerVariable( lpECB->ConnID, "SSL_CLIENT_ST", static_variable_buf, &variable_len ) && static_variable_buf[0] ) { strlcat( static_cons_buf, static_variable_buf, ISAPI_SERVER_VAR_BUF_SIZE ); } php_register_variable( "SSL_CLIENT_DN", static_cons_buf, track_vars_array TSRMLS_CC ); strcpy( static_cons_buf, "/C=" ); variable_len = ISAPI_SERVER_VAR_BUF_SIZE; if( lpECB->GetServerVariable( lpECB->ConnID, "SSL_CLIENT_I_C", static_variable_buf, &variable_len ) && static_variable_buf[0] ) { strlcat( static_cons_buf, static_variable_buf, ISAPI_SERVER_VAR_BUF_SIZE ); } strlcat( static_cons_buf, "/ST=", ISAPI_SERVER_VAR_BUF_SIZE ); variable_len = ISAPI_SERVER_VAR_BUF_SIZE; if( lpECB->GetServerVariable( lpECB->ConnID, "SSL_CLIENT_I_ST", static_variable_buf, &variable_len ) && static_variable_buf[0] ) { strlcat( static_cons_buf, static_variable_buf, ISAPI_SERVER_VAR_BUF_SIZE ); } php_register_variable( "SSL_CLIENT_I_DN", static_cons_buf, track_vars_array TSRMLS_CC ); }static void sapi_isapi_register_zeus_variables(LPEXTENSION_CONTROL_BLOCK lpECB, zval *track_vars_array TSRMLS_DC){ char static_variable_buf[ISAPI_SERVER_VAR_BUF_SIZE]; DWORD variable_len = ISAPI_SERVER_VAR_BUF_SIZE; DWORD scriptname_len = ISAPI_SERVER_VAR_BUF_SIZE; DWORD pathinfo_len = 0; char *strtok_buf = NULL; /* Get SCRIPT_NAME, we use this to work out which bit of the URL * belongs in PHP's version of PATH_INFO */ lpECB->GetServerVariable(lpECB->ConnID, "SCRIPT_NAME", static_variable_buf, &scriptname_len); /* Adjust Zeus' version of PATH_INFO, set PHP_SELF, * and generate REQUEST_URI */ if ( lpECB->GetServerVariable(lpECB->ConnID, "PATH_INFO", static_variable_buf, &variable_len) && static_variable_buf[0] ) { /* PHP_SELF is just PATH_INFO */ php_register_variable( "PHP_SELF", static_variable_buf, track_vars_array TSRMLS_CC ); /* Chop off filename to get just the 'real' PATH_INFO' */ pathinfo_len = variable_len - scriptname_len; php_register_variable( "PATH_INFO", static_variable_buf + scriptname_len - 1, track_vars_array TSRMLS_CC ); /* append query string to give url... extra byte for '?' */ if ( strlen(lpECB->lpszQueryString) + variable_len + 1 < ISAPI_SERVER_VAR_BUF_SIZE ) { /* append query string only if it is present... */ if ( strlen(lpECB->lpszQueryString) ) { static_variable_buf[ variable_len - 1 ] = '?'; strcpy( static_variable_buf + variable_len, lpECB->lpszQueryString ); } php_register_variable( "URL", static_variable_buf, track_vars_array TSRMLS_CC ); php_register_variable( "REQUEST_URI", static_variable_buf, track_vars_array TSRMLS_CC ); } } /* Get and adjust PATH_TRANSLATED to what PHP wants */ variable_len = ISAPI_SERVER_VAR_BUF_SIZE; if ( lpECB->GetServerVariable(lpECB->ConnID, "PATH_TRANSLATED", static_variable_buf, &variable_len) && static_variable_buf[0] ) { static_variable_buf[ variable_len - pathinfo_len - 1 ] = '\0'; php_register_variable( "PATH_TRANSLATED", static_variable_buf, track_vars_array TSRMLS_CC ); } /* Bring in the AUTHENTICATION stuff as needed */ variable_len = ISAPI_SERVER_VAR_BUF_SIZE; if ( lpECB->GetServerVariable(lpECB->ConnID, "AUTH_USER", static_variable_buf, &variable_len) && static_variable_buf[0] ) { php_register_variable( "PHP_AUTH_USER", static_variable_buf, track_vars_array TSRMLS_CC ); } variable_len = ISAPI_SERVER_VAR_BUF_SIZE; if ( lpECB->GetServerVariable(lpECB->ConnID, "AUTH_PASSWORD", static_variable_buf, &variable_len) && static_variable_buf[0] ) { php_register_variable( "PHP_AUTH_PW", static_variable_buf, track_vars_array TSRMLS_CC ); } variable_len = ISAPI_SERVER_VAR_BUF_SIZE; if ( lpECB->GetServerVariable(lpECB->ConnID, "AUTH_TYPE", static_variable_buf, &variable_len) && static_variable_buf[0] ) { php_register_variable( "AUTH_TYPE", static_variable_buf, track_vars_array TSRMLS_CC ); } /* And now, for the SSL variables (if applicable) */ variable_len = ISAPI_SERVER_VAR_BUF_SIZE; if ( lpECB->GetServerVariable(lpECB->ConnID, "CERT_COOKIE", static_variable_buf, &variable_len) && static_variable_buf[0] ) { sapi_isapi_register_zeus_ssl_variables( lpECB, track_vars_array TSRMLS_CC ); } /* Copy some of the variables we need to meet Apache specs */ variable_len = ISAPI_SERVER_VAR_BUF_SIZE; if ( lpECB->GetServerVariable(lpECB->ConnID, "SERVER_SOFTWARE", static_variable_buf, &variable_len) && static_variable_buf[0] ) { php_register_variable( "SERVER_SIGNATURE", static_variable_buf, track_vars_array TSRMLS_CC ); }}#elsestatic void sapi_isapi_register_iis_variables(LPEXTENSION_CONTROL_BLOCK lpECB, zval *track_vars_array TSRMLS_DC){ char static_variable_buf[ISAPI_SERVER_VAR_BUF_SIZE]; char path_info_buf[ISAPI_SERVER_VAR_BUF_SIZE]; DWORD variable_len = ISAPI_SERVER_VAR_BUF_SIZE; DWORD scriptname_len = ISAPI_SERVER_VAR_BUF_SIZE; DWORD pathinfo_len = 0; HSE_URL_MAPEX_INFO humi; /* Get SCRIPT_NAME, we use this to work out which bit of the URL * belongs in PHP's version of PATH_INFO. SCRIPT_NAME also becomes PHP_SELF. */ lpECB->GetServerVariable(lpECB->ConnID, "SCRIPT_NAME", static_variable_buf, &scriptname_len); php_register_variable("SCRIPT_FILENAME", SG(request_info).path_translated, track_vars_array TSRMLS_CC); /* Adjust IIS' version of PATH_INFO, set PHP_SELF, * and generate REQUEST_URI * Get and adjust PATH_TRANSLATED to what PHP wants */ if ( lpECB->GetServerVariable(lpECB->ConnID, "PATH_INFO", static_variable_buf, &variable_len) && static_variable_buf[0] ) { /* Chop off filename to get just the 'real' PATH_INFO' */ php_register_variable( "ORIG_PATH_INFO", static_variable_buf, track_vars_array TSRMLS_CC ); pathinfo_len = variable_len - scriptname_len; strncpy(path_info_buf, static_variable_buf + scriptname_len - 1, sizeof(path_info_buf)-1); php_register_variable( "PATH_INFO", path_info_buf, track_vars_array TSRMLS_CC ); /* append query string to give url... extra byte for '?' */ if ( strlen(lpECB->lpszQueryString) + variable_len + 1 < ISAPI_SERVER_VAR_BUF_SIZE ) { /* append query string only if it is present... */ if ( strlen(lpECB->lpszQueryString) ) { static_variable_buf[ variable_len - 1 ] = '?'; strcpy( static_variable_buf + variable_len, lpECB->lpszQueryString ); } php_register_variable( "URL", static_variable_buf, track_vars_array TSRMLS_CC ); php_register_variable( "REQUEST_URI", static_variable_buf, track_vars_array TSRMLS_CC ); } variable_len = ISAPI_SERVER_VAR_BUF_SIZE; if ( lpECB->GetServerVariable(lpECB->ConnID, "PATH_TRANSLATED", static_variable_buf, &variable_len) && static_variable_buf[0] ) { php_register_variable( "ORIG_PATH_TRANSLATED", static_variable_buf, track_vars_array TSRMLS_CC ); } if (lpECB->ServerSupportFunction(lpECB->ConnID, HSE_REQ_MAP_URL_TO_PATH_EX, path_info_buf, &pathinfo_len, (LPDWORD) &humi)) { /* Remove trailing \ */ if (humi.lpszPath[variable_len-2] == '\\') { humi.lpszPath[variable_len-2] = 0; } php_register_variable("PATH_TRANSLATED", humi.lpszPath, track_vars_array TSRMLS_CC); } } static_variable_buf[0] = '/'; static_variable_buf[1] = 0; variable_len = 2; if (lpECB->ServerSupportFunction(lpECB->ConnID, HSE_REQ_MAP_URL_TO_PATH_EX, static_variable_buf, &variable_len, (LPDWORD) &humi)) { /* Remove trailing \ */ if (humi.lpszPath[variable_len-2] == '\\') { humi.lpszPath[variable_len-2] = 0; } php_register_variable("DOCUMENT_ROOT", humi.lpszPath, track_vars_array TSRMLS_CC); } if (!SG(request_info).auth_user || !SG(request_info).auth_password || !SG(request_info).auth_user[0] || !SG(request_info).auth_password[0]) { variable_len = ISAPI_SERVER_VAR_BUF_SIZE; if (lpECB->GetServerVariable(lpECB->ConnID, "HTTP_AUTHORIZATION", static_variable_buf, &variable_len) && static_variable_buf[0]) { php_handle_auth_data(static_variable_buf TSRMLS_CC); } } if (SG(request_info).auth_user) { php_register_variable("PHP_AUTH_USER", SG(request_info).auth_user, track_vars_array TSRMLS_CC ); } if (SG(request_info).auth_password) { php_register_variable("PHP_AUTH_PW", SG(request_info).auth_password, track_vars_array TSRMLS_CC ); }}#endifstatic void sapi_isapi_register_server_variables2(char **server_variables, LPEXTENSION_CONTROL_BLOCK lpECB, zval *track_vars_array, char **recorded_values TSRMLS_DC){ char **p=server_variables; DWORD variable_len; char static_variable_buf[ISAPI_SERVER_VAR_BUF_SIZE]; char *variable_buf; 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 TSRMLS_CC); if (recorded_values) { recorded_values[p-server_variables] = estrndup(static_variable_buf, variable_len); } } else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { variable_buf = (char *) emalloc(variable_len+1); if (lpECB->GetServerVariable(lpECB->ConnID, *p, variable_buf, &variable_len) && variable_buf[0]) { php_register_variable(*p, variable_buf, track_vars_array TSRMLS_CC); } if (recorded_values) { recorded_values[p-server_variables] = variable_buf; } else { efree(variable_buf); } } else { /* for compatibility with Apache SAPIs */ php_register_variable(*p, "", track_vars_array TSRMLS_CC); } p++; }}static void sapi_isapi_register_server_variables(zval *track_vars_array TSRMLS_DC){ DWORD variable_len = ISAPI_SERVER_VAR_BUF_SIZE; char *variable; char *strtok_buf = NULL; char *isapi_special_server_variables[NUM_SPECIAL_VARS]; LPEXTENSION_CONTROL_BLOCK lpECB; lpECB = (LPEXTENSION_CONTROL_BLOCK) SG(server_context); /* Register the special ISAPI variables */ memset(isapi_special_server_variables, 0, sizeof(isapi_special_server_variables)); sapi_isapi_register_server_variables2(isapi_special_server_variable_names, lpECB, track_vars_array, isapi_special_server_variables TSRMLS_CC); if (SG(request_info).cookie_data) { php_register_variable("HTTP_COOKIE", SG(request_info).cookie_data, track_vars_array TSRMLS_CC); } /* Register the standard ISAPI variables */ sapi_isapi_register_server_variables2(isapi_server_variable_names, lpECB, track_vars_array, NULL TSRMLS_CC); if (isapi_special_server_variables[SPECIAL_VAR_HTTPS] && (atoi(isapi_special_server_variables[SPECIAL_VAR_HTTPS]) || !strcasecmp(isapi_special_server_variables[SPECIAL_VAR_HTTPS], "on")) ) { /* Register SSL ISAPI variables */ sapi_isapi_register_server_variables2(isapi_secure_server_variable_names, lpECB, track_vars_array, NULL TSRMLS_CC); } if (isapi_special_server_variables[SPECIAL_VAR_HTTPS]) { efree(isapi_special_server_variables[SPECIAL_VAR_HTTPS]); }#ifdef WITH_ZEUS sapi_isapi_register_zeus_variables(lpECB, track_vars_array TSRMLS_CC);#else sapi_isapi_register_iis_variables(lpECB, track_vars_array TSRMLS_CC);#endif /* PHP_SELF support */ if (isapi_special_server_variables[SPECIAL_VAR_PHP_SELF]) { php_register_variable("PHP_SELF", isapi_special_server_variables[SPECIAL_VAR_PHP_SELF], track_vars_array TSRMLS_CC); efree(isapi_special_server_variables[SPECIAL_VAR_PHP_SELF]); } if (isapi_special_server_variables[SPECIAL_VAR_ALL_HTTP]) { /* Register the internal bits of ALL_HTTP */ variable = php_strtok_r(isapi_special_server_variables[SPECIAL_VAR_ALL_HTTP], "\r\n", &strtok_buf); while (variable) { char *colon = strchr(variable, ':'); if (colon) { char *value = colon+1; while (*value==' ') {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -