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);
182 if (raw == NULL || raw_len == 0)
188 static int LuaHttpGetRawRequestHeaders(
lua_State *luastate)
190 return LuaHttpGetRawHeaders(luastate, 0);
193 static int LuaHttpGetRawResponseHeaders(
lua_State *luastate)
195 return LuaHttpGetRawHeaders(luastate, 1);
198 static int LuaHttpGetHeaders(
lua_State *luastate,
int dir)
200 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
202 lua_pushnil(luastate);
206 const htp_headers_t *table = htp_tx_request_headers(
tx->tx);
208 table = htp_tx_response_headers(
tx->tx);
210 lua_pushnil(luastate);
214 lua_newtable(luastate);
215 const htp_header_t *h = NULL;
217 size_t no_of_headers = htp_headers_size(table);
218 for (; i < no_of_headers; i++) {
219 h = htp_headers_get_index(table, i);
222 lua_settable(luastate, -3);
228 static int LuaHttpGetRequestHeaders(
lua_State *luastate)
230 return LuaHttpGetHeaders(luastate, 0);
234 static int LuaHttpGetResponseHeaders(
lua_State *luastate)
236 return LuaHttpGetHeaders(luastate, 1);
239 static int LuaHttpGetBody(
lua_State *luastate,
int dir)
241 struct LuaTx *
tx = luaL_testudata(luastate, 1, htp_tx);
243 lua_pushnil(luastate);
257 if (body->
first == NULL) {
263 lua_newtable(luastate);
264 while (chunk != NULL) {
265 lua_pushinteger(luastate, index);
267 const uint8_t *data = NULL;
268 uint32_t data_len = 0;
272 lua_settable(luastate, -3);
279 lua_pushinteger(luastate, body->
first->
sbseg.stream_offset);
280 lua_pushinteger(luastate, body->
last->
sbseg.stream_offset + body->
last->
sbseg.segment_len);
287 static int LuaHttpGetRequestBody(
lua_State *luastate)
289 return LuaHttpGetBody(luastate, 0);
292 static int LuaHttpGetResponseBody(
lua_State *luastate)
294 return LuaHttpGetBody(luastate, 1);
297 static const struct luaL_Reg txlib[] = {
299 {
"request_header", LuaHttpGetRequestHeader},
300 {
"response_header", LuaHttpGetResponseHeader},
301 {
"request_line", LuaHttpGetRequestLine},
302 {
"response_line", LuaHttpGetResponseLine},
303 {
"request_headers_raw", LuaHttpGetRawRequestHeaders},
304 {
"response_headers_raw", LuaHttpGetRawResponseHeaders},
305 {
"request_uri_raw", LuaHttpGetRequestUriRaw},
306 {
"request_uri_normalized", LuaHttpGetRequestUriNormalized},
307 {
"request_headers", LuaHttpGetRequestHeaders},
308 {
"response_headers", LuaHttpGetResponseHeaders},
309 {
"request_host", LuaHttpGetRequestHost},
310 {
"request_body", LuaHttpGetRequestBody},
311 {
"response_body", LuaHttpGetResponseBody},
316 static const struct luaL_Reg htplib[] = {
318 {
"get_tx", LuaHttpGetTx },
325 luaL_newmetatable(luastate, htp_tx);
326 lua_pushvalue(luastate, -1);
327 lua_setfield(luastate, -2,
"__index");
328 luaL_setfuncs(luastate, txlib, 0);
329 luaL_newlib(luastate, htplib);