- if (isalnum((unsigned char)*p))
- DPUTC(d, *p);
- else
- dstr_putf(d, "%%%02x", *p);
- break;
+ if ((ctx->f & URLF_LAX) || isalnum((unsigned char)*p))
+ goto safe;
+ else
+ goto unsafe;
+ case '/':
+ case '~':
+ if (ctx->f & URLF_STRICT)
+ goto unsafe;
+ case '-':
+ case '.':
+ case '_':
+ safe:
+ DPUTC(d, *p);
+ break;
+ unsafe:
+ case '+':
+ case '%':
+ case '=':
+ case '&':
+ case ';':
+ dstr_putf(d, "%%%02x", *p);
+ break;