博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ngx_http_arg()函数详解
阅读量:6292 次
发布时间:2019-06-22

本文共 3094 字,大约阅读时间需要 10 分钟。

hot3.png

ngx_http_arg()可以解析url中的参数(key=value),

/*把请求中GET /download/nginx-1.9.2.rar?st=xhWL03HbtjrojpEAfiD6Mw&e=1452139931 HTTP/1.1的st和e形成变量$arg_st $arg_e,value分别

为xhWL03HbtjrojpEAfiD6Mw 1452139931即$arg_st=xhWL03HbtjrojpEAfiD6Mw,$arg_e=1452139931 */

ngx_int_t
ngx_http_arg(ngx_http_request_t *r, u_char *name, size_t len, ngx_str_t *value)
{
    u_char  *p, *last;

    if (r->args.len == 0) {           //args指向用户请求中的URL参数。没有参数,则返回

        return NGX_DECLINED;
    }

    p = r->args.data;             //p指向参数的第一位置

    last = p + r->args.len;    //last指向参数的最末位置

    for ( /* void */ ; p < last; p++) {       //循环遍历

        /* we need '=' after name, so drop one char from last */

        p = ngx_strlcasestrn(p, last - 1, name, len - 1);//第一,第二个参数是起始指针,第三个参数是要找的字串指针,第四个参数长度,len减一原因可以去看实现

        if (p == NULL) { //如果不存在字串情况

            return NGX_DECLINED;
        }

        if ((p == r->args.data || *(p - 1) == '&') && *(p + len) == '=') {

            value->data = p + len + 1; //value的data ,1是等号的存在

            p = ngx_strlchr(p, last, '&');//&符号出现的位置

            if (p == NULL) {

                p = r->args.data + r->args.len;
            }

            value->len = p - value->data;//value的长度

            return NGX_OK;

        }
    }

    return NGX_DECLINED;

}

--------------------------------------------------------------------------------------------------------------------------

/*

 * ngx_strlcasestrn() is intended to search for static substring
 * with known length in string until the argument last. The argument n
 * must be length of the second substring - 1.
 */

/*ngx_strlcasestrn()目的在于寻找已知长度的固定子串,指导参数last,参数n的长度必须是第二个字串减一

u_char *

ngx_strlcasestrn(u_char *s1, u_char *last, u_char *s2, size_t n)
{
    ngx_uint_t  c1, c2;

    c2 = (ngx_uint_t) *s2++;

    c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;
    last -= n;

    do {

        do {
            if (s1 >= last) {
                return NULL;
            }

            c1 = (ngx_uint_t) *s1++;

            c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;

        } while (c1 != c2);

    } while (ngx_strncasecmp(s1, s2, n) != 0);

    return --s1;

}

------------------------------------------------------------------------------------------------------------------------------------

//查找字符串s中首次出现字符c的位置

#define ngx_strchr(s1, c)   strchr((const char *) s1, (int) c)

static ngx_inline u_char *

ngx_strlchr(u_char *p, u_char *last, u_char c)
{
    while (p < last) {

        if (*p == c) {

            return p;
        }

        p++;

    }

    return NULL;

}

最后,举个离子

比如请求为https://1.1.1.1/url?username=abc&password=123456

解析的时候可以

ngx_str_t arg_username = ngx_string("username");

ngx_str_t username = ngx_null_string;

ngx_str_t arg_password = ngx_string("password");

ngx_str_t password = ngx_null_string;

/*username*/

if(NGX_OK !  = ngx_http_arg(r,arg_username.data,arg_username.len,&username) ){

    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,

                                "get arg \"%V\" failed.", &arg_username);

        return NGX_ERROR;

}

/*password*/

if(NGX_OK != ngx_http_arg(r,arg_password.data,arg_password.len,&password)) {

    ngx_log_error(NGX_LOG_ERR,r->connection->log,0,

                                "get arg \"%V\" failed.",& arg_password);

        return NGX_ERROR;

}

--------------------------------

 

也可以直接写

ngx_str_t * username;

ngx_str_t * password;

/*username*/

if(NGX_OK == ngx_http_arg(r,(u_char*)“username",8,username) ){

   。。。。。

}

/*password*/

if(NGX_OK ==  ngx_http_arg(r,(u_char*)"password",8,password)) {

   。。。。。

}

 

 

 

 

转载于:https://my.oschina.net/floristgao/blog/749845

你可能感兴趣的文章
作业调度框架 Quartz.NET 2.0 beta 发布
查看>>
mysql性能的检查和调优方法
查看>>
项目管理中的导向性
查看>>
Android WebView 学习
查看>>
(转)从给定的文本中,查找其中最长的重复子字符串的问题
查看>>
HDU 2159
查看>>
spring batch中用到的表
查看>>
资源文件夹res/raw和assets的使用
查看>>
UINode扩展
查看>>
LINUX常用命令
查看>>
百度云盘demo
查看>>
概率论与数理统计习题
查看>>
初学structs2,简单配置
查看>>
Laravel5.0学习--01 入门
查看>>
时间戳解读
查看>>
sbin/hadoop-daemon.sh: line 165: /tmp/hadoop-hxsyl-journalnode.pid: Permission denied
查看>>
@RequestMapping 用法详解之地址映射
查看>>
254页PPT!这是一份写给NLP研究者的编程指南
查看>>
《Data Warehouse in Action》
查看>>
String 源码浅析(一)
查看>>