//start from the very beginning,and to create greatness
//@author: Chuangwei Lin
//@E-mail:979951191@qq.com
//@brief: URI分析
#include "lcw_shttpd.h"
/******************************************************
函数名:uri_decode(char *src, int src_len, char *dst, int dst_len)
参数:源字符串,长度,目的字符串,长度
功能:将以%开头的字符进行转换(如果以%开头的字符,则将其后面的两个字符拼接后转换成一个字符)
*******************************************************/
static int uri_decode(char *src, int src_len, char *dst, int dst_len)
{ //#include<ctype.h>
//定义函数:int isdigit(char c)
//函数说明:检查参数c是否为阿拉伯数字0到9。
//返回值:若参数c为阿拉伯数字,则返回TRUE,否则返回NULL(0)。
#define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W')
int i, j, a, b;
for (i = j = 0; i < src_len && j < dst_len - 1; i++, j++)
{
switch (src[i])
{
case '%'://将%后面两个字符拼接成一个
if (isxdigit(((unsigned char *) src)[i + 1]) && isxdigit(((unsigned char *) src)[i + 2]))
{ //把字符转换成小写字母,非字母字符不做出处理
a = tolower(((unsigned char *)src)[i + 1]);
b = tolower(((unsigned char *)src)[i + 2]);
dst[j] = (HEXTOI(a) << 4) | HEXTOI(b);//用或实现拼接
i += 2;
}
else
{
dst[j] = '%';
}
break;
default:
dst[j] = src[i];
break;
}
} dst[j] = '\0'; //结束符
return (j);
}
/******************************************************
函数名:remove_double_dots(char *s)
参数:源字符串
功能:对目录中的双点".."进行转换,即进入当前目录的父目录
*******************************************************/
static void remove_double_dots(char *s)
{
char* p = s;
while (*s != '\0')
{
*p++ = *s++;
if (s[-1] == '/' || s[-1] == '\\')
{
while (*s == '.' || *s == '/' || *s == '\\')
{
s++;
}
}
}
*p = '\0';
}
/******************************************************
函数名:uri_parse(char *src, int len)
参数:源字符串及其长度
功能:完成两种转换
*******************************************************/
void uri_parse(char *src, int len)
{
uri_decode(src, len -1, src, len);
remove_double_dots(src);
}

最新文章

  1. C# 加密–RSA前端与后台的加密&amp;解密
  2. java设计模式之适配器模式
  3. python windows安装
  4. SqlServer2008R2附件数据库失败
  5. 端口扫描器——ZenmapKail Linux渗透测
  6. Lambda(2)
  7. HDU5778 abs
  8. linux命令 common 文件比较
  9. 一个神奇的bug
  10. c# 小数的处理
  11. Go语言及Web框架Beego环境无脑搭建
  12. Azure Powershell获取指定订阅下的虚拟机信息(ARM)
  13. Pandas系列(十三)-其他常用功能
  14. 设计在canal中的运用,看到随手记下
  15. Docker 容器暂停服务 - 七
  16. k8s yaml说明
  17. MSSqlServer 主从同步复制原理(发布/订阅)
  18. Markdon 作图语法 CSDN
  19. php安装soap等扩展的方式: 已经安装了php却发现少安装了一下扩展
  20. Java复习3-类的继承

热门文章

  1. 单线程IP扫描解析
  2. PHP中debug基本方法
  3. Array(数组)对象--&gt;数组长度的获取以及增减
  4. Python线程和协程CPU资源利用率测试
  5. Git应用详解第八讲:Git标签、别名与Git gc
  6. AJ学IOS(46)之网易彩票幸运大转盘
  7. 抠脚大叔如何改变性别,Python实现变声器功能
  8. Gun N&#39; Rose Team Review
  9. selenium Webdriver多窗口切换
  10. java-锁膨胀的过程