diff options
author | Axel Duch <axel.duch@nginx.com> | 2020-05-14 12:29:06 +0200 |
---|---|---|
committer | Axel Duch <axel.duch@nginx.com> | 2020-05-14 12:29:06 +0200 |
commit | ee1e248f4b038bb9e03fd78463da580af03c28f7 (patch) | |
tree | 7023ed63db7edb5fa616bc41a424b1a6c1e35046 /src/nxt_string.c | |
parent | 376d758dd72ac27f2bd5bb833ba68f5c9b531880 (diff) | |
download | unit-ee1e248f4b038bb9e03fd78463da580af03c28f7.tar.gz unit-ee1e248f4b038bb9e03fd78463da580af03c28f7.tar.bz2 |
Router: decode uri and args.
Diffstat (limited to 'src/nxt_string.c')
-rw-r--r-- | src/nxt_string.c | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/src/nxt_string.c b/src/nxt_string.c index 54f96abc..ab568990 100644 --- a/src/nxt_string.c +++ b/src/nxt_string.c @@ -475,7 +475,7 @@ nxt_strvers_match(u_char *version, u_char *prefix, size_t length) } -static const uint8_t nxt_hex2int[256] +const uint8_t nxt_hex2int[256] nxt_aligned(32) = { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, @@ -551,6 +551,47 @@ nxt_decode_uri(u_char *dst, u_char *src, size_t length) } +u_char * +nxt_decode_uri_plus(u_char *dst, u_char *src, size_t length) +{ + u_char *end, ch; + uint8_t d0, d1; + + nxt_prefetch(&nxt_hex2int['0']); + + end = src + length; + + while (src < end) { + ch = *src++; + + switch (ch) { + case '%': + if (nxt_slow_path(end - src < 2)) { + return NULL; + } + + d0 = nxt_hex2int[*src++]; + d1 = nxt_hex2int[*src++]; + + if (nxt_slow_path((d0 | d1) >= 16)) { + return NULL; + } + + ch = (d0 << 4) + d1; + break; + + case '+': + ch = ' '; + break; + } + + *dst++ = ch; + } + + return dst; +} + + uintptr_t nxt_encode_uri(u_char *dst, u_char *src, size_t length) { |