您的位置:首页 > 其它

url截断技术巧用指针

2015-11-19 13:58 309 查看
使用url截断的时候,我们一般希望从url得到site、port、path。这是最节省内存的方法就是巧用内存。

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

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

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

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

至此,没有创建新的内存直接截断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 }


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: