1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include "cJSON.h"
#ifdef __cplusplus
extern "C"
{
#endif
#include "ftp_decoder.h"
#include <stellar/stellar.h>
#include <stellar/session.h>
#include <stellar/session_mq.h>
#include <stellar/session_exdata.h>
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 ;
}
|