Commit 48d7cdf5 authored by Jim Jagielski's avatar Jim Jagielski
Browse files

Add regex pattern matching to ProxyPass, allowing,

for example:

   ProxyPass ~ \.gif balancer://imagecluster




git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@537429 13f79535-47bb-0310-9956-ffa450edef68
parent 5254baf8
Loading
Loading
Loading
Loading
+43 −11
Original line number Diff line number Diff line
@@ -488,6 +488,8 @@ static int proxy_trans(request_rec *r)
                                                 &proxy_module);
    const char *fake;
    const char *real;
    ap_regmatch_t regm[AP_MAX_REG_MATCH];
    char *found = NULL;

    if (r->proxyreq) {
        /* someone has already set up the proxy, it was possibly ourselves
@@ -510,15 +512,30 @@ static int proxy_trans(request_rec *r)
            fake = ent[i].fake;
            real = ent[i].real;
        }
        if (ent[i].regex) {
            if (!ap_regexec(ent[i].regex, r->uri, AP_MAX_REG_MATCH, regm, 0)) {
                if ((real[0] == '!') && (real[1] == '\0')) {
                    return DECLINED;
                }
                found = apr_pstrcat(r->pool, "proxy:", real,
                                    r->uri, NULL);
            }
        }
        else {
            len = alias_match(r->uri, fake);

       if (len > 0) {
           if ((real[0] == '!') && (real[1] == 0)) {
            if (len != 0) {
                if ((real[0] == '!') && (real[1] == '\0')) {
                    return DECLINED;
                }

           r->filename = apr_pstrcat(r->pool, "proxy:", real,
                found = apr_pstrcat(r->pool, "proxy:", real,
                                     r->uri + len, NULL);

            }
        }
        if (found) {
                r->filename = found;
                r->handler = "proxy-server";
                r->proxyreq = PROXYREQ_REVERSE;
                return OK;
@@ -1125,11 +1142,17 @@ static const char *
    const apr_array_header_t *arr;
    const apr_table_entry_t *elts;
    int i;
    int use_regex = 0;

    while (*arg) {
        word = ap_getword_conf(cmd->pool, &arg);
        if (!f)
        if (!f) {
            if (!strcmp(word, "~")) {
                use_regex = 1;
                continue;
            }
            f = word;
        }
        else if (!r)
            r = word;
        else {
@@ -1162,6 +1185,15 @@ static const char *
    new = apr_array_push(conf->aliases);
    new->fake = apr_pstrdup(cmd->pool, f);
    new->real = apr_pstrdup(cmd->pool, r);
    if (use_regex) {
        new->regex = ap_pregcomp(cmd->pool, f, AP_REG_EXTENDED);
        if (new->regex == NULL)
            return "Regular expression could not be compiled.";
    }
    else {
        new->regex = NULL;
    }

    if (r[0] == '!' && r[1] == '\0')
        return NULL;

+1 −0
Original line number Diff line number Diff line
@@ -109,6 +109,7 @@ struct proxy_remote {
struct proxy_alias {
    const char  *real;
    const char  *fake;
    ap_regex_t  *regex;
};

struct dirconn_entry {