#include #include #include #include #include #include "cJSON.h" #ifdef __cplusplus extern "C" { #endif #include "ftp_decoder.h" #include #include #include #include extern int commit_test_result_json(cJSON *node, const char *name); #ifdef __cplusplus } #endif static int g_result_count = 0; struct ftp_test_context { cJSON *json_root; size_t tot_file_len; int cmd_index; }; void ftp_iovec_add_to_json(cJSON *object, const char *key, const struct iovec *fmsg_value, int cmd_index) { char *tmp = (char *)calloc(1, fmsg_value->iov_len + 1); memcpy(tmp, fmsg_value->iov_base, fmsg_value->iov_len); char key_with_index[128] = {}; snprintf(key_with_index, sizeof(key_with_index), "%s_%d", key, cmd_index); cJSON_AddStringToObject(object, key_with_index, tmp); free(tmp); return ; } extern "C" void *ftp_test_plug_session_ctx_new_cb(struct session *sess, void *plugin_env) { struct ftp_test_context *fctx = (struct ftp_test_context *)calloc(1, sizeof(struct ftp_test_context)); fctx->json_root = cJSON_CreateObject(); return fctx; } extern "C" void ftp_test_session_ctx_free_cb(struct session *sess, void *session_ctx, void *plugin_env) { struct ftp_test_context *fctx = (struct ftp_test_context *)session_ctx; if(fctx->tot_file_len > 0){ cJSON_AddNumberToObject(fctx->json_root, "total-payload-len", fctx->tot_file_len); } char result_name[16]=""; sprintf(result_name,"FTP_RESULT_%d", g_result_count); commit_test_result_json(fctx->json_root, result_name); g_result_count+=1; free(session_ctx); } extern "C" void FTP_TEST_PLUG_DATA_ENTRY(struct session *sess, int topic_id, const void *msg, void *per_session_ctx, void *plugin_env) { struct ftp_test_context *fctx = (struct ftp_test_context *)per_session_ctx; struct ftp_message *fmsg = (struct ftp_message *)msg; enum session_state sstate = session_get_current_state(sess); if(SESSION_STATE_OPENING == sstate){ cJSON_AddStringToObject(fctx->json_root, "FTP_LINK_TYPE", "DATA"); cJSON_AddStringToObject(fctx->json_root, "TUPLE4", session_get0_readable_addr(sess)); } enum ftp_msg_type fmsg_type; struct iovec fmsg_value; while(ftp_message_iterate(fmsg, &fmsg_type, &fmsg_value)){ if(fmsg_type == FTP_INVENTORY || fmsg_type == FTP_FILE_CONTENT){ fctx->tot_file_len += fmsg_value.iov_len; }else{ // printf("### ftp data plug: len=%d, %.*s\n", (int)fmsg_value.iov_len, (int)fmsg_value.iov_len, (char *)fmsg_value.iov_base); ftp_iovec_add_to_json(fctx->json_root, ftp_message_type_to_string(fmsg_type), &fmsg_value, ++fctx->cmd_index); } } } extern "C" void FTP_TEST_PLUG_CTRL_ENTRY(struct session *sess, int topic_id, const void *msg, void *per_session_ctx, void *plugin_env) { struct ftp_test_context *fctx = (struct ftp_test_context *)per_session_ctx; struct ftp_message *fmsg = (struct ftp_message *)msg; enum session_state sstate = session_get_current_state(sess); if(SESSION_STATE_OPENING == sstate){ cJSON_AddStringToObject(fctx->json_root, "FTP_LINK_TYPE", "CTRL"); cJSON_AddStringToObject(fctx->json_root, "TUPLE4", session_get0_readable_addr(sess)); } enum ftp_msg_type fmsg_type; struct iovec fmsg_value; while(ftp_message_iterate(fmsg, &fmsg_type, &fmsg_value)){ // printf("### ftp ctrl plug: len=%d, %.*s\n", (int)fmsg_value.iov_len, (int)fmsg_value.iov_len, (char *)fmsg_value.iov_base); ftp_iovec_add_to_json(fctx->json_root, ftp_message_type_to_string(fmsg_type), &fmsg_value, ++fctx->cmd_index); } } extern "C" void *FTP_TEST_PLUG_INIT(struct stellar *st) { void *fake_ftp_test_plugin_env = (void *)"_fake_plugin_env_"; int ftp_test_plug_id = stellar_session_plugin_register(st, ftp_test_plug_session_ctx_new_cb, ftp_test_session_ctx_free_cb, fake_ftp_test_plugin_env); int ftp_ctrl_topic_id = stellar_session_mq_get_topic_id(st, FTP_DECODER_CTRL_TOPIC); assert(ftp_ctrl_topic_id >= 0); int ftp_data_topic_id = stellar_session_mq_get_topic_id(st, FTP_DECODER_DATA_TOPIC); assert(ftp_data_topic_id >= 0); stellar_session_mq_subscribe(st, ftp_ctrl_topic_id, FTP_TEST_PLUG_CTRL_ENTRY, ftp_test_plug_id); stellar_session_mq_subscribe(st, ftp_data_topic_id, FTP_TEST_PLUG_DATA_ENTRY, ftp_test_plug_id); return fake_ftp_test_plugin_env; } extern "C" void FTP_TEST_PLUG_DESTROY(void *plugin_env) { //do nothing return ; }