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

📄 jk_uri_worker_map.c

📁 jboss与apache集成的中间件,详情请参看文档说明.
💻 C
📖 第 1 页 / 共 2 页
字号:
    }    worker_qsort(uw_map);    JK_TRACE_EXIT(l);    return JK_TRUE;}int uri_worker_map_open(jk_uri_worker_map_t *uw_map,                        jk_map_t *init_data, jk_logger_t *l){    int rc = JK_TRUE;    JK_TRACE_ENTER(l);    uw_map->size = 0;    uw_map->capacity = 0;    if (uw_map) {        int sz;        rc = JK_TRUE;        jk_open_pool(&uw_map->p,                     uw_map->buf, sizeof(jk_pool_atom_t) * SMALL_POOL_SIZE);        uw_map->size = 0;        uw_map->maps = NULL;        sz = jk_map_size(init_data);        jk_log(l, JK_LOG_DEBUG,               "rule map size is %d",               sz);        if (sz > 0) {            int i;            for (i = 0; i < sz; i++) {                if (uri_worker_map_add                    (uw_map, jk_map_name_at(init_data, i),                     jk_map_value_at(init_data, i), l) == JK_FALSE) {                    rc = JK_FALSE;                    break;                }            }            if (i == sz) {                if (JK_IS_DEBUG_LEVEL(l))                    jk_log(l, JK_LOG_DEBUG,                           "there are %d rules",                           uw_map->size);            }            else {                jk_log(l, JK_LOG_ERROR,                       "Parsing error");                rc = JK_FALSE;            }        }        if (rc == JK_FALSE) {            jk_log(l, JK_LOG_ERROR,                   "there was an error, freing buf");            jk_close_pool(&uw_map->p);        }    }    JK_TRACE_EXIT(l);    return rc;}static int is_nomap_match(jk_uri_worker_map_t *uw_map,                          const char *uri, const char* worker,                          jk_logger_t *l){    unsigned int i;    JK_TRACE_ENTER(l);    for (i = 0; i < uw_map->size; i++) {        uri_worker_record_t *uwr = uw_map->maps[i];        /* Check only nomatch mappings */        if (!(uwr->match_type & MATCH_TYPE_NO_MATCH) ||            (uwr->match_type & MATCH_TYPE_DISABLED))            continue;        /* Check only mathing workers */        if (strcmp(uwr->worker_name, worker))            continue;        if (uwr->match_type & MATCH_TYPE_WILDCHAR_PATH) {            /* Map is already sorted by context_len */            if (wildchar_match(uri, uwr->context,#ifdef WIN32                               1#else                               0#endif                               ) == 0) {                    jk_log(l, JK_LOG_DEBUG,                           "Found a no match %s -> %s",                           uwr->worker_name, uwr->context);                    JK_TRACE_EXIT(l);                    return JK_TRUE;             }        }        else if (JK_STRNCMP(uwr->context, uri, uwr->context_len) == 0) {            if (strlen(uri) == uwr->context_len) {                if (JK_IS_DEBUG_LEVEL(l))                    jk_log(l, JK_LOG_DEBUG,                            "Found an exact no match %s -> %s",                            uwr->worker_name, uwr->context);                JK_TRACE_EXIT(l);                return JK_TRUE;            }        }    }    JK_TRACE_EXIT(l);    return JK_FALSE;}const char *map_uri_to_worker(jk_uri_worker_map_t *uw_map,                              const char *uri, jk_logger_t *l){    unsigned int i;    char *url_rewrite;    const char *rv = NULL;    const char *url = uri;    char  buf[JK_MAX_URI_LEN+1];    JK_TRACE_ENTER(l);    if (!uw_map || !uri) {        JK_LOG_NULL_PARAMS(l);        JK_TRACE_EXIT(l);        return NULL;    }    if (*uri != '/') {        jk_log(l, JK_LOG_WARNING,                "Uri %s is invalid. Uri must start with /", uri);        JK_TRACE_EXIT(l);        return NULL;    }    url_rewrite = strstr(uri, JK_PATH_SESSION_IDENTIFIER);    if (url_rewrite) {        size_t len = url_rewrite - uri;        if (len > JK_MAX_URI_LEN)            len = JK_MAX_URI_LEN;        strncpy(buf, uri, len);        buf[len] = '\0';        url = &buf[0];        if (JK_IS_DEBUG_LEVEL(l))            jk_log(l, JK_LOG_DEBUG, "Removing Session path '%s' URI '%s'",                   url_rewrite, url);    }    if (uw_map->fname)        uri_worker_map_update(uw_map, l);    if (JK_IS_DEBUG_LEVEL(l))        jk_log(l, JK_LOG_DEBUG, "Attempting to map URI '%s' from %d maps",               uri, uw_map->size);    for (i = 0; i < uw_map->size; i++) {        uri_worker_record_t *uwr = uw_map->maps[i];        /* Check for match types */        if ((uwr->match_type & MATCH_TYPE_DISABLED) ||            (uwr->match_type & MATCH_TYPE_NO_MATCH))            continue;        if (JK_IS_DEBUG_LEVEL(l))            jk_log(l, JK_LOG_DEBUG, "Attempting to map context URI '%s'", uwr->uri);        if (uwr->match_type & MATCH_TYPE_WILDCHAR_PATH) {            const char *wname;            /* Map is already sorted by context_len */            if (wildchar_match(url, uwr->context,#ifdef WIN32                               1#else                               0#endif                               ) == 0) {                    wname = uwr->worker_name;                    if (JK_IS_DEBUG_LEVEL(l))                        jk_log(l, JK_LOG_DEBUG,                               "Found a wildchar match %s -> %s",                               uwr->worker_name, uwr->context);                    JK_TRACE_EXIT(l);                    rv = wname;                    goto cleanup;             }        }        else if (JK_STRNCMP(uwr->context, url, uwr->context_len) == 0) {            if (strlen(url) == uwr->context_len) {                if (JK_IS_DEBUG_LEVEL(l))                    jk_log(l, JK_LOG_DEBUG,                           "Found an exact match %s -> %s",                           uwr->worker_name, uwr->context);                JK_TRACE_EXIT(l);                rv = uwr->worker_name;                goto cleanup;            }        }    }    /* No matches found */    JK_TRACE_EXIT(l);cleanup:    if (rv && uw_map->nosize) {        if (is_nomap_match(uw_map, url, rv, l)) {            if (JK_IS_DEBUG_LEVEL(l))                jk_log(l, JK_LOG_DEBUG,                       "Denying matching for worker %s by nomatch rule",                       rv);            rv = NULL;        }    }    return rv;}int uri_worker_map_load(jk_uri_worker_map_t *uw_map,                        jk_logger_t *l){    int rc = JK_FALSE;    jk_map_t *map;    jk_map_alloc(&map);    if (jk_map_read_properties(map, uw_map->fname,                               &uw_map->modified)) {        int i;        for (i = 0; i < jk_map_size(map); i++) {            const char *u = jk_map_name_at(map, i);            const char *w = jk_map_value_at(map, i);            /* Multiple mappings like :             * /servlets-examples|/ *             * will create two mappings:             * /servlets-examples             * and:             * /servlets-examples/ *             */            if (strchr(u, '|')) {                char *s, *r = strdup(u);                s = strchr(r, '|');                *(s++) = '\0';                /* Add first mapping */                if (!uri_worker_map_add(uw_map, r, w, l)) {                    jk_log(l, JK_LOG_ERROR,                    "invalid mapping rule %s->%s", r, w);                }                for (; *s; s++)                   *(s - 1) = *s;                *(s - 1) = '\0';                /* add second mapping */                if (!uri_worker_map_add(uw_map, r, w, l)) {                    jk_log(l, JK_LOG_ERROR,                    "invalid mapping rule %s->%s", r, w);                }                free(r);            }            else if (!uri_worker_map_add(uw_map, u, w, l)) {                jk_log(l, JK_LOG_ERROR,                       "invalid mapping rule %s->%s",                       u, w);            }        }        uw_map->checked = time(NULL);        rc = JK_TRUE;    }    jk_map_free(&map);    return rc;}int uri_worker_map_update(jk_uri_worker_map_t *uw_map,                          jk_logger_t *l){    int rc = JK_TRUE;    time_t now = time(NULL);    if ((now - uw_map->checked) > JK_URIMAP_RELOAD) {        struct stat statbuf;        uw_map->checked = now;        if ((rc = stat(uw_map->fname, &statbuf)) == -1)            return JK_FALSE;        if (statbuf.st_mtime == uw_map->modified)            return JK_TRUE;        JK_ENTER_CS(&(uw_map->cs), rc);        /* Check if some other thread updated status */        if (statbuf.st_mtime == uw_map->modified) {            JK_LEAVE_CS(&(uw_map->cs), rc);            return JK_TRUE;        }        rc = uri_worker_map_load(uw_map, l);        JK_LEAVE_CS(&(uw_map->cs), rc);        jk_log(l, JK_LOG_INFO,               "Reloaded urimaps from %s", uw_map->fname);    }    return rc;}

⌨️ 快捷键说明

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