zoukankan      html  css  js  c++  java
  • Nginx 函数解析之ngx_http_get_forwarded_addr_internal

    static ngx_int_t
    ngx_http_get_forwarded_addr_internal(ngx_http_request_t *r, ngx_addr_t *addr,
        u_char *xff, size_t xfflen, ngx_array_t *proxies, int recursive)
    {
        u_char      *p;
        ngx_int_t    rc;
        ngx_addr_t   paddr;
    
        //传入addr与过滤列表对比,如果列表中存在匹配,返回NGX_OK,不匹配返回NGX_DECLINED
        if (ngx_cidr_match(addr->sockaddr, proxies) != NGX_OK) {
            return NGX_DECLINED;
        }
    
        //从指定长度的xff的最右边开始往左查找,截取最后的ip
        for (p = xff + xfflen - 1; p > xff; p--, xfflen--) {
            if (*p != ' ' && *p != ',') {
                break;
            }
        }
    
        //去除截取到的ip左边的分割符号
        for ( /* void */ ; p > xff; p--) {
            if (*p == ' ' || *p == ',') {
                p++;
                break;
            }
        }
    
        //ip字符串解析ip和端口,存放到paddr
        if (ngx_parse_addr_port(r->pool, &paddr, p, xfflen - (p - xff)) != NGX_OK) {
            return NGX_DECLINED;
        }
    
        //覆盖先前的addr
        *addr = paddr;
    
        //是否递归且未解析完,递归处理
        if (recursive && p > xff) {
            rc = ngx_http_get_forwarded_addr_internal(r, addr, xff, p - 1 - xff,
                                                      proxies, 1);
    
            if (rc == NGX_DECLINED) {
                return NGX_DONE;
            }
    
            /* rc == NGX_OK || rc == NGX_DONE  */
            return rc;
        }
    
        return NGX_OK;
    }
    

      

  • 相关阅读:
    123
    p1216
    离线可持久化动态树
    线段树合并
    p2024
    树的dfs序,p1539,p1651,,2018/11/08模拟赛T3
    p1460
    CDQ分治,二维数点与三维数点,p1357与p2026与p2027与p2028与p2029
    自动AC机
    平衡二叉树之splay p1998
  • 原文地址:https://www.cnblogs.com/yufengs/p/7094452.html
Copyright © 2011-2022 走看看