/* * Copyright (C) Yichun Zhang (agentzh) */ #ifndef DDEBUG #define DDEBUG 0 #endif #include "ddebug.h" #include "ngx_http_lua_req_method.h" #include "ngx_http_lua_subrequest.h" #include "ngx_http_lua_util.h" static int ngx_http_lua_ngx_req_get_method(lua_State *L); static int ngx_http_lua_ngx_req_set_method(lua_State *L); void ngx_http_lua_inject_req_method_api(lua_State *L) { lua_pushcfunction(L, ngx_http_lua_ngx_req_get_method); lua_setfield(L, -2, "get_method"); lua_pushcfunction(L, ngx_http_lua_ngx_req_set_method); lua_setfield(L, -2, "set_method"); } static int ngx_http_lua_ngx_req_get_method(lua_State *L) { int n; ngx_http_request_t *r; n = lua_gettop(L); if (n != 0) { return luaL_error(L, "only one argument expected but got %d", n); } r = ngx_http_lua_get_req(L); if (r == NULL) { return luaL_error(L, "request object not found"); } ngx_http_lua_check_fake_request(L, r); lua_pushlstring(L, (char *) r->method_name.data, r->method_name.len); return 1; } static int ngx_http_lua_ngx_req_set_method(lua_State *L) { int n; int method; ngx_http_request_t *r; n = lua_gettop(L); if (n != 1) { return luaL_error(L, "only one argument expected but got %d", n); } method = luaL_checkint(L, 1); r = ngx_http_lua_get_req(L); if (r == NULL) { return luaL_error(L, "request object not found"); } ngx_http_lua_check_fake_request(L, r); switch (method) { case NGX_HTTP_GET: r->method_name = ngx_http_lua_get_method; break; case NGX_HTTP_POST: r->method_name = ngx_http_lua_post_method; break; case NGX_HTTP_PUT: r->method_name = ngx_http_lua_put_method; break; case NGX_HTTP_HEAD: r->method_name = ngx_http_lua_head_method; break; case NGX_HTTP_DELETE: r->method_name = ngx_http_lua_delete_method; break; case NGX_HTTP_OPTIONS: r->method_name = ngx_http_lua_options_method; break; case NGX_HTTP_MKCOL: r->method_name = ngx_http_lua_mkcol_method; break; case NGX_HTTP_COPY: r->method_name = ngx_http_lua_copy_method; break; case NGX_HTTP_MOVE: r->method_name = ngx_http_lua_move_method; break; case NGX_HTTP_PROPFIND: r->method_name = ngx_http_lua_propfind_method; break; case NGX_HTTP_PROPPATCH: r->method_name = ngx_http_lua_proppatch_method; break; case NGX_HTTP_LOCK: r->method_name = ngx_http_lua_lock_method; break; case NGX_HTTP_UNLOCK: r->method_name = ngx_http_lua_unlock_method; break; case NGX_HTTP_PATCH: r->method_name = ngx_http_lua_patch_method; break; case NGX_HTTP_TRACE: r->method_name = ngx_http_lua_trace_method; break; default: return luaL_error(L, "unsupported HTTP method: %d", method); } r->method = method; return 0; } #ifndef NGX_LUA_NO_FFI_API int ngx_http_lua_ffi_req_get_method(ngx_http_request_t *r) { if (r->connection->fd == (ngx_socket_t) -1) { return NGX_HTTP_LUA_FFI_BAD_CONTEXT; } return r->method; } int ngx_http_lua_ffi_req_get_method_name(ngx_http_request_t *r, char *buf, size_t *len) { if (r->connection->fd == (ngx_socket_t) -1) { return NGX_HTTP_LUA_FFI_BAD_CONTEXT; } *len = ngx_min(r->method_name.len, *len); ngx_memcpy(buf, r->method_name.data, *len); return NGX_OK; } int ngx_http_lua_ffi_req_set_method(ngx_http_request_t *r, int method) { if (r->connection->fd == (ngx_socket_t) -1) { return NGX_HTTP_LUA_FFI_BAD_CONTEXT; } switch (method) { case NGX_HTTP_GET: r->method_name = ngx_http_lua_get_method; break; case NGX_HTTP_POST: r->method_name = ngx_http_lua_post_method; break; case NGX_HTTP_PUT: r->method_name = ngx_http_lua_put_method; break; case NGX_HTTP_HEAD: r->method_name = ngx_http_lua_head_method; break; case NGX_HTTP_DELETE: r->method_name = ngx_http_lua_delete_method; break; case NGX_HTTP_OPTIONS: r->method_name = ngx_http_lua_options_method; break; case NGX_HTTP_MKCOL: r->method_name = ngx_http_lua_mkcol_method; break; case NGX_HTTP_COPY: r->method_name = ngx_http_lua_copy_method; break; case NGX_HTTP_MOVE: r->method_name = ngx_http_lua_move_method; break; case NGX_HTTP_PROPFIND: r->method_name = ngx_http_lua_propfind_method; break; case NGX_HTTP_PROPPATCH: r->method_name = ngx_http_lua_proppatch_method; break; case NGX_HTTP_LOCK: r->method_name = ngx_http_lua_lock_method; break; case NGX_HTTP_UNLOCK: r->method_name = ngx_http_lua_unlock_method; break; case NGX_HTTP_PATCH: r->method_name = ngx_http_lua_patch_method; break; case NGX_HTTP_TRACE: r->method_name = ngx_http_lua_trace_method; break; default: return NGX_DECLINED; } r->method = method; return NGX_OK; } #endif /* vi:set ft=c ts=4 sw=4 et fdm=marker: */