static int ngx_http_lua_ngx_escape_uri(lua_State *L) { ngx_http_request_t *r; size_t len, dlen; uintptr_t escape; u_char *src, *dst; lua_getglobal(L, GLOBALS_SYMBOL_REQUEST); r = lua_touserdata(L, -1); lua_pop(L, 1); if (r == NULL) { return luaL_error(L, "no request object found"); } if (lua_gettop(L) != 1) { return luaL_error(L, "expecting one argument"); } src = (u_char *) luaL_checklstring(L, 1, &len); if (len == 0) { lua_pushlstring(L, NULL, 0); return 1; } escape = 2 * ngx_http_lua_escape_uri(NULL, src, len, NGX_ESCAPE_URI); dlen = escape + len; dst = ngx_palloc(r->pool, dlen); if (dst == NULL) { return luaL_error(L, "memory allocation error"); } if (escape == 0) { ngx_memcpy(dst, src, len); } else { ngx_http_lua_escape_uri(dst, src, len, NGX_ESCAPE_URI); } lua_pushlstring(L, (char *) dst, dlen); return 1; }
void ngx_http_lua_ffi_escape_uri(const u_char *src, size_t len, u_char *dst) { ngx_http_lua_escape_uri(dst, (u_char *) src, len, NGX_ESCAPE_URI); }
size_t ngx_http_lua_ffi_uri_escaped_length(const u_char *src, size_t len) { return len + 2 * ngx_http_lua_escape_uri(NULL, (u_char *) src, len, NGX_ESCAPE_URI); }