Chinaunix首页 | 论坛 | 博客
  • 博客访问: 63238
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 236
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-05 21:34
文章分类

全部博文(21)

文章存档

2015年(21)

我的朋友

分类: LINUX

2015-08-07 23:59:26


点击(此处)折叠或打开

  1. //start from the very beginning,and to create greatness
  2. //@author: Chuangwei Lin
  3. //@E-mail:979951191@qq.com
  4. //@brief: URI分析
  5. #include "lcw_shttpd.h"
  6. /******************************************************
  7. 函数名:uri_decode(char *src, int src_len, char *dst, int dst_len)
  8. 参数:源字符串,长度,目的字符串,长度
  9. 功能:将以%开头的字符进行转换(如果以%开头的字符,则将其后面的两个字符拼接后转换成一个字符)
  10. *******************************************************/
  11. static int uri_decode(char *src, int src_len, char *dst, int dst_len)
  12. {
  13.     
  14.     //#include<ctype.h>
  15.     //定义函数:int isdigit(char c)
  16.     //函数说明:检查参数c是否为阿拉伯数字0到9。
  17.     //返回值:若参数c为阿拉伯数字,则返回TRUE,否则返回NULL(0)
  18. #define    HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W')
  19. int    i, j, a, b;
  20.     for (i = j = 0; i < src_len && j < dst_len - 1; i++, j++)
  21.     {
  22.         switch (src[i])
  23.         {
  24.         case '%'://%后面两个字符拼接成一个
  25.             if (isxdigit(((unsigned char *) src)[i + 1]) && isxdigit(((unsigned char *) src)[i + 2]))
  26.             { //把字符转换成小写字母,非字母字符不做出处理
  27.                 a = tolower(((unsigned char *)src)[i + 1]);
  28.                 b = tolower(((unsigned char *)src)[i + 2]);
  29.                 dst[j] = (HEXTOI(a) << 4) | HEXTOI(b);//用或实现拼接
  30.                 i += 2;
  31.             }
  32.             else
  33.             {
  34.                 dst[j] = '%';
  35.             }
  36.             break;
  37.         default:
  38.             dst[j] = src[i];
  39.             break;
  40.         }
  41.     }

  42.     dst[j] = '\0';    //结束符
  43.     return (j);
  44. }
  45. /******************************************************
  46. 函数名:remove_double_dots(char *s)
  47. 参数:源字符串
  48. 功能:对目录中的双点".."进行转换,即进入当前目录的父目录
  49. *******************************************************/
  50. static void remove_double_dots(char *s)
  51. {
  52.     char* p = s;
  53.     while (*s != '\0')
  54.     {
  55.         *p++ = *s++;
  56.         if (s[-1] == '/' || s[-1] == '\\')
  57.         {
  58.             while (*s == '.' || *s == '/' || *s == '\\')
  59.             {
  60.                 s++;
  61.             }
  62.         }
  63.     }
  64.     *p = '\0';
  65. }
  66. /******************************************************
  67. 函数名:uri_parse(char *src, int len)
  68. 参数:源字符串及其长度
  69. 功能:完成两种转换
  70. *******************************************************/
  71. void uri_parse(char *src, int len)
  72. {
  73.     uri_decode(src, len -1, src, len);
  74.     remove_double_dots(src);
  75. }

阅读(1009) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~