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 + -
显示快捷键?