diff --git a/src/output-lua-http.c b/src/output-lua-http.c index 7b209a3a3a..2066199775 100644 --- a/src/output-lua-http.c +++ b/src/output-lua-http.c @@ -56,18 +56,47 @@ #include "util-lua.h" #include "output-lua-common.h" +int LuaStateNeedProto(lua_State *luastate, AppProto alproto) +{ + AppProto flow_alproto = 0; + int locked = 0; + Flow *flow = LuaStateGetFlow(luastate, &locked); + if (flow == NULL) + return LuaCallbackError(luastate, "internal error: no flow"); + + if (locked == LUA_FLOW_NOT_LOCKED_BY_PARENT) { + FLOWLOCK_RDLOCK(flow); + flow_alproto = flow->alproto; + FLOWLOCK_UNLOCK(flow); + } else { + flow_alproto = flow->alproto; + } + + return (alproto == flow_alproto); + +} + static int HttpGetRequestUriRaw(lua_State *luastate) { + if (!(LuaStateNeedProto(luastate, ALPROTO_HTTP))) + return LuaCallbackError(luastate, "error: protocol not http"); + htp_tx_t *tx = LuaStateGetTX(luastate); if (tx == NULL) return LuaCallbackError(luastate, "internal error: no tx"); + if (tx->request_uri == NULL) + return LuaCallbackError(luastate, "no request uri"); + return LuaReturnStringBuffer(luastate, bstr_ptr(tx->request_uri), bstr_len(tx->request_uri)); } static int HttpGetRequestUriNormalized(lua_State *luastate) { + if (!(LuaStateNeedProto(luastate, ALPROTO_HTTP))) + return LuaCallbackError(luastate, "error: protocol not http"); + htp_tx_t *tx = LuaStateGetTX(luastate); if (tx == NULL) return LuaCallbackError(luastate, "internal error: no tx"); @@ -88,6 +117,9 @@ static int HttpGetRequestUriNormalized(lua_State *luastate) static int HttpGetRequestLine(lua_State *luastate) { + if (!(LuaStateNeedProto(luastate, ALPROTO_HTTP))) + return LuaCallbackError(luastate, "error: protocol not http"); + htp_tx_t *tx = LuaStateGetTX(luastate); if (tx == NULL) return LuaCallbackError(luastate, "internal error: no tx"); @@ -101,6 +133,9 @@ static int HttpGetRequestLine(lua_State *luastate) static int HttpGetResponseLine(lua_State *luastate) { + if (!(LuaStateNeedProto(luastate, ALPROTO_HTTP))) + return LuaCallbackError(luastate, "error: protocol not http"); + htp_tx_t *tx = LuaStateGetTX(luastate); if (tx == NULL) return LuaCallbackError(luastate, "internal error: no tx"); @@ -114,6 +149,9 @@ static int HttpGetResponseLine(lua_State *luastate) static int HttpGetHeader(lua_State *luastate, int dir) { + if (!(LuaStateNeedProto(luastate, ALPROTO_HTTP))) + return LuaCallbackError(luastate, "error: protocol not http"); + htp_tx_t *tx = LuaStateGetTX(luastate); if (tx == NULL) return LuaCallbackError(luastate, "internal error: no tx"); @@ -148,6 +186,9 @@ static int HttpGetResponseHeader(lua_State *luastate) static int HttpGetRawHeaders(lua_State *luastate, int dir) { + if (!(LuaStateNeedProto(luastate, ALPROTO_HTTP))) + return LuaCallbackError(luastate, "error: protocol not http"); + htp_tx_t *tx = LuaStateGetTX(luastate); if (tx == NULL) return LuaCallbackError(luastate, "internal error: no tx"); @@ -182,6 +223,9 @@ static int HttpGetRawResponseHeaders(lua_State *luastate) static int HttpGetHeaders(lua_State *luastate, int dir) { + if (!(LuaStateNeedProto(luastate, ALPROTO_HTTP))) + return LuaCallbackError(luastate, "error: protocol not http"); + htp_tx_t *tx = LuaStateGetTX(luastate); if (tx == NULL) return LuaCallbackError(luastate, "internal error: no tx");