jk_nsapi_plugin.c
来自「以便Apache与其他服务进行整合 Mod_JK安装」· C语言 代码 · 共 609 行 · 第 1/2 页
C
609 行
rc = REQ_PROCEED; }*/ } }#ifdef NETWARE PR_IsSocketSecure = (int (*)(void **))ImportSymbol(GetNLMHandle(), "PR_IsSocketSecure");#endif return rc;}NSAPI_PUBLIC void jk_term(void *p){#ifdef NETWARE if (NULL != PR_IsSocketSecure) { UnimportSymbol(GetNLMHandle(), "PR_IsSocketSecure"); PR_IsSocketSecure = NULL; }#endif if (uw_map) { uri_worker_map_free(&uw_map, logger); } if (init_map) { jk_map_free(&init_map); } jk_shm_close(); wc_close(logger); if (logger) { jk_close_file_logger(&logger); }}NSAPI_PUBLIC int jk_service(pblock * pb, Session * sn, Request * rq){ char *worker_name = pblock_findval(JK_WORKER_NAME_TAG, pb); char *uri_pattern = pblock_findval(URI_PATTERN, pb); jk_worker_t *worker; int rc = REQ_ABORTED; if (uri_pattern) { char *uri = pblock_findval("uri", rq->reqpb); if (0 != shexp_match(uri, uri_pattern)) { return REQ_NOACTION; } } if (!worker_name) { worker_name = DEFAULT_WORKER_NAME; } worker = wc_get_worker_for_name(worker_name, logger); if (worker) { nsapi_private_data_t private_data; jk_ws_service_t s; jk_pool_atom_t buf[SMALL_POOL_SIZE]; jk_open_pool(&private_data.p, buf, sizeof(buf)); private_data.request_started = JK_FALSE; private_data.pb = pb; private_data.sn = sn; private_data.rq = rq; jk_init_ws_service(&s); s.ws_private = &private_data; s.pool = &private_data.p; s.retries = worker->retries; wc_maintain(logger); if (init_ws_service(&private_data, &s)) { jk_endpoint_t *e = NULL; if (worker->get_endpoint(worker, &e, logger)) { int is_error = JK_HTTP_SERVER_ERROR; int result; if ((result = e->service(e, &s, logger, &is_error)) > 0) { rc = REQ_PROCEED; if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "service() returned OK"); } else { protocol_status(sn, rq, is_error, NULL); if ((result == JK_CLIENT_ERROR) && (is_error == JK_HTTP_OK)) { rc = REQ_EXIT; jk_log(logger, JK_LOG_INFO, "service() failed because client aborted connection"); } else { rc = REQ_ABORTED; jk_log(logger, JK_LOG_ERROR, "service() failed with http error %d", is_error); } } e->done(&e, logger); } } jk_close_pool(&private_data.p); } return rc;}static int init_ws_service(nsapi_private_data_t * private_data, jk_ws_service_t *s){ char *tmp; int size; int rc; s->route = NULL; s->start_response = start_response; s->read = ws_read; s->write = ws_write; s->flush = NULL; s->flush_packets = JK_FALSE; s->flush_header = JK_FALSE; s->disable_reuse = JK_FALSE; /* Clear RECO status */ s->reco_status = RECO_NONE; s->auth_type = pblock_findval("auth-type", private_data->rq->vars); s->remote_user = pblock_findval("auth-user", private_data->rq->vars); s->content_length = 0; tmp = NULL; rc = request_header("content-length", &tmp, private_data->sn, private_data->rq); if ((rc != REQ_ABORTED) && tmp) { sscanf(tmp, "%" JK_UINT64_T_FMT, &(s->content_length)); } s->method = pblock_findval("method", private_data->rq->reqpb); s->protocol = pblock_findval("protocol", private_data->rq->reqpb); s->remote_host = session_dns(private_data->sn); s->remote_addr = pblock_findval("ip", private_data->sn->client); tmp = pblock_findval("uri", private_data->rq->reqpb); size = 3 * strlen(tmp) + 1; s->req_uri = jk_pool_alloc(s->pool, size); jk_canonenc(tmp, s->req_uri, size); s->query_string = pblock_findval("query", private_data->rq->reqpb); s->server_name = server_hostname;#ifdef NETWARE /* On NetWare, since we have virtual servers, we have a different way of * getting the port that we need to try first. */ tmp = pblock_findval("server_port", private_data->sn->client); if (NULL != tmp) s->server_port = atoi(tmp); else#endif s->server_port = server_portnum; s->server_software = system_version(); s->headers_names = NULL; s->headers_values = NULL; s->num_headers = 0; s->uw_map = uw_map;#ifdef NETWARE /* on NetWare, we can have virtual servers that are secure. * PR_IsSocketSecure is an api made available with virtual servers to check * if the socket is secure or not */ if (NULL != PR_IsSocketSecure) s->is_ssl = PR_IsSocketSecure(private_data->sn->csd); else#endif s->is_ssl = security_active; s->ssl_key_size = -1; /* required by Servlet 2.3 Api, added in jtc */ if (s->is_ssl) { char *ssl_cert = pblock_findval("auth-cert", private_data->rq->vars); if (ssl_cert != NULL) { s->ssl_cert = jk_pool_alloc(s->pool, sizeof(ssl_cert_start)+ strlen(ssl_cert)+ sizeof(ssl_cert_end)); strcpy(s->ssl_cert, ssl_cert_start); strcat(s->ssl_cert, ssl_cert); strcat(s->ssl_cert, ssl_cert_end); s->ssl_cert_len = strlen(s->ssl_cert); } s->ssl_cipher = pblock_findval("cipher", private_data->sn->client); s->ssl_session = pblock_findval("ssl-id", private_data->sn->client); } else { s->ssl_cert = NULL; s->ssl_cert_len = 0; s->ssl_cipher = NULL; s->ssl_session = NULL; } rc = setup_http_headers(private_data, s); /* Dump all connection param so we can trace what's going to * the remote tomcat */ if (JK_IS_DEBUG_LEVEL(logger)) { jk_log(logger, JK_LOG_DEBUG, "Service protocol=%s method=%s host=%s addr=%s name=%s port=%d auth=%s user=%s uri=%s", STRNULL_FOR_NULL(s->protocol), STRNULL_FOR_NULL(s->method), STRNULL_FOR_NULL(s->remote_host), STRNULL_FOR_NULL(s->remote_addr), STRNULL_FOR_NULL(s->server_name), s->server_port, STRNULL_FOR_NULL(s->auth_type), STRNULL_FOR_NULL(s->remote_user), STRNULL_FOR_NULL(s->req_uri)); } return rc;}static int setup_http_headers(nsapi_private_data_t * private_data, jk_ws_service_t *s){ int need_content_length_header = (s->content_length == 0) ? JK_TRUE : JK_FALSE; pblock *headers_jar = private_data->rq->headers; int cnt; int i; for (i = 0, cnt = 0; i < headers_jar->hsize; i++) { struct pb_entry *h = headers_jar->ht[i]; while (h && h->param) { cnt++; h = h->next; } } s->headers_names = NULL; s->headers_values = NULL; s->num_headers = cnt; if (cnt) { /* allocate an extra header slot in case we need to add a content-length header */ s->headers_names = jk_pool_alloc(&private_data->p, (cnt + 1) * sizeof(char *)); s->headers_values = jk_pool_alloc(&private_data->p, (cnt + 1) * sizeof(char *)); if (s->headers_names && s->headers_values) { for (i = 0, cnt = 0; i < headers_jar->hsize; i++) { struct pb_entry *h = headers_jar->ht[i]; while (h && h->param) { s->headers_names[cnt] = h->param->name; s->headers_values[cnt] = h->param->value; if (need_content_length_header && !strncmp(h->param->name, "content-length", 14)) { need_content_length_header = JK_FALSE; } cnt++; h = h->next; } } /* Add a content-length = 0 header if needed. * Ajp13 assumes an absent content-length header means an unknown, * but non-zero length body. */ if (need_content_length_header) { s->headers_names[cnt] = "content-length"; s->headers_values[cnt] = "0"; cnt++; } s->num_headers = cnt; return JK_TRUE; } } else { if (need_content_length_header) { s->headers_names = jk_pool_alloc(&private_data->p, sizeof(char *)); s->headers_values = jk_pool_alloc(&private_data->p, sizeof(char *)); if (s->headers_names && s->headers_values) { s->headers_names[0] = "content-length"; s->headers_values[0] = "0"; s->num_headers++; return JK_TRUE; } } else return JK_TRUE; } return JK_FALSE;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?