00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00031 #include "stdinc.h"
00032
00033 #include "util.h"
00034
00035 #ifdef BUILD_SCROBBLER
00036
00039 static inline char
00040 toxdigit(char val)
00041 {
00042 if (val < 10)
00043 return (val + '0');
00044 else
00045 return (val - 10 + 'a');
00046 }
00047
00048 void
00049 hex_encode(unsigned char *bin, char *hex, size_t len)
00050 {
00051 while (len-- > 0) {
00052 *hex++ = toxdigit(*bin >> 4);
00053 *hex++ = toxdigit(*bin++ & 0x0f);
00054 }
00055 }
00056 #endif
00057
00058 char *
00059 http_escape(const char *str, const char *prepend)
00060 {
00061 const char *c;
00062 const char allowed[] = "-_.!~*'()/";
00063 GString *ret;
00064
00065 if (prepend == NULL)
00066 prepend = "";
00067
00068
00069 if (str == NULL)
00070 return g_strdup(prepend);
00071
00072 ret = g_string_new(prepend);
00073
00074 for (c = str; *c != '\0'; c++) {
00075 if (*c == ' ')
00076 g_string_append_c(ret, '+');
00077 else if (g_ascii_isalnum(*c) || strchr(allowed, *c) != NULL)
00078
00079 g_string_append_c(ret, *c);
00080 else
00081
00082 g_string_append_printf(ret, "%%%02hhx",
00083 (const unsigned char)*c);
00084 }
00085
00086 return g_string_free(ret, FALSE);
00087 }
00088
00089 #ifdef BUILD_XSPF
00090
00096 static void
00097 http_unescape(char *r, char *w)
00098 {
00099 for (; *r != '\0'; r++, w++) {
00100 if (r[0] == '%' &&
00101 g_ascii_isxdigit(r[1]) && g_ascii_isxdigit(r[2])) {
00102
00103 *w = g_ascii_xdigit_value(r[1]) << 4;
00104 *w |= g_ascii_xdigit_value(r[2]);
00105
00106 r += 2;
00107 } else if (*r == '+') {
00108
00109 *w = ' ';
00110 } else {
00111
00112 *w = *r;
00113 }
00114 }
00115
00116
00117 *w = '\0';
00118 }
00119
00120 char *
00121 url_escape(const char *str)
00122 {
00123 if (strstr(str, "://") == NULL) {
00124 return http_escape(str, "file://");
00125 } else {
00126 return g_strdup(str);
00127 }
00128 }
00129
00130 char *
00131 url_unescape(char *str)
00132 {
00133 if (strncmp(str, "file://", 7) == 0) {
00134 http_unescape(str + 7, str);
00135
00136 }
00137
00138 return (str);
00139 }
00140 #endif