31 static const char htp_tx[] =
"suricata:http:tx";
37 static int LuaHttpGetTx(
lua_State *luastate)
47 struct LuaTx *ltx = (
struct LuaTx *)lua_newuserdata(luastate,
sizeof(*ltx));
54 luaL_getmetatable(luastate, htp_tx);
55 lua_setmetatable(luastate, -2);
60 static int LuaHttpGetRequestHost(
lua_State *luastate)
62 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
64 lua_pushnil(luastate);
67 const struct bstr *host = htp_tx_request_hostname(tx->
tx);
69 lua_pushnil(luastate);
76 static int LuaHttpGetRequestUriRaw(
lua_State *luastate)
78 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
80 lua_pushnil(luastate);
83 const struct bstr *uri = htp_tx_request_uri(tx->
tx);
85 lua_pushnil(luastate);
92 static int LuaHttpGetRequestUriNormalized(
lua_State *luastate)
94 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
96 lua_pushnil(luastate);
99 bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(
tx->tx);
101 if (request_uri_normalized == NULL || bstr_ptr(request_uri_normalized) == NULL ||
102 bstr_len(request_uri_normalized) == 0)
106 luastate, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
109 static int LuaHttpGetRequestLine(
lua_State *luastate)
111 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
113 lua_pushnil(luastate);
117 const struct bstr *line = htp_tx_request_line(tx->
tx);
119 lua_pushnil(luastate);
126 static int LuaHttpGetResponseLine(
lua_State *luastate)
128 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
130 lua_pushnil(luastate);
134 const struct bstr *line = htp_tx_response_line(tx->
tx);
136 lua_pushnil(luastate);
143 static int LuaHttpGetHeader(
lua_State *luastate,
int dir)
145 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
147 lua_pushnil(luastate);
157 const htp_header_t *h = NULL;
159 h = htp_tx_request_header(
tx->tx,
name);
161 h = htp_tx_response_header(
tx->tx,
name);
164 if (h == NULL || htp_header_value_len(h) == 0) {
171 static int LuaHttpGetRequestHeader(
lua_State *luastate)
173 return LuaHttpGetHeader(luastate, 0 );
176 static int LuaHttpGetResponseHeader(
lua_State *luastate)
178 return LuaHttpGetHeader(luastate, 1 );
181 static int LuaHttpGetRawHeaders(
lua_State *luastate,
int dir)
183 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
185 lua_pushnil(luastate);
197 if (raw == NULL || raw_len == 0)
203 static int LuaHttpGetRawRequestHeaders(
lua_State *luastate)
205 return LuaHttpGetRawHeaders(luastate, 0);
208 static int LuaHttpGetRawResponseHeaders(
lua_State *luastate)
210 return LuaHttpGetRawHeaders(luastate, 1);
213 static int LuaHttpGetHeaders(
lua_State *luastate,
int dir)
215 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
217 lua_pushnil(luastate);
221 const htp_headers_t *table = htp_tx_request_headers(
tx->tx);
223 table = htp_tx_response_headers(
tx->tx);
225 lua_pushnil(luastate);
229 lua_newtable(luastate);
230 const htp_header_t *h = NULL;
232 size_t no_of_headers = htp_headers_size(table);
233 for (; i < no_of_headers; i++) {
234 h = htp_headers_get_index(table, i);
237 lua_settable(luastate, -3);
243 static int LuaHttpGetRequestHeaders(
lua_State *luastate)
245 return LuaHttpGetHeaders(luastate, 0);
249 static int LuaHttpGetResponseHeaders(
lua_State *luastate)
251 return LuaHttpGetHeaders(luastate, 1);
254 static int LuaHttpGetBody(
lua_State *luastate,
int dir)
256 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
258 lua_pushnil(luastate);
270 if (body->
first == NULL) {
276 lua_newtable(luastate);
277 while (chunk != NULL) {
278 lua_pushinteger(luastate, index);
280 const uint8_t *data = NULL;
281 uint32_t data_len = 0;
285 lua_settable(luastate, -3);
292 lua_pushinteger(luastate, body->
first->
sbseg.stream_offset);
293 lua_pushinteger(luastate, body->
last->
sbseg.stream_offset + body->
last->
sbseg.segment_len);
300 static int LuaHttpGetRequestBody(
lua_State *luastate)
302 return LuaHttpGetBody(luastate, 0);
305 static int LuaHttpGetResponseBody(
lua_State *luastate)
307 return LuaHttpGetBody(luastate, 1);
310 static const struct luaL_Reg txlib[] = {
312 {
"request_header", LuaHttpGetRequestHeader},
313 {
"response_header", LuaHttpGetResponseHeader},
314 {
"request_line", LuaHttpGetRequestLine},
315 {
"response_line", LuaHttpGetResponseLine},
316 {
"request_headers_raw", LuaHttpGetRawRequestHeaders},
317 {
"response_headers_raw", LuaHttpGetRawResponseHeaders},
318 {
"request_uri_raw", LuaHttpGetRequestUriRaw},
319 {
"request_uri_normalized", LuaHttpGetRequestUriNormalized},
320 {
"request_headers", LuaHttpGetRequestHeaders},
321 {
"response_headers", LuaHttpGetResponseHeaders},
322 {
"request_host", LuaHttpGetRequestHost},
323 {
"request_body", LuaHttpGetRequestBody},
324 {
"response_body", LuaHttpGetResponseBody},
329 static const struct luaL_Reg htplib[] = {
331 {
"get_tx", LuaHttpGetTx },
338 luaL_newmetatable(luastate, htp_tx);
339 lua_pushvalue(luastate, -1);
340 lua_setfield(luastate, -2,
"__index");
341 luaL_setfuncs(luastate, txlib, 0);
342 luaL_newlib(luastate, htplib);