chiark
/
gitweb
/
~mdw
/
mLib
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
url: Allow `;' to separate key/value pairs in URL-encoded strings.
[mLib]
/
url.c
diff --git
a/url.c
b/url.c
index f7e11b3c28616c6cb5a79acbc44b3879a7cef74b..2dc1c5048e64181c90c997df0c79fcff4b9c29d5 100644
(file)
--- a/
url.c
+++ b/
url.c
@@
-112,7
+112,7
@@
static void encode(url_ectx *ctx, dstr *d, const char *p)
void url_enc(url_ectx *ctx, dstr *d, const char *name, const char *value)
{
if (ctx->f & URLF_SEP)
void url_enc(url_ectx *ctx, dstr *d, const char *name, const char *value)
{
if (ctx->f & URLF_SEP)
- DPUTC(d, '&');
+ DPUTC(d,
(ctx->f & URLF_SEMI) ? ';' :
'&');
encode(ctx, d, name);
DPUTC(d, '=');
encode(ctx, d, value);
encode(ctx, d, name);
DPUTC(d, '=');
encode(ctx, d, value);
@@
-130,11
+130,12
@@
void url_enc(url_ectx *ctx, dstr *d, const char *name, const char *value)
* Use: Initializes a URL decoding context.
*/
* Use: Initializes a URL decoding context.
*/
-void url_initdec(url_dctx *ctx, const char *p) { ctx->p = p; }
+void url_initdec(url_dctx *ctx, const char *p) { ctx->p = p;
ctx->f = 0;
}
/* --- @decode@ --- *
*
/* --- @decode@ --- *
*
- * Arguments: @dstr *d@ = pointer to output string
+ * Arguments: @url_dctx *ctx@ = pointer to the context
+ * @dstr *d@ = pointer to output string
* @const char *p@ = pointer to input data
* @int eq@ = whether to stop at `=' characters
*
* @const char *p@ = pointer to input data
* @int eq@ = whether to stop at `=' characters
*
@@
-143,7
+144,7
@@
void url_initdec(url_dctx *ctx, const char *p) { ctx->p = p; }
* Use: Does a URL decode.
*/
* Use: Does a URL decode.
*/
-static const char *decode(dstr *d, const char *p, int eq)
+static const char *decode(
url_dctx *ctx,
dstr *d, const char *p, int eq)
{
if (!*p)
return (0);
{
if (!*p)
return (0);
@@
-152,8
+153,11
@@
static const char *decode(dstr *d, const char *p, int eq)
case '=':
if (eq)
return (p);
case '=':
if (eq)
return (p);
- DPUTC(d, *p);
- break;
+ goto boring;
+ case ';':
+ if (ctx->f & URLF_SEMI)
+ return (p);
+ goto boring;
case 0:
case '&':
return (p);
case 0:
case '&':
return (p);
@@
-171,6
+175,7
@@
static const char *decode(dstr *d, const char *p, int eq)
}
}
default:
}
}
default:
+ boring:
DPUTC(d, *p);
break;
}
DPUTC(d, *p);
break;
}
@@
-195,7
+200,7
@@
int url_dec(url_dctx *ctx, dstr *n, dstr *v)
size_t l = n->len;
again:
size_t l = n->len;
again:
- if ((p = decode(n, p, 1)) == 0 || *p == 0)
+ if ((p = decode(
ctx,
n, p, 1)) == 0 || *p == 0)
return (0);
if (*p != '=') {
p++;
return (0);
if (*p != '=') {
p++;
@@
-203,7
+208,7
@@
again:
goto again;
}
p++;
goto again;
}
p++;
- if ((p = decode(v, p, 0)) == 0)
+ if ((p = decode(
ctx,
v, p, 0)) == 0)
return (0);
DPUTZ(n);
DPUTZ(v);
return (0);
DPUTZ(n);
DPUTZ(v);