... | ... |
@@ -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); |