Browse code

webkernel: add uri_urldecode (taken from my unreleased vdrsyncts)

Dario Rodriguez authored on 23/07/2014 20:13:42
Showing 2 changed files
... ...
@@ -33,6 +33,10 @@
33 33
 #define ALIVETIMEOUT 15
34 34
 #define MAXETAGSIZE 127
35 35
 
36
+#define HEXNIBBLE2BIN(a) (((a)>='0' && (a)<='9')?(a)-'0':((a)>='a' && (a)<='f')?(a)-'a'+10:((a)>='A' && (a)<='F')?(a)-'A'+10:0)
37
+#define ISHEXNIBBLE(a) ((((a)>='0' && (a)<='9')||((a)>='a' && (a)<='f')||((a)>='A' && (a)<='F'))?1:0)
38
+
39
+
36 40
 typedef struct wk_post {
37 41
         char *name;
38 42
         char *value;
... ...
@@ -916,6 +920,28 @@ mime_getdefault(const char *filename, const char *defaultmime)
916 920
         return(defaultmime);
917 921
 }
918 922
 
923
+int
924
+uri_urldecode(char *s)
925
+{
926
+        int i,o;
927
+        int a,b,n;
928
+        for(i=0,o=0;s[i]!='\0';i++,o++) {
929
+                if(s[i]=='+')
930
+                        s[o]=' ';
931
+                else if(s[i]=='%' && (a=s[i+1])!='\0' && (b=s[i+2])!='\0' && ISHEXNIBBLE(a) && ISHEXNIBBLE(b)) {
932
+                        n=(HEXNIBBLE2BIN(a)<<4)|HEXNIBBLE2BIN(b);
933
+                        s[o]=128|64|(n>>6);
934
+                        s[o+1]=128|(n&0x3f);
935
+                        i+=2;
936
+                        o++;
937
+                } else
938
+                        s[o]=s[i];
939
+        }
940
+        s[o]='\0';
941
+        return(0);
942
+}
943
+
944
+
919 945
 int
920 946
 wk_sbufacquire(wk *paramweb)
921 947
 {
... ...
@@ -73,7 +73,7 @@ int wk_post_addvalid(wk *web, int connid, char *varname, char *tofile);
73 73
 char *wk_post_get(wk *web, int connid, char *varname, int *isfile);
74 74
 
75 75
 const char *mime_getdefault(const char *filename, const char *defaultmime);
76
-
76
+int uri_urldecode(char *component); /* simple decoder for url-encoded strings. In-place substitution, outputs UTF-8 data */
77 77
 
78 78
 int wk_sbufacquire(wk *web);
79 79
 sbuf *wk_sbufget(wk *web, int sbufid);