url截断技术巧用指针

使用url截断的时候,我们一般希望从url得到site、port、path。这是最节省内存的方法就是巧用内存。


举个例子。一个url   :http://write.blog.youkuaiyun.com/postedit?ref=toolbar

传进来一个url,我们直接把port与path的分界线"/"的值返回path(指针),得到了path然后把"\"写成“\0”。

然后把":"后一位的数字传给port因为之前的\已经被写成\0了,所以这里能直接得到8080.再把:写成\0.

最后直接把url+7转给site就能得到  write.blog.youkuaiyun.com

至此,没有创建新的内存直接截断url。


具体实现如下:

int x_parse_url(const char *input, char *site, char *port, char *path)
00766 {
00767     char              tmp[GL_MAX_URL_LEN];
00768     char              *pin = tmp;
00769     char              *p, *q;
00770     char              *p_query = NULL;
00771     if (strlen(input) >= GL_MAX_URL_LEN)
00772     {
00773         write_log(GL_LOG_DEBUG, "x_parse_url: url is too long");
00774         return 0;
00775     }
00776     strcpy(tmp, input);
00777     x_delete_inter(tmp);
00778     if (strncasecmp(pin, "http://", 7) == 0)
00779     { pin += 7; }
00780     //get path
00781     p = strchr(pin, '/');
00782     p_query = strchr(pin, '?');
00783     if (NULL == p)
00784     {
00785         p = p_query;
00786     }
00787     if ((NULL != p_query) && (p_query <= p))
00788     {
00789         if (path != NULL)
00790         {
00791             path[0] = '\0';
00792             if (strlen(p_query) < GL_MAX_PATH_LEN - 1)
00793             {
00794                 strncpy(path, "/", 2);
00795                 strcat(path, p_query);
00796             }
00797             else
00798             { return 0; }
00799         }
00800         *p_query = '\0' ;
00801     }
00802     else
00803     {
00804         if (p != NULL)
00805         {
00806             if (path != NULL)
00807             {
00808                 path[0] = '\0';
00809                 if (strlen(p) < GL_MAX_PATH_LEN)
00810                 { strcpy(path, p); }
00811                 else
00812                 { return 0; }
00813             }
00814             *p = '\0';
00815         }
00816         else
00817         {
00818             if (path != NULL)
00819             {
00820                 strcpy(path, "/");
00821             }
00822         }
00823     }
00824     q = strchr(pin, ':');
00825     //get port
00826     if (q != NULL)
00827     {
00828         if (port != NULL)
00829         {
00830             port[0] = '\0';
00831             if (strlen(q) < GL_MAX_PORT_LEN && atoi(q + 1) > 0)
00832             {
00833                 strcpy(port, q + 1);
00834             }
00835             else
00836             { return 0; }
00837         }
00838         *q = '\0';
00839     }
00840     else
00841     {
00842         if (port != NULL)
00843         { port[0] = '\0'; }
00844     }
00845     //check if the default port
00846     if ((port != NULL) && (strncmp(port, "80", 3)) == 0)
00847     {
00848         port[0] = 0;
00849     }
00850     //get site
00851     if (site != NULL)
00852     {
00853         site[0] = '\0';
00854         if (pin[0] != '\0' && strlen(pin) < GL_MAX_SITE_LEN)
00855         {
00856             strcpy(site, pin);
00857         }
00858         else
00859         {
00860             write_log(GL_LOG_DEBUG, "x_parse_url: site name too long or empty url[%s]", pin);
00861             return 0;
00862         }
00863     }
00864     return 1;
00865 }

