jk_ajp_common.c

来自「Tomcat 4.1与WebServer集成组件的源代码包.」· C语言 代码 · 共 1,483 行 · 第 1/4 页

C
1,483
字号
    ajp_operation_t *op = &oper;    jk_log(l, JK_LOG_DEBUG, "Into jk_endpoint_t::service\n");    if(e && e->endpoint_private && s && is_recoverable_error) {        ajp_endpoint_t *p = e->endpoint_private;            op->request = jk_b_new(&(p->pool));        jk_b_set_buffer_size(op->request, DEF_BUFFER_SZ);         jk_b_reset(op->request);               op->reply = jk_b_new(&(p->pool));        jk_b_set_buffer_size(op->reply, DEF_BUFFER_SZ);        jk_b_reset(op->reply);                 op->post = jk_b_new(&(p->pool));        jk_b_set_buffer_size(op->post, DEF_BUFFER_SZ);        jk_b_reset(op->post);                 op->recoverable = JK_TRUE;        op->uploadfd     = -1;      /* not yet used, later ;) */        p->left_bytes_to_send = s->content_length;        p->reuse = JK_FALSE;        *is_recoverable_error = JK_TRUE;                s->secret = p->worker->secret;        /*          * We get here initial request (in reqmsg)         */        if (!ajp_marshal_into_msgb(op->request, s, l, p)) {            *is_recoverable_error = JK_FALSE;                            return JK_FALSE;        }        /*          * JK_RETRIES could be replaced by the number of workers in         * a load-balancing configuration          */        for (i = 0; i < JK_RETRIES; i++)        {            /*             * We're using reqmsg which hold initial request             * if Tomcat is stopped or restarted, we will pass reqmsg             * to next valid tomcat.              */            if (ajp_send_request(e, s, l, p, op)) {                /* If we have the no recoverable error, it's probably because the sender (browser)                 * stop sending data before the end (certainly in a big post)                 */                if (! op->recoverable) {                    *is_recoverable_error = JK_FALSE;                    jk_log(l, JK_LOG_ERROR, "ERROR: sending request to tomcat failed without recovery in send loop %d\n", i);                    return JK_FALSE;                }                /* Up to there we can recover */                *is_recoverable_error = JK_TRUE;                op->recoverable = JK_TRUE;                if (ajp_get_reply(e, s, l, p, op))                    return (JK_TRUE);                /* if we can't get reply, check if no recover flag was set                  * if is_recoverable_error is cleared, we have started received                  * upload data and we must consider that operation is no more recoverable                 */                if (! op->recoverable) {                    *is_recoverable_error = JK_FALSE;                    jk_log(l, JK_LOG_ERROR, "ERROR: receiving reply from tomcat failed without recovery in send loop %d\n", i);                    return JK_FALSE;                }                                jk_log(l, JK_LOG_ERROR, "ERROR: Receiving from tomcat failed, recoverable operation. err=%d\n", i);            }            else                jk_log(l, JK_LOG_INFO, "sending request to tomcat failed in send loop. err=%d\n", i);                    jk_close_socket(p->sd);            p->sd = -1;            ajp_reuse_connection(p, l);        }                /* Log the error only once per failed request. */        jk_log(l, JK_LOG_ERROR, "Error connecting to tomcat. Tomcat is probably not started or is listenning on the wrong port. Failed errno = %d\n", errno);    } else {            jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::service, NULL parameters\n");    }    return JK_FALSE;}/* * Validate the worker (ajp13/ajp14) */int ajp_validate(jk_worker_t *pThis,                 jk_map_t    *props,                 jk_worker_env_t *we,                 jk_logger_t *l,                 int          proto){    int    port;    char * host;    jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::validate\n");    if (proto == AJP13_PROTO) {        port = AJP13_DEF_PORT;        host = AJP13_DEF_HOST;    }    else if (proto == AJP14_PROTO) {        port = AJP14_DEF_PORT;        host = AJP14_DEF_HOST;    }    else {        jk_log(l, JK_LOG_DEBUG, "In jk_worker_t::validate unknown protocol %d\n", proto);        return JK_FALSE;    }     if (pThis && pThis->worker_private) {        ajp_worker_t *p = pThis->worker_private;        port = jk_get_worker_port(props, p->name, port);        host = jk_get_worker_host(props, p->name, host);        jk_log(l, JK_LOG_DEBUG, "In jk_worker_t::validate for worker %s contact is %s:%d\n", p->name, host, port);        if(port > 1024 && host) {            if(jk_resolve(host, (short)port, &p->worker_inet_addr)) {                return JK_TRUE;            }            jk_log(l, JK_LOG_ERROR, "ERROR: can't resolve tomcat address %s\n", host);        }        jk_log(l, JK_LOG_ERROR, "ERROR: invalid host and port %s %d\n", (( host==NULL ) ? "NULL" : host ), port);    } else {        jk_log(l, JK_LOG_ERROR, "In jk_worker_t::validate, NULL parameters\n");    }    return JK_FALSE;}int ajp_init(jk_worker_t *pThis,             jk_map_t    *props,             jk_worker_env_t *we,             jk_logger_t *l,             int          proto){    int cache;        /*     * start the connection cache     */    jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::init\n");    if (proto == AJP13_PROTO) {        cache = AJP13_DEF_CACHE_SZ;    }    else if (proto == AJP14_PROTO) {        cache = AJP13_DEF_CACHE_SZ;    }    else {        jk_log(l, JK_LOG_DEBUG, "In jk_worker_t::init, unknown protocol %d\n", proto);        return JK_FALSE;    }    if (pThis && pThis->worker_private) {        ajp_worker_t *p = pThis->worker_private;        int cache_sz = jk_get_worker_cache_size(props, p->name, cache);        int socket_timeout = jk_get_worker_socket_timeout(props, p->name, AJP13_DEF_TIMEOUT);        int socket_keepalive = jk_get_worker_socket_keepalive(props, p->name, JK_FALSE);        int cache_timeout = jk_get_worker_cache_timeout(props, p->name, AJP_DEF_CACHE_TIMEOUT);        jk_log(l, JK_LOG_DEBUG, "In jk_worker_t::init, setting socket timeout to %d\n", socket_timeout);        p->socket_timeout = socket_timeout;        p->keepalive = socket_keepalive;        p->cache_timeout = cache_timeout;        /*          *  Need to initialize secret here since we could return from inside         *  of the following loop         */                   p->secret = jk_get_worker_secret(props, p->name );        p->ep_cache_sz = 0;        p->ep_mincache_sz = 0;        if (cache_sz > 0) {            p->ep_cache = (ajp_endpoint_t **)malloc(sizeof(ajp_endpoint_t *) * cache_sz);            if(p->ep_cache) {                int i;                p->ep_cache_sz = cache_sz;                for(i = 0 ; i < cache_sz ; i++) {                    p->ep_cache[i] = NULL;                }                JK_INIT_CS(&(p->cs), i);                if (i) {                    return JK_TRUE;                }            }        }    } else {        jk_log(l, JK_LOG_ERROR, "In jk_worker_t::init, NULL parameters\n");    }    return JK_FALSE;}int ajp_destroy(jk_worker_t **pThis,                jk_logger_t *l,                int          proto){    jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::destroy\n");    if (pThis && *pThis && (*pThis)->worker_private) {        ajp_worker_t *aw = (*pThis)->worker_private;        free(aw->name);        jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::destroy up to %d endpoint to close\n", aw->ep_cache_sz);        if(aw->ep_cache_sz) {            unsigned i;            for(i = 0 ; i < aw->ep_cache_sz ; i++) {                if(aw->ep_cache[i]) {                    ajp_close_endpoint(aw->ep_cache[i], l);                }            }            free(aw->ep_cache);            JK_DELETE_CS(&(aw->cs), i);        }        if (aw->login) {            free(aw->login);            aw->login = NULL;        }        free(aw);        return JK_TRUE;    }    jk_log(l, JK_LOG_ERROR, "In jk_worker_t::destroy, NULL parameters\n");    return JK_FALSE;}int JK_METHOD ajp_done(jk_endpoint_t **e,                       jk_logger_t    *l){    if (e && *e && (*e)->endpoint_private) {        ajp_endpoint_t *p = (*e)->endpoint_private;        int reuse_ep = p->reuse;        ajp_reset_endpoint(p);        if(reuse_ep) {            ajp_worker_t *w = p->worker;            if(w->ep_cache_sz) {                int rc;                JK_ENTER_CS(&w->cs, rc);                if(rc) {                    unsigned i;                    for(i = 0 ; i < w->ep_cache_sz ; i++) {                        if(!w->ep_cache[i]) {                            w->ep_cache[i] = p;                            break;                        }                    }                    JK_LEAVE_CS(&w->cs, rc);                    if(i < w->ep_cache_sz) {                        jk_log(l, JK_LOG_DEBUG, "Into jk_endpoint_t::done, recycling connection\n");                        return JK_TRUE;                    }                }            }        }        jk_log(l, JK_LOG_DEBUG, "Into jk_endpoint_t::done, closing connection %d\n", reuse_ep);        ajp_close_endpoint(p, l);        *e = NULL;        return JK_TRUE;    }    jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::done, NULL parameters\n");    return JK_FALSE;}int ajp_get_endpoint(jk_worker_t    *pThis,                     jk_endpoint_t **je,                     jk_logger_t    *l,                     int             proto){    jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::get_endpoint\n");    if (pThis && pThis->worker_private && je) {        ajp_worker_t   *aw = pThis->worker_private;        ajp_endpoint_t *ae = NULL;        if (aw->ep_cache_sz) {            int rc;            JK_ENTER_CS(&aw->cs, rc);            if (rc) {                unsigned i;                time_t now;                if (aw->socket_timeout > 0 || aw->cache_timeout) {                    now = time(NULL);                }                for (i = 0 ; i < aw->ep_cache_sz ; i++) {                    if (aw->ep_cache[i]) {                        ae = aw->ep_cache[i];                        aw->ep_cache[i] = NULL;                        break;                    }                }                /* Handle enpoint cache timeouts */                if (aw->cache_timeout) {                    for ( ; i < aw->ep_cache_sz ; i++) {                        if (aw->ep_cache[i]) {                            unsigned elapsed = (unsigned)(now - ae->last_access);                            if (elapsed > aw->cache_timeout) {                                jk_log(l, JK_LOG_DEBUG,                                     "In jk_endpoint_t::ajp_get_endpoint," \                                    " cleaning cache slot = %d elapsed %d\n",                                     i, elapsed);                                ajp_close_endpoint(aw->ep_cache[i], l);                                aw->ep_cache[i] = NULL;                            }                        }                    }                }                JK_LEAVE_CS(&aw->cs, rc);                if (ae) {                    if (ae->sd > 0) {                        /* Handle timeouts for open sockets */                        unsigned elapsed = (unsigned)(now - ae->last_access);                        ae->last_access = now;                        jk_log(l, JK_LOG_DEBUG, "In jk_endpoint_t::ajp_get_endpoint, time elapsed since last request = %d seconds\n", elapsed);                        if (aw->socket_timeout > 0 && elapsed > aw->socket_timeout) {                            jk_close_socket(ae->sd);                            jk_log(l, JK_LOG_DEBUG,                                    "In jk_endpoint_t::ajp_get_endpoint, reached socket timeout, closed sd = %d\n", ae->sd);                            ae->sd = -1; /* just to avoid twice close */                        }                    }                    *je = &ae->endpoint;                    return JK_TRUE;                }            }        }        ae = (ajp_endpoint_t *)malloc(sizeof(ajp_endpoint_t));        if (ae) {            ae->sd = -1;            ae->reuse = JK_FALSE;            ae->last_access = time(NULL);            jk_open_pool(&ae->pool, ae->buf, sizeof(ae->buf));            ae->worker = pThis->worker_private;            ae->endpoint.endpoint_private = ae;            ae->proto = proto;            ae->endpoint.service = ajp_service;            ae->endpoint.done = ajp_done;            *je = &ae->endpoint;            return JK_TRUE;        }        jk_log(l, JK_LOG_ERROR, "In jk_worker_t::get_endpoint, malloc failed\n");    } else {        jk_log(l, JK_LOG_ERROR, "In jk_worker_t::get_endpoint, NULL parameters\n");    }    return JK_FALSE;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?