📄 jk_isapi_plugin.c
字号:
return JK_FALSE;}static void write_error_response(PHTTP_FILTER_CONTEXT pfc,char *status,char * msg){ char crlf[3] = { (char)13, (char)10, '\0' }; char ctype[30]; DWORD len = strlen(msg); sprintf(ctype, "Content-Type:text/html%s%s", crlf, crlf); /* reject !!! */ pfc->ServerSupportFunction(pfc, SF_REQ_SEND_RESPONSE_HEADER, status, (DWORD)crlf, (DWORD)ctype); pfc->WriteClient(pfc, msg, &len, 0);}static int JK_METHOD start_response(jk_ws_service_t *s, int status, const char *reason, const char * const *header_names, const char * const *header_values, unsigned num_of_headers){ static char crlf[3] = { (char)13, (char)10, '\0' }; jk_log(logger, JK_LOG_DEBUG, "Into jk_ws_service_t::start_response\n"); if (status < 100 || status > 1000) { jk_log(logger, JK_LOG_ERROR, "jk_ws_service_t::start_response, invalid status %d\n", status); return JK_FALSE; } if (s && s->ws_private) { isapi_private_data_t *p = s->ws_private; if (!p->request_started) { DWORD len_of_status; char *status_str; char *headers_str; p->request_started = JK_TRUE; /* * Create the status line */ if (!reason) { reason = ""; } status_str = (char *)_alloca((6 + strlen(reason)) * sizeof(char)); sprintf(status_str, "%d %s", status, reason); len_of_status = strlen(status_str); /* * Create response headers string */ if (num_of_headers) { unsigned i; unsigned len_of_headers; for(i = 0 , len_of_headers = 0 ; i < num_of_headers ; i++) { len_of_headers += strlen(header_names[i]); len_of_headers += strlen(header_values[i]); len_of_headers += 4; /* extra for colon, space and crlf */ } len_of_headers += 3; /* crlf and terminating null char */ headers_str = (char *)_alloca(len_of_headers * sizeof(char)); headers_str[0] = '\0'; for(i = 0 ; i < num_of_headers ; i++) { strcat(headers_str, header_names[i]); strcat(headers_str, ": "); strcat(headers_str, header_values[i]); strcat(headers_str, crlf); } strcat(headers_str, crlf); } else { headers_str = crlf; } if (!p->lpEcb->ServerSupportFunction(p->lpEcb->ConnID, HSE_REQ_SEND_RESPONSE_HEADER, status_str, (LPDWORD)&len_of_status, (LPDWORD)headers_str)) { jk_log(logger, JK_LOG_ERROR, "jk_ws_service_t::start_response, ServerSupportFunction failed\n"); return JK_FALSE; } } return JK_TRUE; } jk_log(logger, JK_LOG_ERROR, "jk_ws_service_t::start_response, NULL parameters\n"); return JK_FALSE;}static int JK_METHOD read(jk_ws_service_t *s, void *b, unsigned l, unsigned *a){ jk_log(logger, JK_LOG_DEBUG, "Into jk_ws_service_t::read\n"); if (s && s->ws_private && b && a) { isapi_private_data_t *p = s->ws_private; *a = 0; if (l) { char *buf = b; DWORD already_read = p->lpEcb->cbAvailable - p->bytes_read_so_far; if (already_read >= l) { memcpy(buf, p->lpEcb->lpbData + p->bytes_read_so_far, l); p->bytes_read_so_far += l; *a = l; } else { /* * Try to copy what we already have */ if (already_read > 0) { memcpy(buf, p->lpEcb->lpbData + p->bytes_read_so_far, already_read); buf += already_read; l -= already_read; p->bytes_read_so_far = p->lpEcb->cbAvailable; *a = already_read; } /* * Now try to read from the client ... */ if (p->lpEcb->ReadClient(p->lpEcb->ConnID, buf, &l)) { *a += l; } else { jk_log(logger, JK_LOG_ERROR, "jk_ws_service_t::read, ReadClient failed\n"); return JK_FALSE; } } } return JK_TRUE; } jk_log(logger, JK_LOG_ERROR, "jk_ws_service_t::read, NULL parameters\n"); return JK_FALSE;}static int JK_METHOD write(jk_ws_service_t *s, const void *b, unsigned l){ jk_log(logger, JK_LOG_DEBUG, "Into jk_ws_service_t::write\n"); if (s && s->ws_private && b) { isapi_private_data_t *p = s->ws_private; if (l) { unsigned written = 0; char *buf = (char *)b; if (!p->request_started) { start_response(s, 200, NULL, NULL, NULL, 0); } while(written < l) { DWORD try_to_write = l - written; if (!p->lpEcb->WriteClient(p->lpEcb->ConnID, buf + written, &try_to_write, 0)) { jk_log(logger, JK_LOG_ERROR, "jk_ws_service_t::write, WriteClient failed\n"); return JK_FALSE; } written += try_to_write; } } return JK_TRUE; } jk_log(logger, JK_LOG_ERROR, "jk_ws_service_t::write, NULL parameters\n"); return JK_FALSE;}BOOL WINAPI GetFilterVersion(PHTTP_FILTER_VERSION pVer){ ULONG http_filter_revision = HTTP_FILTER_REVISION; pVer->dwFilterVersion = pVer->dwServerFilterVersion; if (pVer->dwFilterVersion > http_filter_revision) { pVer->dwFilterVersion = http_filter_revision; } pVer->dwFlags = SF_NOTIFY_ORDER_HIGH | SF_NOTIFY_SECURE_PORT | SF_NOTIFY_NONSECURE_PORT | SF_NOTIFY_PREPROC_HEADERS | SF_NOTIFY_AUTH_COMPLETE; strcpy(pVer->lpszFilterDesc, VERSION_STRING); if (!is_inited) { return initialize_extension(); } return TRUE;}DWORD WINAPI HttpFilterProc(PHTTP_FILTER_CONTEXT pfc, DWORD dwNotificationType, LPVOID pvNotification){ /* Initialise jk */ if (is_inited && !is_mapread) { char serverName[MAX_SERVERNAME]; DWORD dwLen = sizeof(serverName); if (pfc->GetServerVariable(pfc, SERVER_NAME, serverName, &dwLen)){ if (dwLen > 0) serverName[dwLen-1] = '\0'; if (init_jk(serverName)) is_mapread = JK_TRUE; } /* If we can't read the map we become dormant */ if (!is_mapread) is_inited = JK_FALSE; } if (is_inited && (iis5 < 0) ) { char serverSoftware[256]; DWORD dwLen = sizeof(serverSoftware); iis5=0; if (pfc->GetServerVariable(pfc,SERVER_SOFTWARE, serverSoftware, &dwLen)){ iis5=(atof(serverSoftware + 14) >= 5.0); if (iis5) { jk_log(logger, JK_LOG_INFO,"Detected IIS >= 5.0\n"); } else { jk_log(logger, JK_LOG_INFO,"Detected IIS < 5.0\n"); } } } if (is_inited && (((SF_NOTIFY_PREPROC_HEADERS == dwNotificationType) && !iis5) || ((SF_NOTIFY_AUTH_COMPLETE == dwNotificationType) && iis5) ) ) { char uri[INTERNET_MAX_URL_LENGTH]; char snuri[INTERNET_MAX_URL_LENGTH]="/"; char Host[INTERNET_MAX_URL_LENGTH]=""; char Port[INTERNET_MAX_URL_LENGTH]=""; char Translate[INTERNET_MAX_URL_LENGTH]; BOOL (WINAPI * GetHeader) (struct _HTTP_FILTER_CONTEXT * pfc, LPSTR lpszName, LPVOID lpvBuffer, LPDWORD lpdwSize ); BOOL (WINAPI * SetHeader) (struct _HTTP_FILTER_CONTEXT * pfc, LPSTR lpszName, LPSTR lpszValue ); BOOL (WINAPI * AddHeader) (struct _HTTP_FILTER_CONTEXT * pfc, LPSTR lpszName,LPSTR lpszValue ); char *query; DWORD sz = sizeof(uri); DWORD szHost = sizeof(Host); DWORD szPort = sizeof(Port); DWORD szTranslate = sizeof(Translate); if (iis5) { GetHeader=((PHTTP_FILTER_AUTH_COMPLETE_INFO)pvNotification)->GetHeader; SetHeader=((PHTTP_FILTER_AUTH_COMPLETE_INFO)pvNotification)->SetHeader; AddHeader=((PHTTP_FILTER_AUTH_COMPLETE_INFO)pvNotification)->AddHeader; } else { GetHeader=((PHTTP_FILTER_PREPROC_HEADERS)pvNotification)->GetHeader; SetHeader=((PHTTP_FILTER_PREPROC_HEADERS)pvNotification)->SetHeader; AddHeader=((PHTTP_FILTER_PREPROC_HEADERS)pvNotification)->AddHeader; } jk_log(logger, JK_LOG_DEBUG, "HttpFilterProc started\n"); /* * Just in case somebody set these headers in the request! */ SetHeader(pfc, URI_HEADER_NAME, NULL); SetHeader(pfc, QUERY_HEADER_NAME, NULL); SetHeader(pfc, WORKER_HEADER_NAME, NULL); SetHeader(pfc, TOMCAT_TRANSLATE_HEADER_NAME, NULL); if (!GetHeader(pfc, "url", (LPVOID)uri, (LPDWORD)&sz)) { jk_log(logger, JK_LOG_ERROR, "HttpFilterProc error while getting the url\n"); return SF_STATUS_REQ_ERROR; } if (strlen(uri)) { int rc; char *worker=0; query = strchr(uri, '?'); if (query) { *query++ = '\0'; } rc = unescape_url(uri); if (rc == BAD_REQUEST) { jk_log(logger, JK_LOG_ERROR, "HttpFilterProc [%s] contains one or more invalid escape sequences.\n", uri); write_error_response(pfc,"400 Bad Request", "<HTML><BODY><H1>Request contains invalid encoding</H1></BODY></HTML>"); return SF_STATUS_REQ_FINISHED; } else if(rc == BAD_PATH) { jk_log(logger, JK_LOG_EMERG, "HttpFilterProc [%s] contains forbidden escape sequences.\n", uri); write_error_response(pfc,"403 Forbidden", "<HTML><BODY><H1>Access is Forbidden</H1></BODY></HTML>"); return SF_STATUS_REQ_FINISHED; } getparents(uri); if (pfc->GetServerVariable(pfc, SERVER_NAME, (LPVOID)Host, (LPDWORD)&szHost)){ if (szHost > 0) { Host[szHost-1] = '\0'; } } Port[0] = '\0'; if (pfc->GetServerVariable(pfc, "SERVER_PORT", (LPVOID)Port, (LPDWORD)&szPort)){ if (szPort > 0) { Port[szPort-1] = '\0'; } } szPort = atoi(Port); if (szPort != 80 && szPort != 443 && szHost > 0){ strcat(Host,":"); strcat(Host,Port); } if (szHost > 0) { strcat(snuri,Host); strcat(snuri,uri); jk_log(logger, JK_LOG_DEBUG, "In HttpFilterProc Virtual Host redirection of %s\n", snuri); worker = map_uri_to_worker(uw_map, snuri, logger); } if (!worker) { jk_log(logger, JK_LOG_DEBUG, "In HttpFilterProc test Default redirection of %s\n", uri); worker = map_uri_to_worker(uw_map, uri, logger); } if (worker) { char *forwardURI; /* This is a servlet, should redirect ... */ jk_log(logger, JK_LOG_DEBUG, "HttpFilterProc [%s] is a servlet url - should redirect to %s\n", uri, worker); /* get URI we should forward */ if (uri_select_option == URI_SELECT_OPT_UNPARSED) { /* get original unparsed URI */ GetHeader(pfc, "url", (LPVOID)uri, (LPDWORD)&sz); /* restore terminator for uri portion */ if (query) *(query - 1) = '\0'; jk_log(logger, JK_LOG_DEBUG, "HttpFilterProc fowarding original URI [%s]\n",uri); forwardURI = uri; } else if (uri_select_option == URI_SELECT_OPT_ESCAPED) { if (!escape_url(uri,snuri,INTERNET_MAX_URL_LENGTH)) { jk_log(logger, JK_LOG_ERROR, "HttpFilterProc [%s] re-encoding request exceeds maximum buffer size.\n", uri); write_error_response(pfc,"400 Bad Request",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -