32 static const char htp_tx[] =
"suricata:http:tx";
38 static int LuaHttpGetTx(
lua_State *luastate)
48 struct LuaTx *ltx = (
struct LuaTx *)lua_newuserdata(luastate,
sizeof(*ltx));
55 luaL_getmetatable(luastate, htp_tx);
56 lua_setmetatable(luastate, -2);
61 static int LuaHttpGetRequestHost(
lua_State *luastate)
63 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
65 lua_pushnil(luastate);
70 bstr_len(htp_tx_request_hostname(
tx->tx)));
73 static int LuaHttpGetRequestUriRaw(
lua_State *luastate)
75 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
77 lua_pushnil(luastate);
82 luastate, bstr_ptr(htp_tx_request_uri(
tx->tx)), bstr_len(htp_tx_request_uri(
tx->tx)));
85 static int LuaHttpGetRequestUriNormalized(
lua_State *luastate)
87 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
89 lua_pushnil(luastate);
92 bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(
tx->tx);
94 if (request_uri_normalized == NULL || bstr_ptr(request_uri_normalized) == NULL ||
95 bstr_len(request_uri_normalized) == 0)
99 luastate, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
102 static int LuaHttpGetRequestLine(
lua_State *luastate)
104 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
106 lua_pushnil(luastate);
111 luastate, bstr_ptr(htp_tx_request_line(
tx->tx)), bstr_len(htp_tx_request_line(
tx->tx)));
114 static int LuaHttpGetResponseLine(
lua_State *luastate)
116 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
118 lua_pushnil(luastate);
123 bstr_len(htp_tx_response_line(
tx->tx)));
126 static int LuaHttpGetHeader(
lua_State *luastate,
int dir)
128 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
130 lua_pushnil(luastate);
140 const htp_header_t *h = NULL;
142 h = htp_tx_request_header(
tx->tx,
name);
144 h = htp_tx_response_header(
tx->tx,
name);
147 if (h == NULL || htp_header_value_len(h) == 0) {
154 static int LuaHttpGetRequestHeader(
lua_State *luastate)
156 return LuaHttpGetHeader(luastate, 0 );
159 static int LuaHttpGetResponseHeader(
lua_State *luastate)
161 return LuaHttpGetHeader(luastate, 1 );
164 static int LuaHttpGetRawHeaders(
lua_State *luastate,
int dir)
166 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
168 lua_pushnil(luastate);
180 if (raw == NULL || raw_len == 0)
186 static int LuaHttpGetRawRequestHeaders(
lua_State *luastate)
188 return LuaHttpGetRawHeaders(luastate, 0);
191 static int LuaHttpGetRawResponseHeaders(
lua_State *luastate)
193 return LuaHttpGetRawHeaders(luastate, 1);
196 static int LuaHttpGetHeaders(
lua_State *luastate,
int dir)
198 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
200 lua_pushnil(luastate);
204 const htp_headers_t *table = htp_tx_request_headers(
tx->tx);
206 table = htp_tx_response_headers(
tx->tx);
208 lua_pushnil(luastate);
212 lua_newtable(luastate);
213 const htp_header_t *h = NULL;
215 size_t no_of_headers = htp_headers_size(table);
216 for (; i < no_of_headers; i++) {
217 h = htp_headers_get_index(table, i);
220 lua_settable(luastate, -3);
226 static int LuaHttpGetRequestHeaders(
lua_State *luastate)
228 return LuaHttpGetHeaders(luastate, 0);
232 static int LuaHttpGetResponseHeaders(
lua_State *luastate)
234 return LuaHttpGetHeaders(luastate, 1);
237 static int LuaHttpGetBody(
lua_State *luastate,
int dir)
239 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
241 lua_pushnil(luastate);
253 if (body->
first == NULL) {
259 lua_newtable(luastate);
260 while (chunk != NULL) {
261 lua_pushinteger(luastate, index);
263 const uint8_t *data = NULL;
264 uint32_t data_len = 0;
268 lua_settable(luastate, -3);
275 lua_pushinteger(luastate, body->
first->
sbseg.stream_offset);
276 lua_pushinteger(luastate, body->
last->
sbseg.stream_offset + body->
last->
sbseg.segment_len);
283 static int LuaHttpGetRequestBody(
lua_State *luastate)
285 return LuaHttpGetBody(luastate, 0);
288 static int LuaHttpGetResponseBody(
lua_State *luastate)
290 return LuaHttpGetBody(luastate, 1);
293 static const struct luaL_Reg txlib[] = {
295 {
"request_header", LuaHttpGetRequestHeader},
296 {
"response_header", LuaHttpGetResponseHeader},
297 {
"request_line", LuaHttpGetRequestLine},
298 {
"response_line", LuaHttpGetResponseLine},
299 {
"request_headers_raw", LuaHttpGetRawRequestHeaders},
300 {
"response_headers_raw", LuaHttpGetRawResponseHeaders},
301 {
"request_uri_raw", LuaHttpGetRequestUriRaw},
302 {
"request_uri_normalized", LuaHttpGetRequestUriNormalized},
303 {
"request_headers", LuaHttpGetRequestHeaders},
304 {
"response_headers", LuaHttpGetResponseHeaders},
305 {
"request_host", LuaHttpGetRequestHost},
306 {
"request_body", LuaHttpGetRequestBody},
307 {
"response_body", LuaHttpGetResponseBody},
312 static const struct luaL_Reg htplib[] = {
314 {
"get_tx", LuaHttpGetTx },
321 luaL_newmetatable(luastate, htp_tx);
322 lua_pushvalue(luastate, -1);
323 lua_setfield(luastate, -2,
"__index");
324 luaL_setfuncs(luastate, txlib, 0);
325 luaL_newlib(luastate, htplib);