⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jk_nsapi_plugin.c

📁 Tomcat 4.1与WebServer集成组件的源代码包.
💻 C
📖 第 1 页 / 共 2 页
字号:
    if(!worker_prp_file) {        worker_prp_file = JK_WORKER_FILE_DEF;    }    if(!log_level_str) {        log_level_str = JK_LOG_LEVEL_DEF;    }            if(!jk_open_file_logger(&logger, log_file,                             jk_parse_log_level(log_level_str))) {        logger = NULL;    }    if(map_alloc(&init_map)) {        if(map_read_properties(init_map, worker_prp_file)) {            int sleep_cnt;            SYS_THREAD s;                        s = systhread_start(SYSTHREAD_DEFAULT_PRIORITY,                                 0,                                 init_workers_on_other_threads,                                 init_map);            for(sleep_cnt = 0 ; sleep_cnt < 60 ; sleep_cnt++) {                systhread_sleep(1000);                jk_log(logger, JK_LOG_DEBUG, "jk_init, a second passed\n");                if(init_on_other_thread_is_done) {                    break;                }            }            if(init_on_other_thread_is_done &&               init_on_other_thread_is_ok) {                magnus_atrestart(jk_term, NULL);                rc = REQ_PROCEED;            }/*            if(wc_open(init_map, NULL, logger)) {                magnus_atrestart(jk_term, NULL);                rc = REQ_PROCEED;            }*/        }                map_free(&init_map);    }#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    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;        if(init_ws_service(&private_data, &s)) {            jk_endpoint_t *e = NULL;            if(worker->get_endpoint(worker, &e, logger)) {                                int recover = JK_FALSE;                if(e->service(e, &s, logger, &recover)) {                    rc = REQ_PROCEED;                }                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 rc;    s->jvm_route = NULL;    s->start_response = start_response;    s->read = ws_read;    s->write = ws_write;        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) {        s->content_length = atoi(tmp);    }        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);        s->req_uri          = pblock_findval("uri", private_data->rq->reqpb);    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;    #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) {        s->ssl_cert     = pblock_findval("auth-cert", private_data->rq->vars);        if(s->ssl_cert) {            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;    }    return setup_http_headers(private_data, s);}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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -