diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/CMakeLists.txt | 15 | ||||
| -rw-r--r-- | test/new_http_service/adapter.cpp | 471 | ||||
| -rw-r--r-- | test/new_http_service/adapter.h | 112 | ||||
| -rw-r--r-- | test/new_http_service/http_request.lua | 87 | ||||
| -rw-r--r-- | test/new_http_service/http_response.lua | 57 | ||||
| -rw-r--r-- | test/test_coroutine/main.cpp | 226 | ||||
| -rw-r--r-- | test/test_coroutine/test.lua | 63 | ||||
| -rw-r--r-- | test/test_plugin/http_service.cpp | 183 | ||||
| -rw-r--r-- | test/test_plugin/http_service.h | 51 |
9 files changed, 0 insertions, 1265 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt deleted file mode 100644 index 5797582..0000000 --- a/test/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -### test_coroutine -add_executable(test_coroutine test_coroutine/main.cpp) -#target_include_directories(test_coroutine PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include) -target_link_libraries(test_coroutine lua-static dl) - - -### test_plugin -add_library(http_service SHARED test_plugin/http_service.cpp) -#target_include_directories(http_service PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include) -target_link_libraries(http_service MESA_handle_logger MESA_htable MESA_prof_load) - -### new_http_service -add_library(new_http_service SHARED new_http_service/adapter.cpp) -#target_include_directories(new_http_service PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include) -target_link_libraries(new_http_service lua-static dl MESA_handle_logger MESA_htable MESA_prof_load)
\ No newline at end of file diff --git a/test/new_http_service/adapter.cpp b/test/new_http_service/adapter.cpp deleted file mode 100644 index 4a6d64a..0000000 --- a/test/new_http_service/adapter.cpp +++ /dev/null @@ -1,471 +0,0 @@ -#include "adapter.h" - -//TODO: -//每个函数都要判断返回值 done -// lua错误处理,比如函数没有注册,resume的返回值判断然后打印错误, 不再resume该协程 done -//压栈之前要check_stack done -//流结束clear_ctx之外还要释放该协程,自动垃圾回收?做实验验证一下 done -//destroy,释放lua_state done -//多线程 m * n个虚拟机 -//dumpfile改成在线试一下 -//错误处理,日志, 工程化,日志完备 - -static void* g_logger = NULL; -static std::vector<std::vector<lua_State*>> g_http_lua_states; - -static void lua_traceback(const char *func_name, lua_State *lua_state, int ret){ - int n = lua_gettop(lua_state); - printf("%s error: ret is %d, traceback is:\n", func_name, ret); - for(int i = -1; i >= 0 - n; i--){ - std::string type = std::string(lua_typename(lua_state, lua_type(lua_state, i))); - if(type == "string"){ - printf("%s\n", lua_tostring(lua_state, i)); - } - } - lua_pop(lua_state, n); -} - -std::string _inet_ntoa(uint32_t ip) -{ - const char *_ip = inet_ntoa(*(struct in_addr *)&ip); - return std::string(_ip); -} - -//copy from suricata -static int lua_push_string_buffer(lua_State *lua_state, const char *input, size_t input_len) -{ - if (input_len % 4 != 0) { - /* we're using a buffer sized at a multiple of 4 as lua_pushlstring generates - * invalid read errors in valgrind otherwise. Adding in a nul to be sure. - * Buffer size = len + 1 (for nul) + whatever makes it a multiple of 4 */ - size_t buflen = input_len + 1 + ((input_len + 1) % 4); - char buf[buflen]; - memset(buf, 0x00, buflen); - memcpy(buf, input, input_len); - buf[input_len] = '\0'; - /* return value through lua_state, as a luastring */ - lua_pushlstring(lua_state, buf, input_len); - } else { - lua_pushlstring(lua_state, input, input_len); - } - return 1; -} - -static int get_stream_tuple5(lua_State *lua_state){ - lua_getglobal(lua_state, "cur_http_sess_ctx"); - http_sess_ctx *sess_ctx = (http_sess_ctx *)lua_touserdata(lua_state, -1); - lua_pop(lua_state, 1); - if(sess_ctx == NULL){ - //do log - std::cout<<"sess_ctx is null"<<std::endl; - return -1; - } - stream_tuple5& tuple5 = sess_ctx->tuple5; - if(tuple5.parse_done == true){ - lua_newtable(lua_state); - lua_push_string_buffer(lua_state, "ip_version", std::string("ip_version").length()); - lua_push_string_buffer(lua_state, tuple5.ip_version.c_str(), tuple5.ip_version.length()); - lua_settable(lua_state, -3); - lua_push_string_buffer(lua_state, "stream_type", std::string("stream_type").length()); - lua_push_string_buffer(lua_state, tuple5.stream_type.c_str(), tuple5.stream_type.length()); - lua_settable(lua_state, -3); - lua_push_string_buffer(lua_state, "sip", std::string("sip").length()); - lua_push_string_buffer(lua_state, tuple5.sip.c_str(), tuple5.sip.length()); - lua_settable(lua_state, -3); - lua_push_string_buffer(lua_state, "dip", std::string("dip").length()); - lua_push_string_buffer(lua_state, tuple5.dip.c_str(), tuple5.dip.length()); - lua_settable(lua_state, -3); - lua_push_string_buffer(lua_state, "sport", std::string("sport").length()); - lua_pushinteger(lua_state, tuple5.sport); - lua_settable(lua_state, -3); - lua_push_string_buffer(lua_state, "dport", std::string("dport").length()); - lua_pushinteger(lua_state, tuple5.dport); - lua_settable(lua_state, -3); - return 0; - } - return -1; -} - -static int _get_stream_info(lua_State *lua_state, int status, lua_KContext yieldk_ctx){ - int ret = get_stream_tuple5(lua_state); - if(ret < 0){ - lua_yieldk(lua_state, 0, 0, _get_stream_info); - } - return 1; -} - -static int get_stream_info(lua_State* lua_state){ - //printf("call get_strem_info\n"); - return _get_stream_info(lua_state, 0, 0); -} - -static int get_http_header(lua_State *lua_state, int type){ - lua_getglobal(lua_state, "cur_http_sess_ctx"); - http_sess_ctx *sess_ctx = (http_sess_ctx *)lua_touserdata(lua_state, -1); - lua_pop(lua_state, 1); - if(sess_ctx == NULL){ - //do log - std::cout<<"sess_ctx is null"<<std::endl; - return -1; - } - std::unordered_set<std::string> required_regions; - lua_pushnil(lua_state); - while(lua_next(lua_state, -2) != 0){ - required_regions.insert(std::string(lua_tostring(lua_state, -1))); - lua_pop(lua_state, 1); - } - http_header& header = (type == HTTP_TYPE_REQUEST ? sess_ctx->req_header : sess_ctx->resp_header); - if(header.parse_done == true){ - //printf("header parse done\n"); - lua_newtable(lua_state); - for(auto region : header.std_regions){ - if(required_regions.find("ALL") != required_regions.end() || required_regions.find(region.first) != required_regions.end()){ - lua_push_string_buffer(lua_state, region.first.c_str(), region.first.length()); - lua_push_string_buffer(lua_state, region.second.c_str(), region.second.length()); - lua_settable(lua_state, -3); - } - } - if(!header.other_regions.empty()){ - if(required_regions.find("ALL") != required_regions.end() || required_regions.find("HTTP_OTHER_REGIONS") != required_regions.end()){ - lua_push_string_buffer(lua_state, "HTTP_OTHER_REGIONS", std::string("HTTP_OTHER_REGIONS").length()); - lua_newtable(lua_state); - int i = 1; - for(auto region : header.other_regions){ - lua_push_string_buffer(lua_state, region.c_str(), region.length()); - lua_rawseti(lua_state, -2, i++); - } - lua_settable(lua_state, -3); - } - } - return 0; - } - return -1; -} - -static int _get_http_request_header(lua_State *lua_state, int status, lua_KContext yieldk_ctx){ - //printf("call get_http_request_header\n"); - int ret = get_http_header(lua_state, HTTP_TYPE_REQUEST); - if(ret < 0){ - lua_yieldk(lua_state, 0, 0, _get_http_request_header); - } - return 1; -} - -static int get_http_request_header(lua_State* lua_state){ - return _get_http_request_header(lua_state, 0, 0); -} - -static int _get_http_response_header(lua_State *lua_state, int status, lua_KContext yieldk_ctx){ - int ret = get_http_header(lua_state, HTTP_TYPE_RESPONSE); - if(ret < 0){ - lua_yieldk(lua_state, 0, 0, _get_http_response_header); - } - return 1; -} - -static int get_http_response_header(lua_State* lua_state){ - return _get_http_response_header(lua_state, 0, 0); -} - -static int get_http_body(lua_State *lua_state, int type){ - //printf("call _get_http_response_body\n"); - lua_getglobal(lua_state, "cur_http_sess_ctx"); - http_sess_ctx *sess_ctx = (http_sess_ctx *)lua_touserdata(lua_state, -1); - lua_pop(lua_state, 1); - if(sess_ctx == NULL){ - //do log - std::cout<<"sess_ctx is null"<<std::endl; - return -1; - } - http_body& body = (type == HTTP_TYPE_REQUEST? sess_ctx->req_body : sess_ctx->resp_body); - if(body.data_end == true || body.buf != nullptr){ - lua_newtable(lua_state); - lua_push_string_buffer(lua_state, "block_id", std::string("block_id").length()); - lua_pushinteger(lua_state, body.block_id); - lua_settable(lua_state, -3); - lua_push_string_buffer(lua_state, "data_end", std::string("data_end").length()); - lua_pushboolean(lua_state, body.data_end); - lua_settable(lua_state, -3); - lua_push_string_buffer(lua_state, "buf", std::string("buf").length()); - lua_pushlightuserdata(lua_state, body.buf); - lua_settable(lua_state, -3); - lua_push_string_buffer(lua_state, "buflen", std::string("buflen").length()); - lua_pushinteger(lua_state, body.buflen); - lua_settable(lua_state, -3); - body.buf = nullptr; - body.buflen = 0; - return 0; - } - return -1; -} - -static int _get_http_request_body(lua_State *lua_state, int status, lua_KContext yieldk_ctx){ - int ret = get_http_body(lua_state, HTTP_TYPE_REQUEST); - if(ret < 0){ - lua_yieldk(lua_state, 0, 0, _get_http_request_body); - } - return 1; -} - -static int get_http_request_body(lua_State* lua_state){ - return _get_http_request_body(lua_state, 0, 0); -} - -static int _get_http_response_body(lua_State *lua_state, int status, lua_KContext yieldk_ctx){ - int ret = get_http_body(lua_state, HTTP_TYPE_RESPONSE); - if(ret < 0){ - lua_yieldk(lua_state, 0, 0, _get_http_response_body); - } - return 1; -} - -static int get_http_response_body(lua_State* lua_state){ - return _get_http_response_body(lua_state, 0, 0); -} - - -static int load_lua_http_plug(const char *profile, int thread_num){ - const char *section = "main"; - char file_path[LUA_SAPP_PATH_MAX] = ""; - char entry_type[LUA_SAPP_SYMBOL_MAX] = ""; - MESA_load_profile_string_def(profile, section, "file_path", file_path, sizeof(file_path), ""); - MESA_load_profile_string_def(profile, section, "entry_type", entry_type, sizeof(entry_type), ""); - printf("MESA_prof_load: profile is %s, section is %s, file_path is %s, entry_type is %s\n", - profile, section, file_path, entry_type); - if(strncmp(entry_type, "http", LUA_SAPP_SYMBOL_MAX) == 0){ - for(int i = 0; i < thread_num; i++){ - lua_State *lua_state = luaL_newstate(); - if(lua_state == NULL){ - printf("failed to LuaL_newstate\n"); - return -1; - } - luaL_openlibs(lua_state); - int ret = luaL_dofile(lua_state, file_path); - if(ret){ - //log error - printf("error: ret is %d, file_path is %s\n", ret, file_path); - return -1; - } - lua_register(lua_state, "get_stream_info", get_stream_info); - lua_register(lua_state, "get_http_request_header", get_http_request_header); - lua_register(lua_state, "get_http_response_header", get_http_response_header); - lua_register(lua_state, "get_http_request_body", get_http_request_body); - lua_register(lua_state, "get_http_response_body", get_http_response_body); - g_http_lua_states[i].push_back(lua_state); - } - } - return 0; -} - -static int process_lua_plug_conflist(const char* filename, int thread_num) -{ - char lua_plug_conf_path[LUA_SAPP_PATH_MAX] = {0}; - FILE* fp = fopen(filename, "r"); - if(fp == NULL){ - MESA_handle_runtime_log(g_logger, RLOG_LV_FATAL, LOG_MODULE_NAME, "process_conflist() fopen %s error!\n", filename); - return -1; - } - while(feof(fp) == 0){ - if((fgets(lua_plug_conf_path, LUA_SAPP_PATH_MAX, fp)) == NULL){ - fclose(fp); - fp=NULL; - return 0; - } - if(lua_plug_conf_path[0]=='#'){ - continue; - } - int len = strnlen(lua_plug_conf_path, LUA_SAPP_PATH_MAX); - lua_plug_conf_path[len - 1] = '\0'; - int ret = load_lua_http_plug(lua_plug_conf_path, thread_num); - if(ret < 0){ - printf("failed to load_lua_plug: conf_path is %s\n", lua_plug_conf_path); - } - } - fclose(fp); - fp=NULL; - return 0; -} - -static http_sess_ctx* init_http_sess_ctx(int thread_seq){ - http_sess_ctx *ctx = new http_sess_ctx(); - for(lua_State *lua_state : g_http_lua_states[thread_seq]){ - lua_State* coroutine = lua_newthread(lua_state); - int ret = lua_checkstack(lua_state, 1); - if(ret != 1){ - //do log - printf("do not have enough space, ret is %d\n", ret); - continue; - } - ctx->coroutines.push_back(coroutine); - } - return ctx; -} - -static void clear_http_sess_ctx(http_sess_ctx *ctx){ - delete ctx; - ctx = NULL; -} - - -std::string utils_inet_ntoa(uint32_t ip) -{ - const char *_ip = inet_ntoa(*(struct in_addr *)&ip); - return std::string(_ip); -} - -uchar NEW_HTTP_SERVICE_ENTRY(stSessionInfo* session_info, void **param, int thread_seq, struct streaminfo *a_tcp, void *a_packet){ - //printf("thread_seq is %d\n", thread_seq); - uchar ret = PROT_STATE_GIVEME; - http_sess_ctx *ctx = (http_sess_ctx*)*param; - http_infor *a_http = (http_infor *)(session_info->app_info); - bool stream_begin = false; - if(session_info == nullptr){ - return PROT_STATE_DROPME; - } - if(ctx == nullptr){ - ctx = init_http_sess_ctx(thread_seq); - *param = ctx; - stream_begin = true; - } - if(ctx->tuple5.parse_done == false){ - struct stream_tuple4_v4 *tuple4_v4 = a_tcp->addr.tuple4_v4; - ctx->tuple5.ip_version = "IPV4"; - if(a_tcp->type == STREAM_TYPE_TCP){ - ctx->tuple5.stream_type = "TCP"; - } - if(a_tcp->type == STREAM_TYPE_UDP){ - ctx->tuple5.stream_type = "UDP"; - } - ctx->tuple5.sip = utils_inet_ntoa(tuple4_v4->saddr); - ctx->tuple5.dip = utils_inet_ntoa(tuple4_v4->daddr); - ctx->tuple5.sport = ntohs(tuple4_v4->source); - ctx->tuple5.dport = ntohs(tuple4_v4->dest); - ctx->tuple5.parse_done = true; - } - uchar curdir = a_http->curdir; - switch(session_info->prot_flag) - { - case HTTP_STATE: - case HTTP_CONTENT: - break; - case HTTP_UNGZIP_CONTENT: - if(curdir == DIR_C2S){ - ctx->req_body.block_id++; - ctx->req_body.buf = session_info->buf; - ctx->req_body.buflen = session_info->buflen; - } - if(curdir == DIR_S2C){ - ctx->resp_body.block_id++; - ctx->resp_body.buf = session_info->buf; - ctx->resp_body.buflen = session_info->buflen; - } - break; - default: - std::string key(http_proto_flag2region(session_info->prot_flag)); - std::string value((const char*)(session_info->buf), session_info->buflen); - if(curdir == DIR_C2S){ - if(key == "HTTP_OTHER_REGIONS"){ - ctx->req_header.other_regions.insert(value); - } - else{ - ctx->req_header.std_regions.insert({key, value}); - } - } - else{ - if(key == "HTTP_OTHER_REGIONS"){ - ctx->resp_header.other_regions.insert(value); - } - else{ - ctx->resp_header.std_regions.insert({key, value}); - } - } - break; - } - uchar http_state = a_http->http_state; - //printf("curdir is %d, http_state is %d\n", curdir, http_state); - //header over - if(http_state == HTTP_DATA_BEGIN){ - if(curdir == DIR_C2S){ - ctx->req_header.parse_done = true; - } - if(curdir == DIR_S2C){ - ctx->resp_header.parse_done = true; - } - } - //data over - if(http_state == HTTP_DATA_END){ - if(curdir == DIR_C2S){ - ctx->req_body.data_end = true; - } - if(curdir == DIR_S2C){ - ctx->resp_body.data_end = true; - } - } - //resume coroutine - for(lua_State*& coroutine : ctx->coroutines){ - if(coroutine == nullptr){ - continue; - } - /* - int ret = lua_checkstack(coroutine, 1); - if(ret != 1){ - //do log - printf("do not have enough space, ret is %d\n", ret); - continue; - } - */ - lua_pushlightuserdata(coroutine, (void *)ctx); - lua_setglobal(coroutine, "cur_http_sess_ctx"); - if(stream_begin){ - lua_getglobal(coroutine, "process"); - } - ret = lua_resume(coroutine, NULL, 0); - if(ret == LUA_OK){ - coroutine = nullptr; - continue; - } - if(ret != LUA_YIELD){ - lua_traceback("lua_resume", coroutine, ret); - coroutine = nullptr; - } - } - if(session_info->session_state & SESSION_STATE_CLOSE){ - //printf("close tcp stream\n"); - clear_http_sess_ctx(ctx); - *param = NULL; - } - return ret; -} - -int NEW_HTTP_SERVICE_INIT(void){ - /* - g_logger = MESA_create_runtime_log_handle("./log/http/http_service", 10); - if(g_logger == NULL){ - printf("%s init : get log handle error!\n", HTTP_SERVICE_PLUGNAME); - return -1; - } - */ - int thread_num = 1; - const char *profile = "./conf/main.conf"; - const char *section = "Module"; - MESA_load_profile_int_def(profile, section, "threadnum", (int*)&thread_num, 0); - printf("MESA_prof_load: profile is %s, section is %s, thread_num is %d\n", profile, section, thread_num); - for(int i = 0; i < thread_num; i++){ - g_http_lua_states.push_back(std::vector<lua_State*>()); - } - - // get all business lua script which register http - const char *conflist_path = "./plug/lua/conflist_lua.inf"; - process_lua_plug_conflist(conflist_path, thread_num); - return 0; -} - -void NEW_HTTP_SERVICE_DESTROY(void){ - for(auto states : g_http_lua_states){ - for(auto state : states){ - lua_close(state); - } - } - return; -} - diff --git a/test/new_http_service/adapter.h b/test/new_http_service/adapter.h deleted file mode 100644 index 1c4a790..0000000 --- a/test/new_http_service/adapter.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * HTTP_Service.h - * - * Created on: 2013-8-19 - * Author: lishu - */ - -#ifndef HTTP_SERVICE_H_ -#define HTTP_SERVICE_H_ - -#include <iostream> -#include <string> -#include <vector> -#include <unordered_map> -#include <unordered_set> - -#include <stdio.h> -#include <string.h> -#include <pthread.h> -#include <time.h> -#include <sys/ioctl.h> -#include <sys/socket.h> -#include <arpa/inet.h> -#include <unistd.h> -#include <ctype.h> -#include <stdlib.h> -#include <regex.h> -#include "stream.h" -#include "http.h" -#include "MESA/MESA_prof_load.h" -#include "MESA/MESA_handle_logger.h" - -extern "C" { - #include "lua.h" - #include "lualib.h" - #include "lauxlib.h" -} -#define HTTP_SERVICE_PLUGNAME "new_http_service.so" -#define LOG_PATH "./log/new_http_service/" - -#define LOG_MODULE_NAME "SAPP_LUA" -#define LUA_SAPP_SYMBOL_MAX 64 -#define LUA_SAPP_PATH_MAX 256 -#define LUA_SAPP_STRING_MAX 2048 -#define LUA_ENTRY_TYPE_NUM 8 -enum lua_entry_type{ - LUA_ENTRY_TYPE_IP = 0, - LUA_ENTRY_TYPE_TCP, - LUA_ENTRY_TYPE_UDP, - LUA_ENTRY_TYPE_HTTP, - LUA_ENTRY_TYPE_TLS, - LUA_ENTRY_TYPE_DNS, - LUA_ENTRY_TYPE_MAIL, - LUA_ENTRY_TYPE_FTP -}; - -enum http_type{ - HTTP_TYPE_REQUEST = 0, - HTTP_TYPE_RESPONSE -}; -class http_header{ -public: - bool parse_done; - std::unordered_map<std::string, std::string> std_regions; - std::unordered_set<std::string> other_regions; - http_header() : parse_done(false){} -}; - -class http_body{ -public: - bool data_end; - int block_id; - void *buf; - int buflen; - http_body() : data_end(false), block_id(-1), buf(nullptr), buflen(0){} -}; - -class stream_tuple5{ -public: - bool parse_done; - std::string ip_version; //IPV4 or IPV6 - std::string stream_type; //TCP or UDP - std::string sip; - std::string dip; - uint16_t sport; - uint16_t dport; - stream_tuple5() : parse_done(false){} -}; - -class http_sess_ctx{ -public: - stream_tuple5 tuple5; - http_header req_header; - http_header resp_header; - http_body req_body; - http_body resp_body; - std::vector<lua_State*> coroutines; -}; - -#ifdef __cplusplus -extern "C" { -#endif - -uchar NEW_HTTP_SERVICE_ENTRY(stSessionInfo* session_info, void **param, int thread_seq, struct streaminfo *a_tcp, void *a_packet); -int NEW_HTTP_SERVICE_INIT(void); -void NEW_HTTP_SERVICE_DESTROY(void); - -#ifdef __cplusplus -} -#endif - -#endif /* HTTP_SERVICE_H_ */ diff --git a/test/new_http_service/http_request.lua b/test/new_http_service/http_request.lua deleted file mode 100644 index 8cc212e..0000000 --- a/test/new_http_service/http_request.lua +++ /dev/null @@ -1,87 +0,0 @@ - -function printf(s,...) - io.write(s:format(...)) - io.flush() -end - -function format_write_file(file, s, ...) - file:write(s:format(...)) - file:flush() -end - -function init() - ---init something -end - -function print_header(header) - for k, v in pairs(header) do - if k == "HTTP_OTHER_REGIONS" then - format_write_file(file, "%s: ", k) - for k, v in pairs(header["HTTP_OTHER_REGIONS"]) do - format_write_file(file, "{%s} ", v) - end - format_write_file(file, "\n") - else - format_write_file(file, "%s: %s\n", k, v) - end - end -end - -function process() - printf("\nprint stream: \n") - stream_info = get_stream_info() - for k, v in pairs(stream_info) do - printf("%s: %s\n", k, v) - end - - printf("\nprint header:\n") - local regions = {"ALL"} - header = get_http_request_header(regions) - for k, v in pairs(header) do - printf("%s: %s\n", k, v) - end - - printf("\nprint body: \n") - while true do - body = get_http_request_body() - for k, v in pairs(body) do - printf("%s: %s\n", k, v) - end - if body['data_end'] == true then - break - end - end - - --[[ - file = io.open("./log/lua/http_request.log", "a+") - format_write_file(file, "lua: call process\n") - - format_write_file(file, "\nprint stream info: \n") - stream_info = get_stream_info() - for k, v in pairs(stream_info) do - format_write_file(file, "%s: %s\n", k, v) - end - - format_write_file(file, "\nprint request headers: \n") - local req_regions = {"HTTP_HOST", "HTTP_REQ_LINE", "HTTP_OTHER_REGIONS"} - req_header = get_http_request_header(req_regions) - print_header(req_header) - - - format_write_file(file, "\nprint request body: \n") - while true do - body = get_http_request_body() - for k, v in pairs(body) do - format_write_file(file, "%s: %s\n", k, v) - end - if body['data_end'] == true then - format_write_file(file, "request body end\n") - break - end - format_write_file(file, "\n"); - end - format_write_file(file, "\nlua: process end\n") - io.close(file) - ]] - -end
\ No newline at end of file diff --git a/test/new_http_service/http_response.lua b/test/new_http_service/http_response.lua deleted file mode 100644 index ed6b6df..0000000 --- a/test/new_http_service/http_response.lua +++ /dev/null @@ -1,57 +0,0 @@ - -function printf(s,...) - io.write(s:format(...)) - io.flush() -end - -function format_write_file(file, s, ...) - file:write(s:format(...)) - file:flush() -end - -function init() - ---init something -end - -function print_header(header) - for k, v in pairs(header) do - if k == "HTTP_OTHER_REGIONS" then - format_write_file(file, "%s: ", k) - for k, v in pairs(header["HTTP_OTHER_REGIONS"]) do - format_write_file(file, "{%s} ", v) - end - format_write_file(file, "\n") - else - format_write_file(file, "%s: %s\n", k, v) - end - end -end - -function process() - file = io.open("./log/lua/http_response.log", "a+") - format_write_file(file, "lua: call process\n") - - format_write_file(file, "\nprint stream info: \n") - stream_info = get_stream_info() - for k, v in pairs(stream_info) do - format_write_file(file, "%s: %s\n", k, v) - end - - local resp_regions = {"HTTP_SERVER", "HTTP_RES_LINE", "HTTP_OTHER_REGIONS"} - format_write_file(file, "\nprint response headers: \n") - resp_header = get_http_response_header(resp_regions) - print_header(resp_header) - - format_write_file(file, "\nprint response body: \n") - while true do - body = get_http_response_body() - for k, v in pairs(body) do - format_write_file(file, "%s: %s\n", k, v) - end - if body['data_end'] == true then - format_write_file(file, "response body end\n") - break - end - end - format_write_file(file, "\nlua: process end\n") -end
\ No newline at end of file diff --git a/test/test_coroutine/main.cpp b/test/test_coroutine/main.cpp deleted file mode 100644 index 77c258c..0000000 --- a/test/test_coroutine/main.cpp +++ /dev/null @@ -1,226 +0,0 @@ -#include <iostream> -#include <cstring> -#include <stdio.h> -#include <stdlib.h> -#include <vector> -#include <unordered_set> -#include <unistd.h> -using namespace std; -extern "C" { - #include "lua.h" - #include "lualib.h" - #include "lauxlib.h" -} - -static void output_stack_size(lua_State *L, int line){ - int n = lua_gettop(L); - printf("line %d: stack size is %d\n", line, n); - for(int i = -1; i >= 0 - n; i--){ - string type = string(lua_typename(L, lua_type(L, i))); - string value = "unknown"; - if(type == "string"){ - value = lua_tostring(L, i); - } - printf("index is %d, type is %s, value is %s\n", i, type.c_str(), value.c_str()); - } -} - - -static void lua_traceback(const char *func_name, lua_State *L){ - int n = lua_gettop(L); - printf("%s error: stack size is %d, traceback is:\n", func_name, n); - for(int i = -1; i >= 0 - n; i--){ - string type = string(lua_typename(L, lua_type(L, i))); - if(type == "string"){ - printf("%s\n", lua_tostring(L, i)); - } - } - lua_pop(L, n); -} - -//copy from suricata -static int lua_push_string_buffer(lua_State *lua_state, const char *input, size_t input_len) -{ - if (input_len % 4 != 0) { - /* we're using a buffer sized at a multiple of 4 as lua_pushlstring generates - * invalid read errors in valgrind otherwise. Adding in a nul to be sure. - * Buffer size = len + 1 (for nul) + whatever makes it a multiple of 4 */ - size_t buflen = input_len + 1 + ((input_len + 1) % 4); - char buf[buflen]; - memset(buf, 0x00, buflen); - memcpy(buf, input, input_len); - buf[input_len] = '\0'; - /* return value through lua_state, as a luastring */ - lua_pushlstring(lua_state, buf, input_len); - } else { - lua_pushlstring(lua_state, input, input_len); - } - return 1; -} - -static void test_coroutine(int argc, char *argv[]){ - int max_state_num = 10; - int max_coroutine_num = 100; - if(argc > 2){ - max_state_num = atoi(argv[1]); - max_coroutine_num = atoi(argv[2]); - } - const char *filename = "../../test/test_coroutine/test.lua"; - vector<lua_State*> states; - for(int i = 0; i < max_state_num; i++){ - lua_State *L = luaL_newstate(); - luaL_openlibs(L); - luaL_dofile(L, filename); - states.push_back(L); - } - vector<pair<lua_State*, lua_State*>> coroutines; - for(auto state : states){ - int i = 0; - for(; i < max_coroutine_num; i++){ - lua_State* l = lua_newthread(state); - int ret = lua_checkstack(state, 1); - if(ret != 1) - printf("do not have enough space, ret is %d\n", ret); - coroutines.push_back({l, state}); - lua_getglobal(l, "test"); - //cout<<"after getglobal, size = "<<lua_gettop(l)<<endl; - lua_pushinteger(l, i); - //cout<<"after pushinterger, size = "<<lua_gettop(l)<<endl; - lua_resume(l, state, 1); - //cout<<"after resume, size = "<<lua_gettop(L)<<endl; - } - } - sleep(2); - cout<<"coroutine size: "<<coroutines.size()<<endl; - while(true){ - for(auto coroutine : coroutines){ - lua_resume(coroutine.first, coroutine.second, 0); - } - } -} - - -static int foo (lua_State *L) { - cout<<"call foo"<<endl; - output_stack_size(L, 84); - lua_Number sum = 0.0; - int n = lua_gettop(L); - for (int i = 1; i <= n; i++) { - if (!lua_isnumber(L, i)) { - printf("index %d is not number\n", i); - //lua_pushliteral(L, "incorrect argument"); - //lua_error(L); - } - sum += lua_tonumber(L, i); - } - printf("sum is %f\n", sum); - lua_pop(L, n); - output_stack_size(L, 97); - lua_pushnumber(L, sum/n); //first result - lua_pushnumber(L, sum); //second result - output_stack_size(L, 100); - return 2; //number of results -} - -static int foo2(lua_State *L, int n, long int m){ - cout<<"cpp: after lua_yield"<<endl; - return 0; -} - -int flag = 0; - -static int _foo1(lua_State *L, int status, lua_KContext yieldk_ctx){ - printf("call foo1\n"); - output_stack_size(L, 121); - /* - unordered_set<string> regions; - output_stack_size(L); - lua_pushnil(L); - while(lua_next(L, -2) != 0){ - printf("%s - %s\n", lua_typename(L, lua_type(L, -2)), lua_typename(L, lua_type(L, -1))); - regions.insert(string(lua_tostring(L, -1))); - lua_pop(L, 1); - } - for(auto region : regions) - cout<<region<<endl; - output_stack_size(L); - */ - //lua_pop(L, 1); - if(flag == 1){ - lua_newtable(L); - lua_push_string_buffer(L, "name", 4); - lua_newtable(L); - lua_push_string_buffer(L, "leo", 3); - lua_rawseti(L, -2, 1); - lua_push_string_buffer(L, "cui", 3); - lua_rawseti(L, -2, 2); - lua_settable(L, -3); - return 1; - } - lua_yieldk(L, 0, 0, _foo1); -} - -static int foo1(lua_State *L){ - return _foo1(L, 0, 0); - /* - lua_getglobal(L, "g_http_sess_ctx"); - output_stack_size(L); - int *ctx = (int *)lua_touserdata(L, 1); - if(ctx == NULL) - cout<<"ctx is null"<<endl; - else - cout<<"ctx is "<<*ctx<<endl; - cout<<"cpp: call foo1"<<endl; - */ - //lua_yieldk(L, 0, 0, foo2); -} - -static void test_lua_CFunction(){ - const char *filename = "../../test/test_coroutine/test.lua"; - lua_State *L = luaL_newstate(); - luaL_openlibs(L); - int ret = luaL_dofile(L, filename); - printf("luaL_dofile, ret is %d\n", ret); - lua_register(L, "myfoo", foo1); - lua_getglobal(L, "lua_call_c"); - /* - output_stack_size(L); - lua_getglobal(L, "lua_call_c"); - output_stack_size(L); - int *ctx = (int *)malloc(sizeof(int)); - *ctx = 3; - lua_pushlightuserdata(L, (void *)ctx); - output_stack_size(L); - lua_setglobal (L, "g_http_sess_ctx"); - output_stack_size(L); - //output_stack_size(L); - //lua_pushinteger(L, 2); - //lua_pushinteger(L, 3); - */ - //output_stack_size(L); - - ret = lua_resume(L, NULL, 0); - if(ret != LUA_OK && ret != LUA_YIELD){ - lua_traceback("lua_resume", L); - return; - } - printf("lua resume: ret is %d\n", ret); - //output_stack_size(L, 190); - //flag = 1; - - ret = lua_resume(L, NULL, 0); - printf("lua resume: ret is %d\n", ret); - output_stack_size(L, 194); - - - //printf("lua_resume: ret is %d\n", ret); - //cout<<"cpp: atfer lua_call"<<endl; - //lua_resume(L, NULL, 0); -} - - -int main(int argc, char *argv[]){ - //test_coroutine(argc, argv); - test_lua_CFunction(); - return 0; -}
\ No newline at end of file diff --git a/test/test_coroutine/test.lua b/test/test_coroutine/test.lua deleted file mode 100644 index c3717a6..0000000 --- a/test/test_coroutine/test.lua +++ /dev/null @@ -1,63 +0,0 @@ - -function printf(s,...) - io.write(s:format(...)) -end - -format_write = function(file, s, ...) - return file:write(s:format(...)) - end - -function test(id) - i = 0 - local j = 1 - while true do - if j % 10000 == 5 and id % 10000 == 5 then - printf("call test, coroutine id: %d, local index: %d, global index: %d\n", id, j, i) - end - j = j + 1 - i = i + 1 - coroutine.yield() - end -end - -function foo(x) - if x % 10000 == 5 then - printf("cal foo: x = %d\n", x) - end - coroutine.yield() -end - -function foo1() - print("call foo1") - foo(10) - return 3 -end - -function main() - n = 10000000 - co_list = {} - for i = n, 1, -1 do - co = coroutine.create(function (i) - foo(i) - end) - table.insert(co_list, co); - end - while(true) do - for i = 1, #co_list do - coroutine.resume(co_list[i], i) - end - end -end - -function lua_call_c() - ---printf("lua: call lua_call_c\n") - t = {"aa", "bb", "cc"} - file = io.open("./output.txt", "a+") - format_write(file, "%s: %d", "age", 12) - ret = myfoo(t) - for k, v in pairs(ret["name"]) do - print(k, v) - end - ---printf("lua: after my_foo\n") -end - diff --git a/test/test_plugin/http_service.cpp b/test/test_plugin/http_service.cpp deleted file mode 100644 index 40766d6..0000000 --- a/test/test_plugin/http_service.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* - * HTTP_Service.c - * - * Created on: 2013-8-19 - * Author: lishu - */ - -#include <math.h> -#include <pthread.h> -#include <time.h> -#include <arpa/inet.h> -#include <stdio.h> -#include <regex.h> -#include <string> -#include "http_service.h" -#include "MESA_handle_logger.h" - -int HTTP_SERVICE_VERSION_1_20160412 = 0; -void http_service_version_1_20160412() -{ - //20160412 create project -} - -void* g_log_handle = NULL; - -int init_pmeinfo(service_pmeinfo **service_pme, int thread_seq) -{ - service_pmeinfo* pme = (service_pmeinfo*)dictator_malloc(thread_seq, sizeof(service_pmeinfo)); - *service_pme = pme; - return 0; -} - -void clear_pmeinfo(service_pmeinfo *service_pme, int thread_seq) -{ - if(service_pme!=NULL) - { - dictator_free(thread_seq, service_pme); - } - service_pme = NULL; -} - -std::string trans_to_binary(unsigned int n){ - std::string res; - while(n){ - res = std::to_string(n % 2) + res; - n /= 2; - } - return res; -} - -std::string _inet_ntoa(uint32_t ip) -{ - const char *_ip = inet_ntoa(*(struct in_addr *)&ip); - return std::string(_ip); -} - - -static int get_stream_tuple4(struct streaminfo *a_tcp){ - struct stream_tuple4_v4 *tuple4_v4 = a_tcp->addr.tuple4_v4; - printf("saddr: %s\n", _inet_ntoa(tuple4_v4->saddr).c_str()); - printf("daddr: %s\n", _inet_ntoa(tuple4_v4->daddr).c_str()); - printf("source: %d\n", ntohs(tuple4_v4->source)); - printf("dest: %d\n", ntohs(tuple4_v4->dest)); - return 0; -} - -uchar HTTP_SERVICE_ENTRY(stSessionInfo* session_info, void **param, int thread_seq, struct streaminfo *a_tcp, void *a_packet) -{ - //get_stream_tuple4(a_tcp); - uchar rec = PROT_STATE_GIVEME; - service_pmeinfo *service_pme = (service_pmeinfo*)*param; - http_infor *a_http = (http_infor *)(session_info->app_info); - char filename[512] = {0}; - const char* region = NULL; - //static int header_len = 0; - //static int content_len = 0; - - uchar http_state = a_http->http_state; - - if(NULL==session_info) - { - return PROT_STATE_DROPME; - } - - if(service_pme == NULL) - { - if(init_pmeinfo(&service_pme, thread_seq) <0) - { - return PROT_STATE_DROPME; - } - *param = service_pme; - } - std::string prot_flag_str = trans_to_binary(session_info->prot_flag); - uchar curdir = a_http->curdir; - printf("curdir is %d, http_state is %d\n", curdir, http_state); - /* - MESA_handle_runtime_log(g_log_handle, RLOG_LV_INFO, HTTP_SERVICE_PLUGNAME, - "call http_service entry, http_state is %02x\n, prot_flag mask is %s : %d", http_state, prot_flag_str.c_str(), prot_flag_str.length() - 1); - - if(curdir == DIR_C2S){ - int i = 0; - printf("data begin: curdir is %d, http_state is %d, prot_flag mask is %d\n", curdir, http_state, prot_flag_str.length() - 1); - } - */ - switch(session_info->prot_flag) - { - case HTTP_STATE: - case HTTP_CONTENT: - break; - case HTTP_UNGZIP_CONTENT: - snprintf(filename, sizeof(filename), "%s/HTTP_%s_%u", LOG_PATH, printaddr(&a_tcp->addr, thread_seq), a_http->http_session_seq); - service_pme->fp = fopen(filename, "a+"); - if(NULL==service_pme->fp) - { - MESA_handle_runtime_log(g_log_handle, RLOG_LV_FATAL, HTTP_SERVICE_PLUGNAME, "%s file open error.", filename); - return PROT_STATE_DROPME; - } - MESA_handle_runtime_log(g_log_handle, RLOG_LV_DEBUG, HTTP_SERVICE_PLUGNAME, "%s file open.",filename); - - fwrite(session_info->buf, session_info->buflen, 1, service_pme->fp); - fflush(service_pme->fp); - //content_len += session_info->buflen; - //printf("content_len:%d\n", content_len); - - snprintf(filename, sizeof(filename), "%s/HTTP_%s_%u", LOG_PATH, printaddr(&a_tcp->addr, thread_seq), a_http->http_session_seq); - MESA_handle_runtime_log(g_log_handle, RLOG_LV_DEBUG, HTTP_SERVICE_PLUGNAME, "%s file close.",filename); - fclose(service_pme->fp); - break; - default: - snprintf(filename, sizeof(filename), "%s/HTTP_%s_%u", LOG_PATH, printaddr(&a_tcp->addr, thread_seq), a_http->http_session_seq); - service_pme->fp = fopen(filename, "a+"); - if(NULL==service_pme->fp) - { - MESA_handle_runtime_log(g_log_handle, RLOG_LV_FATAL, HTTP_SERVICE_PLUGNAME, "%s file open error.", filename); - return PROT_STATE_DROPME; - } - MESA_handle_runtime_log(g_log_handle, RLOG_LV_DEBUG, HTTP_SERVICE_PLUGNAME, "%s file open.",filename); - - region = http_proto_flag2region(session_info->prot_flag); - - fwrite(region, strlen(region), 1, service_pme->fp); - fwrite(":", 1, 1, service_pme->fp); - fwrite(session_info->buf, session_info->buflen, 1, service_pme->fp); - fwrite("\r\n", 2, 1, service_pme->fp); - fflush(service_pme->fp); - //header_len += session_info->buflen; - //printf("header_len:%d\n", header_len); - - snprintf(filename, sizeof(filename), "%s/HTTP_%s_%u", LOG_PATH, printaddr(&a_tcp->addr, thread_seq), a_http->http_session_seq); - MESA_handle_runtime_log(g_log_handle, RLOG_LV_DEBUG, HTTP_SERVICE_PLUGNAME, "%s file close.",filename); - fclose(service_pme->fp); - break; - } - - if(session_info->session_state&SESSION_STATE_CLOSE) - { - if(NULL!=service_pme->fp) - { - - service_pme->fp = NULL; - } - clear_pmeinfo((service_pmeinfo*)*param, thread_seq); - *param = NULL; - } - return rec; -} - -int HTTP_SERVICE_INIT(void) -{ - g_log_handle = MESA_create_runtime_log_handle("./log/http/http_service", 10); - if(g_log_handle == NULL) - { - printf("%s init : get log handle error!\n", HTTP_SERVICE_PLUGNAME); - return -1; - } - return 0; -} - -void HTTP_SERVICE_DESTROY(void) -{ - return ; -} - diff --git a/test/test_plugin/http_service.h b/test/test_plugin/http_service.h deleted file mode 100644 index 5d0d423..0000000 --- a/test/test_plugin/http_service.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * HTTP_Service.h - * - * Created on: 2013-8-19 - * Author: lishu - */ - -#ifndef HTTP_SERVICE_H_ -#define HTTP_SERVICE_H_ - -#include <stdio.h> -#include <string.h> -#include <pthread.h> -#include <time.h> -#include </usr/include/net/if.h> -#include <sys/ioctl.h> -#include <sys/socket.h> -#include </usr/include/linux/sockios.h> -#include <arpa/inet.h> -#include <unistd.h> -#include <ctype.h> -#include <stdlib.h> -#include <regex.h> - - -#include "stream.h" -#include "http.h" - -#define HTTP_SERVICE_PLUGNAME "http_service.so" -#define LOG_PATH "./log/http/" - - -typedef struct service_pmeinfo -{ - FILE* fp; -}service_pmeinfo; - - -#ifdef __cplusplus -extern "C" { -#endif - -uchar HTTP_SERVICE_ENTRY(stSessionInfo* session_info, void **param, int thread_seq, struct streaminfo *a_tcp, void *a_packet); -int HTTP_SERVICE_INIT(void); -void HTTP_SERVICE_DESTROY(void); - -#ifdef __cplusplus -} -#endif - -#endif /* HTTP_SERVICE_H_ */ |
