@@ -1840,6 +1840,26 @@ ngx_http_lua_escape_uri(u_char *dst, u_char *src, size_t size, ngx_uint_t type)
1840
1840
/* ~}| {zyx wvut srqp onml kjih gfed cba` */
1841
1841
0x80000000 , /* 1000 0000 0000 0000 0000 0000 0000 0000 */
1842
1842
1843
+ 0xffffffff , /* 1111 1111 1111 1111 1111 1111 1111 1111 */
1844
+ 0xffffffff , /* 1111 1111 1111 1111 1111 1111 1111 1111 */
1845
+ 0xffffffff , /* 1111 1111 1111 1111 1111 1111 1111 1111 */
1846
+ 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */
1847
+ };
1848
+
1849
+ /* not ALPHA, DIGIT, "-", ".", "_", "~" */
1850
+
1851
+ static uint32_t uri_component [] = {
1852
+ 0xffffffff , /* 1111 1111 1111 1111 1111 1111 1111 1111 */
1853
+
1854
+ /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */
1855
+ 0xfc00987d , /* 1111 1100 0000 0000 1001 1000 0111 1101 */
1856
+
1857
+ /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */
1858
+ 0x78000001 , /* 0111 1000 0000 0000 0000 0000 0000 0001 */
1859
+
1860
+ /* ~}| {zyx wvut srqp onml kjih gfed cba` */
1861
+ 0xb8000001 , /* 1011 1000 0000 0000 0000 0000 0000 0001 */
1862
+
1843
1863
0xffffffff , /* 1111 1111 1111 1111 1111 1111 1111 1111 */
1844
1864
0xffffffff , /* 1111 1111 1111 1111 1111 1111 1111 1111 */
1845
1865
0xffffffff , /* 1111 1111 1111 1111 1111 1111 1111 1111 */
@@ -1909,8 +1929,7 @@ ngx_http_lua_escape_uri(u_char *dst, u_char *src, size_t size, ngx_uint_t type)
1909
1929
/* mail_auth is the same as memcached */
1910
1930
1911
1931
static uint32_t * map [] =
1912
- { uri , args , html , refresh , memcached , memcached };
1913
-
1932
+ { uri , args , uri_component , html , refresh , memcached , memcached };
1914
1933
1915
1934
escape = map [type ];
1916
1935
@@ -2321,7 +2340,7 @@ ngx_http_lua_process_args_option(ngx_http_request_t *r, lua_State *L,
2321
2340
key = (u_char * ) lua_tolstring (L , -2 , & key_len );
2322
2341
2323
2342
key_escape = 2 * ngx_http_lua_escape_uri (NULL , key , key_len ,
2324
- NGX_ESCAPE_URI );
2343
+ NGX_ESCAPE_URI_COMPONENT );
2325
2344
total_escape += key_escape ;
2326
2345
2327
2346
switch (lua_type (L , -1 )) {
@@ -2330,7 +2349,7 @@ ngx_http_lua_process_args_option(ngx_http_request_t *r, lua_State *L,
2330
2349
value = (u_char * ) lua_tolstring (L , -1 , & value_len );
2331
2350
2332
2351
total_escape += 2 * ngx_http_lua_escape_uri (NULL , value , value_len ,
2333
- NGX_ESCAPE_URI );
2352
+ NGX_ESCAPE_URI_COMPONENT );
2334
2353
2335
2354
len += key_len + value_len + (sizeof ("=" ) - 1 );
2336
2355
n ++ ;
@@ -2371,7 +2390,7 @@ ngx_http_lua_process_args_option(ngx_http_request_t *r, lua_State *L,
2371
2390
total_escape +=
2372
2391
2 * ngx_http_lua_escape_uri (NULL , value ,
2373
2392
value_len ,
2374
- NGX_ESCAPE_URI );
2393
+ NGX_ESCAPE_URI_COMPONENT );
2375
2394
2376
2395
len += key_len + value_len + (sizeof ("=" ) - 1 );
2377
2396
}
@@ -2428,7 +2447,8 @@ ngx_http_lua_process_args_option(ngx_http_request_t *r, lua_State *L,
2428
2447
2429
2448
if (total_escape ) {
2430
2449
p = (u_char * ) ngx_http_lua_escape_uri (p , key , key_len ,
2431
- NGX_ESCAPE_URI );
2450
+ NGX_ESCAPE_URI_COMPONENT
2451
+ );
2432
2452
2433
2453
} else {
2434
2454
dd ("shortcut: no escape required" );
@@ -2442,7 +2462,8 @@ ngx_http_lua_process_args_option(ngx_http_request_t *r, lua_State *L,
2442
2462
2443
2463
if (total_escape ) {
2444
2464
p = (u_char * ) ngx_http_lua_escape_uri (p , value , value_len ,
2445
- NGX_ESCAPE_URI );
2465
+ NGX_ESCAPE_URI_COMPONENT
2466
+ );
2446
2467
2447
2468
} else {
2448
2469
p = ngx_copy (p , value , value_len );
@@ -2461,7 +2482,7 @@ ngx_http_lua_process_args_option(ngx_http_request_t *r, lua_State *L,
2461
2482
if (lua_toboolean (L , -1 )) {
2462
2483
if (total_escape ) {
2463
2484
p = (u_char * ) ngx_http_lua_escape_uri (p , key , key_len ,
2464
- NGX_ESCAPE_URI );
2485
+ NGX_ESCAPE_URI_COMPONENT );
2465
2486
2466
2487
} else {
2467
2488
dd ("shortcut: no escape required" );
@@ -2489,7 +2510,7 @@ ngx_http_lua_process_args_option(ngx_http_request_t *r, lua_State *L,
2489
2510
if (total_escape ) {
2490
2511
p = (u_char * ) ngx_http_lua_escape_uri (p , key ,
2491
2512
key_len ,
2492
- NGX_ESCAPE_URI );
2513
+ NGX_ESCAPE_URI_COMPONENT );
2493
2514
2494
2515
} else {
2495
2516
dd ("shortcut: no escape required" );
@@ -2508,7 +2529,8 @@ ngx_http_lua_process_args_option(ngx_http_request_t *r, lua_State *L,
2508
2529
p = (u_char * )
2509
2530
ngx_http_lua_escape_uri (p , key ,
2510
2531
key_len ,
2511
- NGX_ESCAPE_URI );
2532
+ NGX_ESCAPE_URI_COMPONENT
2533
+ );
2512
2534
2513
2535
} else {
2514
2536
dd ("shortcut: no escape required" );
@@ -2524,7 +2546,8 @@ ngx_http_lua_process_args_option(ngx_http_request_t *r, lua_State *L,
2524
2546
p = (u_char * )
2525
2547
ngx_http_lua_escape_uri (p , value ,
2526
2548
value_len ,
2527
- NGX_ESCAPE_URI );
2549
+ NGX_ESCAPE_URI_COMPONENT
2550
+ );
2528
2551
2529
2552
} else {
2530
2553
p = ngx_copy (p , value , value_len );
0 commit comments