summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_string.c
diff options
context:
space:
mode:
authorValentin Bartenev <vbart@nginx.com>2019-09-19 02:47:09 +0300
committerValentin Bartenev <vbart@nginx.com>2019-09-19 02:47:09 +0300
commit08a8d1510d5f73d91112ead9e6ac075fb7d2bac0 (patch)
treef4dceb5af955f40820b0edbde4bdae41084c80ce /src/nxt_string.c
parentc554941b4f826d83d92d5ca8d7713bea4167896e (diff)
downloadunit-08a8d1510d5f73d91112ead9e6ac075fb7d2bac0.tar.gz
unit-08a8d1510d5f73d91112ead9e6ac075fb7d2bac0.tar.bz2
Basic support for serving static files.
Diffstat (limited to 'src/nxt_string.c')
-rw-r--r--src/nxt_string.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/nxt_string.c b/src/nxt_string.c
index 4d3b3954..b89e9555 100644
--- a/src/nxt_string.c
+++ b/src/nxt_string.c
@@ -507,3 +507,69 @@ nxt_decode_uri(u_char *dst, u_char *src, size_t length)
return dst;
}
+
+
+uintptr_t
+nxt_encode_uri(u_char *dst, u_char *src, size_t length)
+{
+ u_char *end;
+ nxt_uint_t n;
+
+ static const u_char hex[16] = "0123456789ABCDEF";
+
+ /* " ", "#", "%", "?", %00-%1F, %7F-%FF */
+
+ static const uint32_t escape[] = {
+ 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
+
+ /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */
+ 0x80000029, /* 1000 0000 0000 0000 0000 0000 0010 1001 */
+
+ /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */
+ 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */
+
+ /* ~}| {zyx wvut srqp onml kjih gfed cba` */
+ 0x80000000, /* 1000 0000 0000 0000 0000 0000 0000 0000 */
+
+ 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
+ 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
+ 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
+ 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */
+ };
+
+ end = src + length;
+
+ if (dst == NULL) {
+
+ /* Find the number of the characters to be escaped. */
+
+ n = 0;
+
+ while (src < end) {
+
+ if (escape[*src >> 5] & (1U << (*src & 0x1f))) {
+ n++;
+ }
+
+ src++;
+ }
+
+ return (uintptr_t) n;
+ }
+
+ while (src < end) {
+
+ if (escape[*src >> 5] & (1U << (*src & 0x1f))) {
+ *dst++ = '%';
+ *dst++ = hex[*src >> 4];
+ *dst++ = hex[*src & 0xf];
+
+ } else {
+ *dst++ = *src;
+ }
+
+ src++;
+ }
+
+ return (uintptr_t) dst;
+}