rfc1738.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:4k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: rfc1738.c,v 1.18 1998/08/12 16:08:05 wessels Exp $
  3.  *
  4.  * DEBUG: 
  5.  * AUTHOR: Harvest Derived
  6.  *
  7.  * SQUID Internet Object Cache  http://squid.nlanr.net/Squid/
  8.  * ----------------------------------------------------------
  9.  *
  10.  *  Squid is the result of efforts by numerous individuals from the
  11.  *  Internet community.  Development is led by Duane Wessels of the
  12.  *  National Laboratory for Applied Network Research and funded by the
  13.  *  National Science Foundation.  Squid is Copyrighted (C) 1998 by
  14.  *  Duane Wessels and the University of California San Diego.  Please
  15.  *  see the COPYRIGHT file for full details.  Squid incorporates
  16.  *  software developed and/or copyrighted by other sources.  Please see
  17.  *  the CREDITS file for full details.
  18.  *
  19.  *  This program is free software; you can redistribute it and/or modify
  20.  *  it under the terms of the GNU General Public License as published by
  21.  *  the Free Software Foundation; either version 2 of the License, or
  22.  *  (at your option) any later version.
  23.  *  
  24.  *  This program is distributed in the hope that it will be useful,
  25.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  26.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27.  *  GNU General Public License for more details.
  28.  *  
  29.  *  You should have received a copy of the GNU General Public License
  30.  *  along with this program; if not, write to the Free Software
  31.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
  32.  *
  33.  */
  34. #include "config.h"
  35. #if HAVE_STDIO_H
  36. #include <stdio.h>
  37. #endif
  38. #if HAVE_STRING_H
  39. #include <string.h>
  40. #endif
  41. #include "util.h"
  42. #include "snprintf.h"
  43. /*  
  44.  *  RFC 1738 defines that these characters should be escaped, as well
  45.  *  any non-US-ASCII character or anything between 0x00 - 0x1F.
  46.  */
  47. static char rfc1738_unsafe_chars[] =
  48. {
  49.     (char) 0x3C, /* < */
  50.     (char) 0x3E, /* > */
  51.     (char) 0x22, /* " */
  52.     (char) 0x23, /* # */
  53.     (char) 0x25, /* % */
  54.     (char) 0x7B, /* { */
  55.     (char) 0x7D, /* } */
  56.     (char) 0x7C, /* | */
  57.     (char) 0x5C, /*  */
  58.     (char) 0x5E, /* ^ */
  59.     (char) 0x7E, /* ~ */
  60.     (char) 0x5B, /* [ */
  61.     (char) 0x5D, /* ] */
  62.     (char) 0x60, /* ` */
  63.     (char) 0x27, /* ' */
  64.     (char) 0x20 /* space */
  65. };
  66. /*
  67.  *  rfc1738_escape - Returns a static buffer contains the RFC 1738 
  68.  *  compliant, escaped version of the given url.
  69.  */
  70. char *
  71. rfc1738_escape(const char *url)
  72. {
  73.     static char *buf;
  74.     static size_t bufsize = 0;
  75.     const char *p;
  76.     char *q;
  77.     int i, do_escape;
  78.     if (buf == NULL || strlen(url) * 3 > bufsize) {
  79. xfree(buf);
  80. bufsize = strlen(url) * 3 + 1;
  81. buf = xcalloc(bufsize, 1);
  82.     }
  83.     for (p = url, q = buf; *p != ''; p++, q++) {
  84. do_escape = 0;
  85. /* RFC 1738 defines these chars as unsafe */
  86. for (i = 0; i < sizeof(rfc1738_unsafe_chars); i++) {
  87.     if (*p == rfc1738_unsafe_chars[i]) {
  88. do_escape = 1;
  89. break;
  90.     }
  91. }
  92. /* RFC 1738 says any control chars (0x00-0x1F) are encoded */
  93. if ((unsigned char) *p <= (unsigned char) 0x1F) {
  94.     do_escape = 1;
  95. }
  96. /* RFC 1738 says 0x7f is encoded */
  97. if (*p == (char) 0x7F) {
  98.     do_escape = 1;
  99. }
  100. /* RFC 1738 says any non-US-ASCII are encoded */
  101. if (((unsigned char) *p >= (unsigned char) 0x80) &&
  102.     ((unsigned char) *p <= (unsigned char) 0xFF)) {
  103.     do_escape = 1;
  104. }
  105. /* Do the triplet encoding, or just copy the char */
  106. /* note: we do not need snprintf here as q is appropriately
  107.  * allocated - KA */
  108. if (do_escape == 1) {
  109.     (void) sprintf(q, "%%%02x", (unsigned char) *p);
  110.     q += sizeof(char) * 2;
  111. } else {
  112.     *q = *p;
  113. }
  114.     }
  115.     *q = '';
  116.     return (buf);
  117. }
  118. /*
  119.  *  rfc1738_unescape() - Converts escaped characters (%xy numbers) in 
  120.  *  given the string.  %% is a %. %ab is the 8-bit hexadecimal number "ab"
  121.  */
  122. void
  123. rfc1738_unescape(char *s)
  124. {
  125.     char hexnum[3];
  126.     int i, j; /* i is write, j is read */
  127.     unsigned int x;
  128.     for (i = j = 0; s[j]; i++, j++) {
  129. s[i] = s[j];
  130. if (s[i] != '%')
  131.     continue;
  132. if (s[j+1] == '%') { /* %% case */
  133.     j++;
  134.     continue;
  135. }
  136. if (s[j+1] && s[j+2]) {
  137.     hexnum[0] = s[j+1];
  138.     hexnum[1] = s[j+2];
  139.     hexnum[2] = '';
  140.     if (1 == sscanf(hexnum, "%x", &x)) {
  141.         s[i] = (char) (0x0ff & x);
  142. j += 2;
  143.     }
  144. }
  145.     }
  146.     s[i] = '';
  147. }