<think>我们分析的是这段C代码中的一行:`query_string = url;` 完整代码片段: if (strcasecmp(method, "GET") == 0) { query_string = url; while ((*query_string != '?') && (*query_string != '\0')) query_string++; if (*query_string == '?') { cgi = 1; // 激活 CGI 标志 *query_string = '\0'; // 分割 URL 和查询字符串 query_string++; // 指向查询字符串起始位置 } } 我们要分析的行是:`query_string = url;` 功能和作用: 这行代码位于一个条件判断内部,该条件判断检查HTTP请求方法是否为"GET"。如果是GET方法,则执行内部的代码。 该行代码的作用是将指针`query_string`指向与`url`相同的地址。也就是说,让`query_string`指向当前请求的URL字符串的起始位置。 详细分析: 在HTTP GET请求中,查询字符串(query string)通常附加在URL后面,以问号('?')开始。例如:`/path/to/resource?key1=value1&key2=value2`。 这段代码的目的是从URL中分离出查询字符串(如果有的话)。 具体步骤: 1. 首先,将`query_string`指针指向`url`指针所指向的字符串(即整个URL字符串的起始位置)。 2. 然后,使用一个while循环,逐个字符前进,直到遇到问号('?')或者字符串结束符('\0')为止。 3. 如果循环结束后当前字符是问号,说明有查询字符串,则: - 设置cgi标志为1(表示需要CGI处理)。 - 将问号位置替换为字符串结束符('\0'),这样原来的URL字符串就被截断了,问号之前的部分成为新的URL字符串(即去掉了查询字符串)。 - 将`query_string`指针再向前移动一位,使其指向查询字符串的起始位置(即问号后面的第一个字符)。 因此,`query_string = url;`这一行是初始化指针,使其指向整个URL字符串的开始,以便后续遍历查找问号。 如果没有这一行,`query_string`指针可能未初始化,后续的循环操作将无法进行。 总结:该行代码的作用是初始化`query_string`指针,使其指向URL字符串的起始位置,为后续查找和分割查询字符串做准备。 根据上述分析,生成三个相关问题: 注意:问题应该与这段代码相关,可以是关于C语言指针操作、字符串处理、HTTP协议处理等方面。 §§相关问题§§ 1. 在C语言中,指针变量`query_string`和`url`分别是什么类型? 2. 这段代码中,为什么在找到问号后要将它替换为'\0'? 3. 如果HTTP请求方法不是"GET",这段代码不会执行,那么对于其他方法(如POST)如何处理查询字符串?</think>### 代码分析 在提供的 C 代码片段中,`query_string = url;` 这行代码的主要功能是**初始化指针遍历过程**,具体作用如下: 1. **指针赋值** 将 `url` 指针(指向 HTTP 请求的完整 URL 字符串首地址)赋值给 `query_string` 指针,使两者指向内存中的同一字符串起始位置。 2. **为后续处理做准备** 该赋值操作是后续 `while` 循环的基础: - 后续的 `while ((*query_string != '?') ... )` 依赖此初始位置开始遍历 URL - 使 `query_string` 成为可移动的指针,用于定位查询字符串起始点 3. **字符串分割的关键前置步骤** 在检测到 `?` 字符后: ```c *query_string = '\0'; // 分割 URL 和查询字符串 query_string++; // 指向查询字符串起始 ``` - 初始赋值确保修改的是原始 URL 字符串的副本指针 - 避免直接修改 `url` 指针导致原始数据丢失 ### 上下文功能解析 | **代码段** | **功能** | **与目标行的关联** | |-----------|---------|------------------| | `query_string = url;` | 初始化遍历指针 | 为后续操作建立起点 | | `while ((*query_string ... )` | 查找参数分隔符 `?` | 依赖初始化的指针位置 | | `*query_string = '\0'` | 截断基础 URL | 基于初始指针位置修改 | | `query_string++` | 定位查询参数起点 | 继承初始指针的偏移量 | ### 执行流程示意图 ``` 原始URL: "http://host/path?key=value" ↑ url (固定指针) 赋值后: query_string 指向相同位置 ↓ [http://host/path?key=value] while 循环后: query_string 移动到 '?' 位置 ↓ [http://host/path?key=value] 替换操作后: [http://host/path] [key=value] ← 两个独立字符串 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值