apache 2 unescape escape is_url 函数

AP_DECLARE(char *) ap_escape_html2(apr_pool_t *p, const char *s, int toasc)
{
int i, j;
char *x;

/* first, count the number of extra characters */
for (i = 0, j = 0; s[i] != ”; i++)
if (s[i] == ’<’ || s[i] == ’>’)
j += 3;
else if (s[i] == ’&’)
j += 4;
else if (s[i] == ’”‘)
j += 5;
else if (toasc && !apr_isascii(s[i]))
j += 5;

if (j == 0)
return apr_pstrmemdup(p, s, i);

x = apr_palloc(p, i + j + 1);
for (i = 0, j = 0; s[i] != ”; i++, j++)
if (s[i] == ’<’) {
memcpy(&x[j], ”&lt;”, 4);
j += 3;
}
else if (s[i] == ’>’) {
memcpy(&x[j], ”&gt;”, 4);
j += 3;
}
else if (s[i] == ’&’) {
memcpy(&x[j], ”&amp;”, 5);
j += 4;
}
else if (s[i] == ’”‘) {
memcpy(&x[j], ”&quot;”, 6);
j += 5;
}
else if (toasc && !apr_isascii(s[i])) {
char *esc = apr_psprintf(p, ”&#%3.3d;”, (unsigned char)s[i]);
memcpy(&x[j], esc, 6);
j += 5;
}
else
x[j] = s[i];

x[j] = ”;
return x;
}

/*
* Check for an absoluteURI syntax (see section 3.2 in RFC2068).
*/
AP_DECLARE(int) ap_is_url(const char *u)
{
register int x;

for (x = 0; u[x] != ’:'; x++) {
if ((!u[x]) ||
((!apr_isalpha(u[x])) && (!apr_isdigit(u[x])) &&
(u[x] != ’+') && (u[x] != ’-') && (u[x] != ’.'))) {
return 0;
}
}

return (x ? 1 : 0);                /* If the first character is ’:', it’s broken, too */
}

 

{
register int badesc, badpath;
char *x, *y;

badesc = 0;
badpath = 0;
/* Initial scan for first ‘%’. Don’t bother writing values before
* seeing a ‘%’ */
y = strchr(url, ‘%’);
if (y == NULL) {
return OK;
}
for (x = y; *y; ++x, ++y) {
if (*y != ‘%’)
*x = *y;
else {
if (!apr_isxdigit(*(y + 1)) || !apr_isxdigit(*(y + 2))) {
badesc = 1;
*x = ‘%’;
}
else {
*x = x2c(y + 1);
y += 2;
if (IS_SLASH(*x) || *x == ‘\0′)
badpath = 1;
}
}
}
*x = ‘\0′;
if (badesc)
return HTTP_BAD_REQUEST;
else if (badpath)
return HTTP_NOT_FOUND;
else
return OK;
}

/**
* 用C语言实现URL解密
*/
void urldecode(char *p)
{
register i=0;
while(*(p+i))
{
if ((*p=*(p+i)) == ‘%’)
{
*p=*(p+i+1) >= ‘A’ ? ((*(p+i+1) & 0XDF) – ‘A’) + 10 : (*(p+i+1) – ’0′);
*p=(*p) * 16;
*p+=*(p+i+2) >= ‘A’ ? ((*(p+i+2) & 0XDF) – ‘A’) + 10 : (*(p+i+2) – ’0′);
i+=2;
}
else if (*(p+i)==’+')
{
*p=’ ‘;
}
p++;
}
*p=’\0′;
}

参考资料:

http://hi.baidu.com/leejun_2005/item/9e0f4e4ba62cde0bc11613b5

http://hi.baidu.com/zkheartboy/item/da0d709b21c3f1da7b7f0129

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>