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。
具体实现如下:
举个例子。一个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 }
相关文章推荐
- windows系统共享文件夹访问无需验证(输入用户名和密码)即可进入
- Jquery制作--焦点图左右轮播
- excel中自动变为插入语句的写法
- Android之实现具有优先级的线程池
- Java基础---String类和基本数据类型包装类
- LINUX下用apache或者nginx,本机可以访问,但局域网中的电脑无法访问
- iOS开发书单
- c#读xls
- android本地广播
- Wine完全使用指南――从基本到高级
- MJExtension 2.0 字典转模型再叙 常用的字典转模型使用实例说明
- 【转】setAnimation和startAnimation区别
- 关于近期状态
- 对js运算符“||”和“&&”的总结
- vim右键粘贴 等杂
- 转:如何实现一个滚动列表
- 关于DCMTK3.6.0源代码编译的总结
- zabbix打开慢的原因和优化尝试
- javaweb学习总结(四十二)——Filter(过滤器)学习
- 高斯函数一阶求导二阶求导