summaryrefslogtreecommitdiffstats
path: root/libmpdemux/url.c
diff options
context:
space:
mode:
authorbertrand <bertrand@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-12-14 23:48:47 +0000
committerbertrand <bertrand@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-12-14 23:48:47 +0000
commit24c6f11c8b8d08cb98648b324098f7f8c3f0bd03 (patch)
tree046487c11f8df1edb01fda3e1e58c8da5e69ad85 /libmpdemux/url.c
parentd6d9a909f05c124098f92e74b2fb2fca31e4e534 (diff)
downloadmpv-24c6f11c8b8d08cb98648b324098f7f8c3f0bd03.tar.bz2
mpv-24c6f11c8b8d08cb98648b324098f7f8c3f0bd03.tar.xz
Added 2 functions to escape/unescape the url as described in the RFC 2396.
Code borrowed from ASFRecorder. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@3497 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/url.c')
-rw-r--r--libmpdemux/url.c62
1 files changed, 61 insertions, 1 deletions
diff --git a/libmpdemux/url.c b/libmpdemux/url.c
index 410664368c..8633133319 100644
--- a/libmpdemux/url.c
+++ b/libmpdemux/url.c
@@ -1,4 +1,4 @@
-/*
+/*
* URL Helper
* by Bertrand Baudet <bertrand_baudet@yahoo.com>
* (C) 2001, MPlayer team.
@@ -134,3 +134,63 @@ url_free(URL_t* url) {
if(url->password) free(url->password);
free(url);
}
+
+
+/* Replace escape sequences in an URL (or a part of an URL) */
+/* works like strcpy(), but without return argument */
+/* unescape_url_string comes from ASFRecorder */
+void
+url_unescape_string(char *outbuf, char *inbuf)
+{
+ unsigned char c;
+ do {
+ c = *inbuf++;
+ if (c == '%') {
+ unsigned char c1 = *inbuf++;
+ unsigned char c2 = *inbuf++;
+ if ( ((c1>='0' && c1<='9') || (c1>='A' && c1<='F')) &&
+ ((c2>='0' && c2<='9') || (c2>='A' && c2<='F')) ) {
+ if (c1>='0' && c1<='9') c1-='0';
+ else c1-='A';
+ if (c2>='0' && c2<='9') c2-='0';
+ else c2-='A';
+ c = (c1<<4) + c2;
+ }
+ }
+ *outbuf++ = c;
+ } while (c != '\0');
+}
+
+/* Replace specific characters in the URL string by an escape sequence */
+/* works like strcpy(), but without return argument */
+/* escape_url_string comes from ASFRecorder */
+void
+url_escape_string(char *outbuf, char *inbuf) {
+ unsigned char c;
+ do {
+ c = *inbuf++;
+ if( (c >= 'A' && c <= 'Z') ||
+ (c >= 'a' && c <= 'z') ||
+ (c >= '0' && c <= '9') ||
+ (c >= 0x7f) || /* fareast languages(Chinese, Korean, Japanese) */
+ c=='-' || c=='_' || c=='.' || c=='!' || c=='~' || /* mark characters */
+ c=='*' || c=='\'' || c=='(' || c==')' || c=='%' || /* do not touch escape character */
+ c==';' || c=='/' || c=='?' || c==':' || c=='@' || /* reserved characters */
+ c=='&' || c=='=' || c=='+' || c=='$' || c==',' || /* see RFC 2396 */
+ c=='\0' ) {
+ *outbuf++ = c;
+ } else {
+ /* all others will be escaped */
+ unsigned char c1 = ((c & 0xf0) >> 4);
+ unsigned char c2 = (c & 0x0f);
+ if (c1 < 10) c1+='0';
+ else c1+='A';
+ if (c2 < 10) c2+='0';
+ else c2+='A';
+ *outbuf++ = '%';
+ *outbuf++ = c1;
+ *outbuf++ = c2;
+ }
+ } while (c != '\0');
+}
+