summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
author崔一鸣 <[email protected]>2019-05-21 16:54:19 +0800
committer崔一鸣 <[email protected]>2019-05-21 17:08:44 +0800
commit4636f27eec7ea502735a599242c7cbc216da613d (patch)
treef4ea8d179c5cdba65e9b83396e33af5204955abf /test
parenta3d83e74f31dd56e98b847aab28bb0eb462172fa (diff)
修改目录结构, 添加文档HEADmaster
Diffstat (limited to 'test')
-rw-r--r--test/CMakeLists.txt15
-rw-r--r--test/new_http_service/adapter.cpp471
-rw-r--r--test/new_http_service/adapter.h112
-rw-r--r--test/new_http_service/http_request.lua87
-rw-r--r--test/new_http_service/http_response.lua57
-rw-r--r--test/test_coroutine/main.cpp226
-rw-r--r--test/test_coroutine/test.lua63
-rw-r--r--test/test_plugin/http_service.cpp183
-rw-r--r--test/test_plugin/http_service.h51
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_ */