#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");
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");
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");
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");
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");
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");