18.3.4 SHTTPD所请求URI解析的实现
服务器SHTTPD中URI解析主要包含“有害”字符的替换,即将以“%”开始的字符进行转换。例如将“%20”转换为“空格”。进行字符转换的函数为uri_decode(),代码 如下:
static int uri_decode(char *src, int src_len, char *dst, int dst_len)
{
int i, j, a, b;
#define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W')
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'; /* Null-terminate the destination */
return (j);
}
对于目录中的双点“..”,需要进行转换,即进入当前目录的父目录。代码如下:
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';
}