2477 lines
68 KiB
C++
2477 lines
68 KiB
C++
|
|
#include "helper.h"
|
||
|
|
#include "common/FileHelper.h"
|
||
|
|
|
||
|
|
#include <iostream>
|
||
|
|
using namespace std;
|
||
|
|
|
||
|
|
app_arg g_app_arg;
|
||
|
|
|
||
|
|
char app_arg::OPTIONS[] = ":a:p:b:d:j:t:e:i:c:l:s:m:o:z:x:y:n:r:u:k:w:q:hv";
|
||
|
|
|
||
|
|
app_arg::app_arg()
|
||
|
|
{
|
||
|
|
// -a
|
||
|
|
remote_addr = IPV4_LOOPBACK_ADDRESS;
|
||
|
|
// -p
|
||
|
|
port = DEF_TCP_UDP_PORT;
|
||
|
|
// -b
|
||
|
|
bind_addr = "";
|
||
|
|
// -d
|
||
|
|
local_port = 0;
|
||
|
|
// -j
|
||
|
|
reject_addr = "";
|
||
|
|
// -n
|
||
|
|
async = true;
|
||
|
|
// -t
|
||
|
|
thread_count = DEFAULT_WORKER_THREAD_COUNT;
|
||
|
|
// -e
|
||
|
|
test_times = 100;
|
||
|
|
// -i
|
||
|
|
test_interval = 1;
|
||
|
|
// -c
|
||
|
|
conn_count = 100;
|
||
|
|
// -l
|
||
|
|
data_length = 5000;
|
||
|
|
// -s
|
||
|
|
send_policy = SP_PACK;
|
||
|
|
// -m
|
||
|
|
max_conn = 10000;
|
||
|
|
// -q
|
||
|
|
keep_alive = true;
|
||
|
|
|
||
|
|
// -o
|
||
|
|
cast_mode = CM_MULTICAST;
|
||
|
|
// -r
|
||
|
|
reuse_addr = RAP_ADDR_ONLY;
|
||
|
|
// -u
|
||
|
|
ip_loop = true;
|
||
|
|
// -k
|
||
|
|
ttl = 1;
|
||
|
|
|
||
|
|
// -x
|
||
|
|
http_port = DEF_HTTP_PORT;
|
||
|
|
// -y
|
||
|
|
https_port = DEF_HTTPS_PORT;
|
||
|
|
// -z
|
||
|
|
http_use_cookie = true;
|
||
|
|
// -w
|
||
|
|
http_with_listener = true;;
|
||
|
|
}
|
||
|
|
|
||
|
|
app_arg::~app_arg()
|
||
|
|
{
|
||
|
|
PRINTLN("bye ~ bye ~");
|
||
|
|
}
|
||
|
|
|
||
|
|
void app_arg::ParseArgs(int argc, char* const argv[])
|
||
|
|
{
|
||
|
|
int c;
|
||
|
|
CString strOptArg;
|
||
|
|
|
||
|
|
|
||
|
|
while((c = ::getopt(argc, argv, OPTIONS)) != -1)
|
||
|
|
{
|
||
|
|
strOptArg = optarg;
|
||
|
|
|
||
|
|
if(strOptArg == "-")
|
||
|
|
strOptArg.Empty();
|
||
|
|
|
||
|
|
switch(c)
|
||
|
|
{
|
||
|
|
case 'a': remote_addr = strOptArg; break;
|
||
|
|
case 'p': port = (USHORT)atoi(strOptArg); break;
|
||
|
|
case 'b': bind_addr = strOptArg; break;
|
||
|
|
case 'd': local_port = (USHORT)atoi(strOptArg); break;
|
||
|
|
case 'j': reject_addr = strOptArg; break;
|
||
|
|
case 'n': async = (bool)atoi(strOptArg); break;
|
||
|
|
case 't': thread_count = (DWORD)atoi(strOptArg); break;
|
||
|
|
case 'e': test_times = (DWORD)atoi(strOptArg); break;
|
||
|
|
case 'i': test_interval = (DWORD)atoi(strOptArg); break;
|
||
|
|
case 'c': conn_count = (DWORD)atoi(strOptArg); break;
|
||
|
|
case 'l': data_length = (DWORD)atoi(strOptArg); break;
|
||
|
|
case 's': send_policy = (EnSendPolicy)atoi(strOptArg); break;
|
||
|
|
case 'm': max_conn = (DWORD)atoi(strOptArg); break;
|
||
|
|
case 'q': keep_alive = (bool)atoi(strOptArg); break;
|
||
|
|
case 'o': cast_mode = (EnCastMode)atoi(strOptArg); break;
|
||
|
|
case 'r': reuse_addr = (EnReuseAddressPolicy)atoi(strOptArg);break;
|
||
|
|
case 'u': ip_loop = (bool)atoi(strOptArg); break;
|
||
|
|
case 'k': ttl = (int)atoi(strOptArg); break;
|
||
|
|
case 'x': http_port = (USHORT)atoi(strOptArg); break;
|
||
|
|
case 'y': https_port = (USHORT)atoi(strOptArg); break;
|
||
|
|
case 'z': http_use_cookie = (bool)atoi(strOptArg); break;
|
||
|
|
case 'w': http_with_listener= (bool)atoi(strOptArg); break;
|
||
|
|
case 'v': PrintVersion(); exit(EXIT_CODE_OK);
|
||
|
|
case 'h': PrintUsage(); exit(EXIT_CODE_OK);
|
||
|
|
case '?': ERROR_EXIT2(EXIT_CODE_CONFIG, ERROR_INVALID_PARAMETER);
|
||
|
|
case ':': ERROR_EXIT2(EXIT_CODE_CONFIG, ERROR_INVALID_PARAMETER);
|
||
|
|
default: ERROR_EXIT2(EXIT_CODE_CONFIG, ERROR_OBJECT_NOT_FOUND);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void app_arg::PrintUsage()
|
||
|
|
{
|
||
|
|
PRINTLN("--------------------------- Command Line Args ---------------------------");
|
||
|
|
PRINTLN(" -%s: %-20s-%s: %-20s-%s: %-20s", "a", "remote_addr", "b", "bind_addr", "c", "conn_count");
|
||
|
|
PRINTLN(" -%s: %-20s-%s: %-20s-%s: %-20s", "d", "local_port", "e", "test_times", "h", "(PRINT THIS USAGE)");
|
||
|
|
PRINTLN(" -%s: %-20s-%s: %-20s-%s: %-20s", "i", "test_interval", "j", "reject_addr", "k", "ttl");
|
||
|
|
PRINTLN(" -%s: %-20s-%s: %-20s-%s: %-20s", "l", "data_length", "m", "max_conn", "n", "async");
|
||
|
|
PRINTLN(" -%s: %-20s-%s: %-20s-%s: %-20s", "o", "cast_mode", "p", "port", "q", "keep_alive");
|
||
|
|
PRINTLN(" -%s: %-20s-%s: %-20s-%s: %-20s", "r", "reuse_addr", "s", "send_policy", "t", "thread_count");
|
||
|
|
PRINTLN(" -%s: %-20s-%s: %-20s-%s: %-20s", "u", "ip_loop", "v", "(PRINT VERSION)", "w", "http_with_listener");
|
||
|
|
PRINTLN(" -%s: %-20s-%s: %-20s-%s: %-20s", "x", "http_port", "y", "https_port", "z", "http_use_cookie");
|
||
|
|
PRINTLN("-------------------------------------------------------------------------");
|
||
|
|
}
|
||
|
|
|
||
|
|
void app_arg::PrintVersion()
|
||
|
|
{
|
||
|
|
DWORD dwVersion = ::GetHPSocketVersion();
|
||
|
|
DWORD dwMagor = dwVersion >> 24;
|
||
|
|
DWORD dwMinor = (dwVersion >> 16) & 0xFF;
|
||
|
|
DWORD dwRevise = (dwVersion >> 8) & 0xFF;
|
||
|
|
DWORD dwBuild = dwVersion & 0xFF;
|
||
|
|
|
||
|
|
PRINTLN("HP-Socket for Linux v%d.%d.%d [BN:%02d]", dwMagor, dwMinor, dwRevise, dwBuild);
|
||
|
|
}
|
||
|
|
|
||
|
|
void app_arg::ShowPFMTestArgs(BOOL bAgent)
|
||
|
|
{
|
||
|
|
PRINTLN("PFM Test Args:");
|
||
|
|
PRINTLN("-------------------+-------------------");
|
||
|
|
PRINTLN("%18s : %s", "remote_addr", (LPCTSTR)remote_addr);
|
||
|
|
PRINTLN("%18s : %u", "port", port);
|
||
|
|
PRINTLN("%18s : %u", "test_times", test_times);
|
||
|
|
PRINTLN("%18s : %u", "test_interval", test_interval);
|
||
|
|
PRINTLN("%18s : %u", "conn_count", conn_count);
|
||
|
|
PRINTLN("%18s : %u", "data_length", data_length);
|
||
|
|
if(bAgent) {
|
||
|
|
PRINTLN("%18s : %u", "thread_count", thread_count);
|
||
|
|
PRINTLN("%18s : %u", "max_conn", max_conn); }
|
||
|
|
PRINTLN("-------------------+-------------------");
|
||
|
|
}
|
||
|
|
|
||
|
|
CCommandParser::CCommandParser(CCommandParser::EnAppType enAppType, CMD_FUNC fnCmds[CT_MAX])
|
||
|
|
: m_enAppType(enAppType)
|
||
|
|
{
|
||
|
|
m_szCmdNameFuncs[CT_START] = {"start" , fnCmds[CT_START]};
|
||
|
|
m_szCmdNameFuncs[CT_STOP] = {"stop" , fnCmds[CT_STOP]};
|
||
|
|
m_szCmdNameFuncs[CT_STATUS] = {"status" , fnCmds[CT_STATUS]};
|
||
|
|
m_szCmdNameFuncs[CT_SEND] = {"send" , fnCmds[CT_SEND]};
|
||
|
|
m_szCmdNameFuncs[CT_SENDC] = {"sendc" , fnCmds[CT_SENDC]};
|
||
|
|
m_szCmdNameFuncs[CT_PAUSE] = {"pause" , fnCmds[CT_PAUSE]};
|
||
|
|
m_szCmdNameFuncs[CT_KICK] = {"kick" , fnCmds[CT_KICK]};
|
||
|
|
m_szCmdNameFuncs[CT_KICK_L] = {"kickl" , fnCmds[CT_KICK_L]};
|
||
|
|
m_szCmdNameFuncs[CT_KICK_S] = {"kicks" , fnCmds[CT_KICK_S]};
|
||
|
|
m_szCmdNameFuncs[CT_CONNECT]= {"connect" , fnCmds[CT_CONNECT]};
|
||
|
|
m_szCmdNameFuncs[CT_STAT] = {"stat" , fnCmds[CT_STAT]};
|
||
|
|
|
||
|
|
Reset();
|
||
|
|
}
|
||
|
|
|
||
|
|
BOOL CCommandParser::Run()
|
||
|
|
{
|
||
|
|
if(m_thWorker.IsRunning())
|
||
|
|
return FALSE;
|
||
|
|
|
||
|
|
Reset();
|
||
|
|
|
||
|
|
return m_thWorker.Start(this, &CCommandParser::WorkerProc) && WaitForExit();
|
||
|
|
}
|
||
|
|
|
||
|
|
BOOL CCommandParser::WaitForExit()
|
||
|
|
{
|
||
|
|
return m_thWorker.Join();
|
||
|
|
}
|
||
|
|
|
||
|
|
void CCommandParser::WorkerProc(PVOID pv)
|
||
|
|
{
|
||
|
|
CString strLine;
|
||
|
|
|
||
|
|
PrintUsage();
|
||
|
|
printf("> ");
|
||
|
|
|
||
|
|
while(TRUE)
|
||
|
|
{
|
||
|
|
Reset();
|
||
|
|
|
||
|
|
if(!std::getline(cin, strLine))
|
||
|
|
{
|
||
|
|
PRINTLN();
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
Parse((LPTSTR)(LPCTSTR)strLine, strLine.GetLength());
|
||
|
|
|
||
|
|
printf("> ");
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
PrintUsage();
|
||
|
|
|
||
|
|
char* lpszLine = nullptr;
|
||
|
|
SIZE_T nSize = 0;
|
||
|
|
|
||
|
|
printf("> ");
|
||
|
|
|
||
|
|
while(TRUE)
|
||
|
|
{
|
||
|
|
Reset();
|
||
|
|
|
||
|
|
SSIZE_T nRead = getline(&lpszLine, &nSize, stdin);
|
||
|
|
|
||
|
|
if(nRead == EOF)
|
||
|
|
{
|
||
|
|
PRINTLN();
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
lpszLine[--nRead] = 0;
|
||
|
|
Parse(lpszLine, nRead);
|
||
|
|
|
||
|
|
printf("> ");
|
||
|
|
|
||
|
|
if(nSize >= 4096)
|
||
|
|
{
|
||
|
|
free(lpszLine);
|
||
|
|
|
||
|
|
lpszLine = nullptr;
|
||
|
|
nSize = 0;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
free(lpszLine);
|
||
|
|
|
||
|
|
*/
|
||
|
|
}
|
||
|
|
|
||
|
|
void CCommandParser::Parse(LPTSTR lpszLine, SSIZE_T nLength)
|
||
|
|
{
|
||
|
|
LPTSTR lpszArg = lpszLine;
|
||
|
|
LPTSTR lpszCmd = ::StrSep2(&lpszArg, " \t");
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszCmd))
|
||
|
|
return;
|
||
|
|
|
||
|
|
int i = CT_START;
|
||
|
|
|
||
|
|
for(; i < CT_MAX; i++)
|
||
|
|
{
|
||
|
|
if(strcmp(lpszCmd, m_szCmdNameFuncs[i].name) == 0)
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
EnCmdType type = (EnCmdType)i;
|
||
|
|
|
||
|
|
if(type == CT_MAX)
|
||
|
|
{
|
||
|
|
if(strcmp(lpszCmd, "?") == 0)
|
||
|
|
PrintUsage();
|
||
|
|
else if(strcmp(lpszCmd, "args") == 0)
|
||
|
|
app_arg::PrintUsage();
|
||
|
|
else
|
||
|
|
{
|
||
|
|
PRINTLN(" '%s' : command NOT found ~", lpszCmd);
|
||
|
|
}
|
||
|
|
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if( ((m_enAppType == AT_CLIENT || m_enAppType == AT_NODE) &&
|
||
|
|
(type == CT_KICK || type == CT_KICK_L || type == CT_KICK_S))
|
||
|
|
|| (m_enAppType == AT_SERVER && type == CT_CONNECT )
|
||
|
|
|| (m_enAppType != AT_NODE && type == CT_SENDC) )
|
||
|
|
{
|
||
|
|
PRINTLN(" '%s' : command NOT supported ~", lpszCmd);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(m_szCmdNameFuncs[type].func == nullptr)
|
||
|
|
{
|
||
|
|
PRINTLN(" '%s' : command NOT handled ~", lpszCmd);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
ParseCmdArgs(type, lpszArg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void CCommandParser::ParseCmdArgs(EnCmdType type, LPTSTR lpszArg)
|
||
|
|
{
|
||
|
|
ASSERT(type >= CT_START && type < CT_MAX);
|
||
|
|
|
||
|
|
LPTSTR lpszParam1 = lpszArg;
|
||
|
|
|
||
|
|
if( (m_enAppType != AT_CLIENT || type != CT_SEND) &&
|
||
|
|
(m_enAppType != AT_NODE || type != CT_SENDC) )
|
||
|
|
lpszParam1 = ::StrSep2(&lpszArg, " \t");
|
||
|
|
|
||
|
|
if(type == CT_START || type == CT_STOP || type == CT_STATUS || type == CT_STAT)
|
||
|
|
{
|
||
|
|
if(!::IsStrEmpty(lpszParam1))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
}
|
||
|
|
else if(type == CT_SEND)
|
||
|
|
{
|
||
|
|
LPTSTR lpszMsg = nullptr;
|
||
|
|
|
||
|
|
if(m_enAppType == AT_CLIENT)
|
||
|
|
lpszMsg = lpszParam1;
|
||
|
|
else if(m_enAppType == AT_NODE)
|
||
|
|
{
|
||
|
|
LPTSTR lpszHost = lpszParam1;
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszHost))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
m_strRemoteAddr = lpszHost;
|
||
|
|
|
||
|
|
LPTSTR lpszPort = ::StrSep2(&lpszArg, " \t");
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszPort))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
if((m_usRemotePort = (USHORT)atoi(lpszPort)) <= 0)
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
lpszMsg = lpszArg;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
LPTSTR lpszConnID = lpszParam1;
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszConnID))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
if((m_dwConnID = atol(lpszConnID)) <= 0)
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
lpszMsg = lpszArg;
|
||
|
|
}
|
||
|
|
|
||
|
|
while(!::IsStrEmpty(lpszMsg))
|
||
|
|
{
|
||
|
|
if(lpszMsg[0] != ' ' && lpszMsg[0] != '\t')
|
||
|
|
break;
|
||
|
|
|
||
|
|
++lpszMsg;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(m_enAppType != AT_NODE && ::IsStrEmpty(lpszMsg))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
m_strMessage = lpszMsg;
|
||
|
|
}
|
||
|
|
else if(type == CT_SENDC)
|
||
|
|
{
|
||
|
|
ASSERT(m_enAppType == AT_NODE);
|
||
|
|
|
||
|
|
LPTSTR lpszMsg = lpszParam1;
|
||
|
|
|
||
|
|
while(!::IsStrEmpty(lpszMsg))
|
||
|
|
{
|
||
|
|
if(lpszMsg[0] != ' ' && lpszMsg[0] != '\t')
|
||
|
|
break;
|
||
|
|
|
||
|
|
++lpszMsg;
|
||
|
|
}
|
||
|
|
|
||
|
|
m_strMessage = lpszMsg;
|
||
|
|
}
|
||
|
|
else if(type == CT_PAUSE || type == CT_KICK)
|
||
|
|
{
|
||
|
|
LPTSTR lpszFlag = nullptr;
|
||
|
|
|
||
|
|
if(m_enAppType == AT_CLIENT)
|
||
|
|
lpszFlag = lpszParam1;
|
||
|
|
else
|
||
|
|
{
|
||
|
|
LPTSTR lpszConnID = lpszParam1;
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszConnID))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
if((m_dwConnID = atol(lpszConnID)) <= 0)
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
lpszFlag = ::StrSep2(&lpszArg, " \t");
|
||
|
|
}
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszFlag))
|
||
|
|
m_bFlag = TRUE;
|
||
|
|
else
|
||
|
|
{
|
||
|
|
if(!::IsStrEmpty(::StrSep2(&lpszArg, " \t")))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
if(::IsStrEmpty(lpszFlag) || (lpszFlag[0] != '0' && lpszFlag[0] != '1') || lpszFlag[1] != 0)
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
m_bFlag = (BOOL)(lpszFlag[0] - '0');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if(type == CT_KICK_L || type == CT_KICK_S)
|
||
|
|
{
|
||
|
|
ASSERT(m_enAppType != AT_CLIENT);
|
||
|
|
|
||
|
|
LPTSTR lpszSeconds = lpszParam1;
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszSeconds))
|
||
|
|
{
|
||
|
|
m_dwSeconds = 60;
|
||
|
|
m_bFlag = TRUE;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
if(((int)(m_dwSeconds = atoi(lpszSeconds))) <= 0)
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
LPTSTR lpszFlag = ::StrSep2(&lpszArg, " \t");
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszFlag))
|
||
|
|
m_bFlag = TRUE;
|
||
|
|
else
|
||
|
|
{
|
||
|
|
if(!::IsStrEmpty(::StrSep2(&lpszArg, " \t")))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
if(::IsStrEmpty(lpszFlag) || (lpszFlag[0] != '0' && lpszFlag[0] != '1') || lpszFlag[1] != 0)
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
m_bFlag = (BOOL)(lpszFlag[0] - '0');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if(type == CT_CONNECT)
|
||
|
|
{
|
||
|
|
ASSERT(m_enAppType == AT_AGENT);
|
||
|
|
|
||
|
|
LPTSTR lpszHost = lpszParam1;
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszHost))
|
||
|
|
{
|
||
|
|
m_strRemoteAddr = g_app_arg.remote_addr;
|
||
|
|
m_usRemotePort = g_app_arg.port;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
LPTSTR lpszPort = ::StrSep2(&lpszArg, " \t");
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszPort) || !::IsStrEmpty(::StrSep2(&lpszArg, " \t")))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
if((m_usRemotePort = (USHORT)atoi(lpszPort)) <= 0)
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
m_strRemoteAddr = lpszHost;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
m_szCmdNameFuncs[type].func(this);
|
||
|
|
|
||
|
|
return;
|
||
|
|
|
||
|
|
ERROR_USAGE:
|
||
|
|
PRINTLN(" '%s' usage : %s", m_szCmdNameFuncs[type].name, (LPCTSTR)GetCmdUsage(type));
|
||
|
|
}
|
||
|
|
|
||
|
|
void CCommandParser::Reset()
|
||
|
|
{
|
||
|
|
m_bFlag = TRUE;
|
||
|
|
m_dwConnID = 0;
|
||
|
|
m_usRemotePort = 0;
|
||
|
|
m_dwSeconds = 0;
|
||
|
|
m_strMessage = nullptr;
|
||
|
|
m_strRemoteAddr = nullptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
void CCommandParser::PrintUsage()
|
||
|
|
{
|
||
|
|
PRINTLN("------ ACTION -----+----------------------- USAGE -----------------------");
|
||
|
|
|
||
|
|
PrintCmdUsage();
|
||
|
|
|
||
|
|
PRINTLN("%-18s : %6s%s", "Print Usage", "", "?");
|
||
|
|
PRINTLN("%-18s : %3s%s", "Print Command Args", "", "args");
|
||
|
|
PRINTLN("%-18s : %1s%s", "Quit", "", "Ctrl+D");
|
||
|
|
PRINTLN("-------------------+-----------------------------------------------------");
|
||
|
|
}
|
||
|
|
|
||
|
|
void CCommandParser::PrintCmdUsage()
|
||
|
|
{
|
||
|
|
if(m_szCmdNameFuncs[CT_START].func)
|
||
|
|
PRINTLN("%-18s : %2s%s", "Start Up", "", (LPCTSTR)GetCmdUsage(CT_START));
|
||
|
|
if(m_szCmdNameFuncs[CT_STOP].func)
|
||
|
|
PRINTLN("%-18s : %3s%s", "Shut Down", "", (LPCTSTR)GetCmdUsage(CT_STOP));
|
||
|
|
if(m_szCmdNameFuncs[CT_STATUS].func)
|
||
|
|
PRINTLN("%-18s : %1s%s", "Show Status", "", (LPCTSTR)GetCmdUsage(CT_STATUS));
|
||
|
|
if(m_szCmdNameFuncs[CT_CONNECT].func && m_enAppType == AT_AGENT)
|
||
|
|
PRINTLN("%-18s : %s%s", "Connect To", "", (LPCTSTR)GetCmdUsage(CT_CONNECT));
|
||
|
|
if(m_szCmdNameFuncs[CT_SEND].func)
|
||
|
|
PRINTLN("%-18s : %3s%s", "Send Message", "", (LPCTSTR)GetCmdUsage(CT_SEND));
|
||
|
|
if(m_szCmdNameFuncs[CT_SENDC].func)
|
||
|
|
PRINTLN("%-18s : %2s%s", "Send Cast Message", "", (LPCTSTR)GetCmdUsage(CT_SENDC));
|
||
|
|
if(m_szCmdNameFuncs[CT_PAUSE].func)
|
||
|
|
PRINTLN("%-18s : %2s%s", "Pause/Unpause Recv", "", (LPCTSTR)GetCmdUsage(CT_PAUSE));
|
||
|
|
if(m_enAppType != AT_CLIENT) {
|
||
|
|
if(m_szCmdNameFuncs[CT_KICK].func)
|
||
|
|
PRINTLN("%-18s : %3s%s", "Kick Connection", "", (LPCTSTR)GetCmdUsage(CT_KICK));
|
||
|
|
if(m_szCmdNameFuncs[CT_KICK_L].func)
|
||
|
|
PRINTLN("%-18s : %2s%s", "Kick Long Conns", "", (LPCTSTR)GetCmdUsage(CT_KICK_L));
|
||
|
|
if(m_szCmdNameFuncs[CT_KICK_S].func)
|
||
|
|
PRINTLN("%-18s : %2s%s", "Kick Silence Conns", "", (LPCTSTR)GetCmdUsage(CT_KICK_S)); }
|
||
|
|
if(m_enAppType == AT_SERVER) {
|
||
|
|
if(m_szCmdNameFuncs[CT_STAT].func)
|
||
|
|
PRINTLN("%-18s : %3s%s", "Stat R/S bytes", "", (LPCTSTR)GetCmdUsage(CT_STAT)); }
|
||
|
|
}
|
||
|
|
|
||
|
|
CString CCommandParser::GetCmdUsage(CCommandParser::EnCmdType type)
|
||
|
|
{
|
||
|
|
CString strUsage = m_szCmdNameFuncs[type].name;
|
||
|
|
|
||
|
|
switch(type)
|
||
|
|
{
|
||
|
|
case CT_SEND:
|
||
|
|
if(m_enAppType == AT_NODE)
|
||
|
|
strUsage += " {Host} {Port} [{Message}]";
|
||
|
|
else
|
||
|
|
{
|
||
|
|
if(m_enAppType != AT_CLIENT)
|
||
|
|
strUsage += " {ConnID}";
|
||
|
|
strUsage += " {Message}";
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case CT_SENDC:
|
||
|
|
strUsage += " [{Message}]";
|
||
|
|
break;
|
||
|
|
case CT_PAUSE:
|
||
|
|
if(m_enAppType != AT_CLIENT)
|
||
|
|
strUsage += " {ConnID}";
|
||
|
|
strUsage += " [0|1] # (0 - unpause, 1 - pause)";
|
||
|
|
break;
|
||
|
|
case CT_KICK:
|
||
|
|
if(m_enAppType != AT_CLIENT)
|
||
|
|
strUsage += " {ConnID} [0|1] # (0 - unforced, 1 - forced)";
|
||
|
|
else
|
||
|
|
strUsage = nullptr;
|
||
|
|
break;
|
||
|
|
case CT_KICK_L:
|
||
|
|
case CT_KICK_S:
|
||
|
|
if(m_enAppType != AT_CLIENT)
|
||
|
|
strUsage += " [{Seconds}] [0|1] # (default: {60, 1})";
|
||
|
|
else
|
||
|
|
strUsage = nullptr;
|
||
|
|
break;
|
||
|
|
case CT_CONNECT:
|
||
|
|
if(m_enAppType != AT_SERVER)
|
||
|
|
strUsage += " [{Host} {Port}]";
|
||
|
|
else
|
||
|
|
strUsage = nullptr;
|
||
|
|
break;
|
||
|
|
default :
|
||
|
|
;
|
||
|
|
}
|
||
|
|
|
||
|
|
return strUsage;
|
||
|
|
}
|
||
|
|
|
||
|
|
void CCommandParser::PrintStatus(EnServiceState enStatus, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString strStatus;
|
||
|
|
|
||
|
|
if(m_enAppType == AT_SERVER)
|
||
|
|
strStatus += "Server";
|
||
|
|
else if(m_enAppType == AT_AGENT)
|
||
|
|
strStatus += "Agent";
|
||
|
|
else if(m_enAppType == AT_CLIENT)
|
||
|
|
strStatus += "Client";
|
||
|
|
else if(m_enAppType == AT_NODE)
|
||
|
|
strStatus += "Node";
|
||
|
|
else
|
||
|
|
ASSERT(FALSE);
|
||
|
|
|
||
|
|
if(!::IsStrEmpty(lpszName))
|
||
|
|
strStatus.AppendChar(' ').Append(lpszName);
|
||
|
|
|
||
|
|
if(enStatus == SS_STARTING)
|
||
|
|
strStatus += " is starting";
|
||
|
|
else if(enStatus == SS_STARTED)
|
||
|
|
strStatus += " has started";
|
||
|
|
else if(enStatus == SS_STOPPING)
|
||
|
|
strStatus += " is stopping";
|
||
|
|
else if(enStatus == SS_STOPPED)
|
||
|
|
strStatus += " has stopped";
|
||
|
|
else
|
||
|
|
ASSERT(FALSE);
|
||
|
|
|
||
|
|
puts(strStatus);
|
||
|
|
}
|
||
|
|
|
||
|
|
#ifdef _NEED_HTTP
|
||
|
|
|
||
|
|
void CHttpCommandParser::ParseCmdArgs(EnCmdType type, LPTSTR lpszArg)
|
||
|
|
{
|
||
|
|
ASSERT(type >= CT_START && type < CT_MAX);
|
||
|
|
|
||
|
|
switch(type)
|
||
|
|
{
|
||
|
|
case CT_START:
|
||
|
|
{
|
||
|
|
if(m_enAppType == CCommandParser::AT_SERVER)
|
||
|
|
{
|
||
|
|
LPTSTR lpszParam1 = ::StrSep2(&lpszArg, " \t");
|
||
|
|
|
||
|
|
if(!::IsStrEmpty(lpszParam1))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
}
|
||
|
|
else if(!ParseCmdOptions(lpszArg, ":s:"))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
}
|
||
|
|
|
||
|
|
break;
|
||
|
|
|
||
|
|
case CT_STOP:
|
||
|
|
case CT_STAT:
|
||
|
|
case CT_STATUS:
|
||
|
|
{
|
||
|
|
LPTSTR lpszParam1 = ::StrSep2(&lpszArg, " \t");
|
||
|
|
|
||
|
|
if(!::IsStrEmpty(lpszParam1))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
}
|
||
|
|
|
||
|
|
break;
|
||
|
|
|
||
|
|
case CT_SEND:
|
||
|
|
{
|
||
|
|
if(m_enAppType != AT_CLIENT)
|
||
|
|
{
|
||
|
|
LPTSTR lpszConnID = ::StrSep2(&lpszArg, " \t");
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszConnID))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
if((m_dwConnID = atol(lpszConnID)) <= 0)
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(m_enAppType == AT_SERVER)
|
||
|
|
{
|
||
|
|
if(!ParseCmdOptions(lpszArg, ":s:d:"))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
if(!ParseCmdOptions(lpszArg, ":p:x:h:d:f:"))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
if(m_strPath.IsEmpty())
|
||
|
|
m_strPath = "/";
|
||
|
|
if(m_strMethod.IsEmpty())
|
||
|
|
m_strMethod = HTTP_METHOD_GET;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
break;
|
||
|
|
|
||
|
|
case CT_KICK:
|
||
|
|
{
|
||
|
|
LPTSTR lpszConnID = ::StrSep2(&lpszArg, " \t");
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszConnID))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
if((m_dwConnID = atol(lpszConnID)) <= 0)
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
if(m_enAppType == AT_SERVER && !ParseCmdOptions(lpszArg, ":s:"))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
else if(m_enAppType == AT_AGENT && !::IsStrEmpty(::StrSep2(&lpszArg, " \t")))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
}
|
||
|
|
|
||
|
|
break;
|
||
|
|
|
||
|
|
case CT_KICK_L:
|
||
|
|
case CT_KICK_S:
|
||
|
|
{
|
||
|
|
m_dwSeconds = 60;
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszArg))
|
||
|
|
break;
|
||
|
|
|
||
|
|
char c = ::TrimLeft(&lpszArg, " \t")[0];
|
||
|
|
|
||
|
|
if(c == 0)
|
||
|
|
break;
|
||
|
|
else if(c == '-')
|
||
|
|
{
|
||
|
|
if(m_enAppType != AT_SERVER || !ParseCmdOptions(lpszArg, ":s:"))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
LPTSTR lpszSeconds = ::StrSep2(&lpszArg, " \t");
|
||
|
|
|
||
|
|
if(((int)(m_dwSeconds = atoi(lpszSeconds))) <= 0)
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszArg))
|
||
|
|
break;
|
||
|
|
|
||
|
|
char c = ::TrimLeft(&lpszArg, " \t")[0];
|
||
|
|
|
||
|
|
if(c == 0)
|
||
|
|
break;
|
||
|
|
else if(c == '-')
|
||
|
|
{
|
||
|
|
if(m_enAppType != AT_SERVER || !ParseCmdOptions(lpszArg, ":s:"))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
break;
|
||
|
|
|
||
|
|
case CT_PAUSE:
|
||
|
|
{
|
||
|
|
if(m_enAppType != AT_CLIENT)
|
||
|
|
{
|
||
|
|
LPTSTR lpszConnID = ::StrSep2(&lpszArg, " \t");
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszConnID))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
if((m_dwConnID = atol(lpszConnID)) <= 0)
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
}
|
||
|
|
|
||
|
|
m_bFlag = TRUE;
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszArg))
|
||
|
|
break;
|
||
|
|
|
||
|
|
char c = ::TrimLeft(&lpszArg, " \t")[0];
|
||
|
|
|
||
|
|
if(c == 0)
|
||
|
|
break;
|
||
|
|
else if(c == '-')
|
||
|
|
{
|
||
|
|
if(m_enAppType != AT_SERVER || !ParseCmdOptions(lpszArg, ":s:"))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
LPTSTR lpszFlag = ::StrSep2(&lpszArg, " \t");
|
||
|
|
|
||
|
|
if((lpszFlag[0] != '0' && lpszFlag[0] != '1') || lpszFlag[1] != 0)
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
m_bFlag = (BOOL)(lpszFlag[0] - '0');
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszArg))
|
||
|
|
break;
|
||
|
|
|
||
|
|
char c = ::TrimLeft(&lpszArg, " \t")[0];
|
||
|
|
|
||
|
|
if(c == 0)
|
||
|
|
break;
|
||
|
|
else if(c == '-')
|
||
|
|
{
|
||
|
|
if(m_enAppType != AT_SERVER || !ParseCmdOptions(lpszArg, ":s:"))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
break;
|
||
|
|
|
||
|
|
case CT_CONNECT:
|
||
|
|
{
|
||
|
|
if(m_enAppType == AT_AGENT)
|
||
|
|
{
|
||
|
|
LPTSTR lpszHost = ::StrSep2(&lpszArg, " \t");
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszHost))
|
||
|
|
{
|
||
|
|
m_strRemoteAddr = g_app_arg.remote_addr;
|
||
|
|
m_usRemotePort = 0;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
LPTSTR lpszPort = ::StrSep2(&lpszArg, " \t");
|
||
|
|
|
||
|
|
if(::IsStrEmpty(lpszPort) || !::IsStrEmpty(::StrSep2(&lpszArg, " \t")))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
if((m_usRemotePort = (USHORT)atoi(lpszPort)) <= 0)
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
m_strRemoteAddr = lpszHost;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if(m_enAppType == AT_CLIENT)
|
||
|
|
{
|
||
|
|
m_bFlag = FALSE;
|
||
|
|
m_strPath = ::StrSep2(&lpszArg, " \t");
|
||
|
|
|
||
|
|
if(m_strPath.IsEmpty())
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
if(strnicmp(m_strPath, STR_HTTPS_SCHEMA, strlen(STR_HTTPS_SCHEMA)) == 0)
|
||
|
|
m_bHttps = TRUE;
|
||
|
|
else if(strnicmp(m_strPath, STR_HTTP_SCHEMA, strlen(STR_HTTP_SCHEMA)) == 0)
|
||
|
|
m_bHttps = FALSE;
|
||
|
|
else
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
if(!ParseCmdOptions(lpszArg, ":x:h:d:f:r:"))
|
||
|
|
goto ERROR_USAGE;
|
||
|
|
|
||
|
|
if(m_strMethod.IsEmpty())
|
||
|
|
m_strMethod = HTTP_METHOD_GET;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
break;
|
||
|
|
|
||
|
|
default:
|
||
|
|
ASSERT(FALSE);
|
||
|
|
}
|
||
|
|
|
||
|
|
m_szCmdNameFuncs[type].func(this);
|
||
|
|
|
||
|
|
return;
|
||
|
|
|
||
|
|
ERROR_USAGE:
|
||
|
|
PRINTLN(" '%s' usage : %s", m_szCmdNameFuncs[type].name, (LPCTSTR)GetCmdUsage(type));
|
||
|
|
}
|
||
|
|
|
||
|
|
BOOL CHttpCommandParser::ParseCmdOptions(LPCTSTR lpszArg, LPCTSTR lpszOptions)
|
||
|
|
{
|
||
|
|
if(::IsStrEmpty(lpszArg))
|
||
|
|
return TRUE;
|
||
|
|
|
||
|
|
vector<CString> vtItem;
|
||
|
|
|
||
|
|
if(!SplitStr(lpszArg, vtItem, " \t", "\'\""))
|
||
|
|
return FALSE;
|
||
|
|
|
||
|
|
int iSize = (int)vtItem.size();
|
||
|
|
|
||
|
|
if(iSize % 2 != 0)
|
||
|
|
return FALSE;
|
||
|
|
|
||
|
|
for(int i = 0; i < iSize; i += 2)
|
||
|
|
{
|
||
|
|
CString& strOpt = vtItem[i];
|
||
|
|
CString& strVal = vtItem[i + 1];
|
||
|
|
|
||
|
|
if(strOpt.GetLength() != 2 || strOpt[0] != '-')
|
||
|
|
return FALSE;
|
||
|
|
|
||
|
|
TCHAR c = strOpt[1];
|
||
|
|
|
||
|
|
if(c == ':' || ::StrChr(lpszOptions, c) == nullptr)
|
||
|
|
return FALSE;
|
||
|
|
|
||
|
|
if(c == 's')
|
||
|
|
{
|
||
|
|
if(strVal != "0" && strVal != "1")
|
||
|
|
return FALSE;
|
||
|
|
|
||
|
|
m_bHttps = (BOOL)(strVal[0] - '0');
|
||
|
|
}
|
||
|
|
else if(c == 'p')
|
||
|
|
{
|
||
|
|
m_strPath = strVal;
|
||
|
|
}
|
||
|
|
else if(c == 'x')
|
||
|
|
{
|
||
|
|
m_strMethod = strVal;
|
||
|
|
m_strMethod.MakeUpper();
|
||
|
|
}
|
||
|
|
else if(c == 'h')
|
||
|
|
{
|
||
|
|
int iPos = strVal.Find(':');
|
||
|
|
|
||
|
|
if(iPos <= 0)
|
||
|
|
return FALSE;
|
||
|
|
|
||
|
|
m_vtHeaders.push_back(strVal.Left(iPos));
|
||
|
|
m_vtHeaders.push_back(strVal.Mid(iPos + 1).Trim());
|
||
|
|
}
|
||
|
|
else if(c == 'd')
|
||
|
|
{
|
||
|
|
m_strData = strVal;
|
||
|
|
}
|
||
|
|
else if(c == 'f')
|
||
|
|
{
|
||
|
|
m_strFilePath = strVal;
|
||
|
|
}
|
||
|
|
else if(c == 'r')
|
||
|
|
{
|
||
|
|
if(strVal != "0" && strVal != "1")
|
||
|
|
return FALSE;
|
||
|
|
|
||
|
|
m_bFlag = (BOOL)(strVal[0] - '0');
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return TRUE;
|
||
|
|
}
|
||
|
|
|
||
|
|
void CHttpCommandParser::Reset()
|
||
|
|
{
|
||
|
|
__super::Reset();
|
||
|
|
m_vtHeaders.clear();
|
||
|
|
|
||
|
|
m_bHttps = FALSE;
|
||
|
|
m_strPath = nullptr;
|
||
|
|
m_strMethod = nullptr;
|
||
|
|
m_strData = nullptr;
|
||
|
|
m_strFilePath = nullptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
void CHttpCommandParser::PrintCmdUsage()
|
||
|
|
{
|
||
|
|
switch(m_enAppType)
|
||
|
|
{
|
||
|
|
case AT_SERVER:
|
||
|
|
if(m_szCmdNameFuncs[CT_START].func)
|
||
|
|
PRINTLN("%-18s : %2s%s", "Start Up", "", (LPCTSTR)GetCmdUsage(CT_START));
|
||
|
|
if(m_szCmdNameFuncs[CT_STOP].func)
|
||
|
|
PRINTLN("%-18s : %3s%s", "Shut Down", "", (LPCTSTR)GetCmdUsage(CT_STOP));
|
||
|
|
if(m_szCmdNameFuncs[CT_STATUS].func)
|
||
|
|
PRINTLN("%-18s : %1s%s", "Show Status", "", (LPCTSTR)GetCmdUsage(CT_STATUS));
|
||
|
|
if(m_szCmdNameFuncs[CT_SEND].func)
|
||
|
|
PRINTLN("%-18s : %3s%s", "Send WS Message", "", (LPCTSTR)GetCmdUsage(CT_SEND));
|
||
|
|
if(m_szCmdNameFuncs[CT_PAUSE].func)
|
||
|
|
PRINTLN("%-18s : %2s%s", "Pause/Unpause Recv", "", (LPCTSTR)GetCmdUsage(CT_PAUSE));
|
||
|
|
if(m_szCmdNameFuncs[CT_KICK].func)
|
||
|
|
PRINTLN("%-18s : %3s%s", "Release Connection", "", (LPCTSTR)GetCmdUsage(CT_KICK));
|
||
|
|
if(m_szCmdNameFuncs[CT_KICK_L].func)
|
||
|
|
PRINTLN("%-18s : %2s%s", "Kick Long Conns", "", (LPCTSTR)GetCmdUsage(CT_KICK_L));
|
||
|
|
if(m_szCmdNameFuncs[CT_KICK_S].func)
|
||
|
|
PRINTLN("%-18s : %2s%s", "Kick Silence Conns", "", (LPCTSTR)GetCmdUsage(CT_KICK_S));
|
||
|
|
if(m_szCmdNameFuncs[CT_STAT].func)
|
||
|
|
PRINTLN("%-18s : %3s%s", "Stat R/S bytes", "", (LPCTSTR)GetCmdUsage(CT_STAT));
|
||
|
|
break;
|
||
|
|
case AT_AGENT:
|
||
|
|
if(m_szCmdNameFuncs[CT_START].func)
|
||
|
|
PRINTLN("%-18s : %2s%s", "Start Up", "", (LPCTSTR)GetCmdUsage(CT_START));
|
||
|
|
if(m_szCmdNameFuncs[CT_STOP].func)
|
||
|
|
PRINTLN("%-18s : %3s%s", "Shut Down", "", (LPCTSTR)GetCmdUsage(CT_STOP));
|
||
|
|
if(m_szCmdNameFuncs[CT_STATUS].func)
|
||
|
|
PRINTLN("%-18s : %1s%s", "Show Status", "", (LPCTSTR)GetCmdUsage(CT_STATUS));
|
||
|
|
if(m_szCmdNameFuncs[CT_CONNECT].func)
|
||
|
|
PRINTLN("%-18s : %s%s", "Connect To", "", (LPCTSTR)GetCmdUsage(CT_CONNECT));
|
||
|
|
if(m_szCmdNameFuncs[CT_SEND].func)
|
||
|
|
PRINTLN("%-18s : %3s%s", "Send Message", "", (LPCTSTR)GetCmdUsage(CT_SEND));
|
||
|
|
if(m_szCmdNameFuncs[CT_PAUSE].func)
|
||
|
|
PRINTLN("%-18s : %2s%s", "Pause/Unpause Recv", "", (LPCTSTR)GetCmdUsage(CT_PAUSE));
|
||
|
|
if(m_szCmdNameFuncs[CT_KICK].func)
|
||
|
|
PRINTLN("%-18s : %3s%s", "Kick Connection", "", (LPCTSTR)GetCmdUsage(CT_KICK));
|
||
|
|
if(m_szCmdNameFuncs[CT_KICK_L].func)
|
||
|
|
PRINTLN("%-18s : %2s%s", "Kick Long Conns", "", (LPCTSTR)GetCmdUsage(CT_KICK_L));
|
||
|
|
if(m_szCmdNameFuncs[CT_KICK_S].func)
|
||
|
|
PRINTLN("%-18s : %2s%s", "Kick Silence Conns", "", (LPCTSTR)GetCmdUsage(CT_KICK_S));
|
||
|
|
break;
|
||
|
|
case AT_CLIENT:
|
||
|
|
if(m_szCmdNameFuncs[CT_START].func)
|
||
|
|
PRINTLN("%-18s : %2s%s", "Start Up", "", (LPCTSTR)GetCmdUsage(CT_START));
|
||
|
|
if(m_szCmdNameFuncs[CT_STOP].func)
|
||
|
|
PRINTLN("%-18s : %3s%s", "Shut Down", "", (LPCTSTR)GetCmdUsage(CT_STOP));
|
||
|
|
if(m_szCmdNameFuncs[CT_STATUS].func)
|
||
|
|
PRINTLN("%-18s : %1s%s", "Show Status", "", (LPCTSTR)GetCmdUsage(CT_STATUS));
|
||
|
|
if(m_szCmdNameFuncs[CT_CONNECT].func)
|
||
|
|
PRINTLN("%-18s : %s%s", "Open URL", "", (LPCTSTR)GetCmdUsage(CT_CONNECT));
|
||
|
|
if(m_szCmdNameFuncs[CT_SEND].func)
|
||
|
|
PRINTLN("%-18s : %3s%s", "Send Message", "", (LPCTSTR)GetCmdUsage(CT_SEND));
|
||
|
|
if(m_szCmdNameFuncs[CT_PAUSE].func)
|
||
|
|
PRINTLN("%-18s : %2s%s", "Pause/Unpause Recv", "", (LPCTSTR)GetCmdUsage(CT_PAUSE));
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
ASSERT(FALSE);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
CString CHttpCommandParser::GetCmdUsage(CCommandParser::EnCmdType type)
|
||
|
|
{
|
||
|
|
CString strUsage = m_szCmdNameFuncs[type].name;
|
||
|
|
|
||
|
|
switch(type)
|
||
|
|
{
|
||
|
|
case CT_START:
|
||
|
|
if(m_enAppType != AT_SERVER)
|
||
|
|
strUsage += " [-s 0|1] # (s-0 - http, s-1 - https)";
|
||
|
|
break;
|
||
|
|
case CT_SEND:
|
||
|
|
if(m_enAppType == AT_SERVER)
|
||
|
|
strUsage += " {ConnID} [-s 0|1] -d {WS-Data} # (WS only, s-0 - ws, s-1 - wss)";
|
||
|
|
else
|
||
|
|
{
|
||
|
|
if(m_enAppType != AT_CLIENT)
|
||
|
|
strUsage += " {ConnID}";
|
||
|
|
strUsage += " [-x {Method}] [-p {Path}] [-h {Header}]* [-d {Data}] [-f {File}]";
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case CT_PAUSE:
|
||
|
|
if(m_enAppType != AT_CLIENT)
|
||
|
|
strUsage += " {ConnID}";
|
||
|
|
strUsage += " [0|1]";
|
||
|
|
if(m_enAppType == AT_SERVER)
|
||
|
|
strUsage += " [-s 0|1]";
|
||
|
|
strUsage += " # (0 - unpause, 1 - pause";
|
||
|
|
if(m_enAppType == AT_SERVER)
|
||
|
|
strUsage += ", s-0 - http, s-1 - https";
|
||
|
|
strUsage += ")";
|
||
|
|
break;
|
||
|
|
case CT_KICK:
|
||
|
|
if(m_enAppType == AT_CLIENT)
|
||
|
|
strUsage = nullptr;
|
||
|
|
else
|
||
|
|
{
|
||
|
|
strUsage += " {ConnID}";
|
||
|
|
if(m_enAppType == AT_SERVER)
|
||
|
|
strUsage += " [-s 0|1] # (s-0 - http, s-1 - https)";
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case CT_KICK_L:
|
||
|
|
case CT_KICK_S:
|
||
|
|
if(m_enAppType == AT_CLIENT)
|
||
|
|
strUsage = nullptr;
|
||
|
|
else
|
||
|
|
{
|
||
|
|
strUsage += " [{Seconds}]";
|
||
|
|
if(m_enAppType == AT_SERVER)
|
||
|
|
strUsage += " [-s 0|1] # (default: 60s, s-0 - http, s-1 - https)";
|
||
|
|
else
|
||
|
|
strUsage += " # (default: 60s)";
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case CT_CONNECT:
|
||
|
|
if(m_enAppType == AT_AGENT)
|
||
|
|
strUsage += " [{Host} {Port}]";
|
||
|
|
else if(m_enAppType == AT_CLIENT)
|
||
|
|
strUsage += " {URL} [-x {Method}] [-h {Header}]* [-d {Data}] [-f {File}] [-r 0|1] # (r-0 - reuse connection, r-1 - force reconnect)";
|
||
|
|
else
|
||
|
|
strUsage = nullptr;
|
||
|
|
break;
|
||
|
|
default :
|
||
|
|
;
|
||
|
|
}
|
||
|
|
|
||
|
|
return strUsage;
|
||
|
|
}
|
||
|
|
|
||
|
|
#endif
|
||
|
|
|
||
|
|
void server_statistics_info::Reset(BOOL bResetClientCount)
|
||
|
|
{
|
||
|
|
if(bResetClientCount)
|
||
|
|
m_lClientCount = 0L;
|
||
|
|
|
||
|
|
m_llTotalSent = 0L;
|
||
|
|
m_llTotalReceived = 0L;
|
||
|
|
}
|
||
|
|
|
||
|
|
void server_statistics_info::AddTotalRecv(int iLength)
|
||
|
|
{
|
||
|
|
::InterlockedExchangeAdd(&m_llTotalReceived, iLength);
|
||
|
|
}
|
||
|
|
|
||
|
|
void server_statistics_info::AddTotalSend(int iLength)
|
||
|
|
{
|
||
|
|
::InterlockedExchangeAdd(&m_llTotalSent, iLength);
|
||
|
|
}
|
||
|
|
|
||
|
|
void server_statistics_info::CheckClientCount()
|
||
|
|
{
|
||
|
|
if(m_lClientCount == 0)
|
||
|
|
{
|
||
|
|
CCriSecLock lock(m_cs);
|
||
|
|
|
||
|
|
if(m_lClientCount == 0)
|
||
|
|
{
|
||
|
|
Reset(FALSE);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
InterlockedIncrement(&m_lClientCount);
|
||
|
|
}
|
||
|
|
|
||
|
|
void server_statistics_info::CheckStatistics()
|
||
|
|
{
|
||
|
|
if(m_lClientCount > 0)
|
||
|
|
{
|
||
|
|
CCriSecLock lock(m_cs);
|
||
|
|
|
||
|
|
if(m_lClientCount > 0)
|
||
|
|
{
|
||
|
|
::InterlockedDecrement(&m_lClientCount);
|
||
|
|
|
||
|
|
if(m_lClientCount == 0)
|
||
|
|
{
|
||
|
|
::WaitFor(500L);
|
||
|
|
::PostServerStatics((LONGLONG)m_llTotalSent, (LONGLONG)m_llTotalReceived);
|
||
|
|
|
||
|
|
printf("> ");
|
||
|
|
fflush(stdout);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void client_statistics_info::Reset()
|
||
|
|
{
|
||
|
|
m_iConnected = 0;
|
||
|
|
m_dwBeginTickCount = 0;
|
||
|
|
m_dwTimeconsuming = 0;
|
||
|
|
m_llTotalReceived = 0;
|
||
|
|
m_llTotalSent = 0;
|
||
|
|
m_llExpectReceived = (LONGLONG)g_app_arg.test_times * (LONGLONG)g_app_arg.conn_count * (LONGLONG)g_app_arg.data_length;
|
||
|
|
}
|
||
|
|
|
||
|
|
void client_statistics_info::StartTest()
|
||
|
|
{
|
||
|
|
m_dwBeginTickCount = ::TimeGetTime();
|
||
|
|
}
|
||
|
|
|
||
|
|
void client_statistics_info::AddTotalRecv(int iLength)
|
||
|
|
{
|
||
|
|
::InterlockedExchangeAdd(&m_llTotalReceived, iLength);
|
||
|
|
|
||
|
|
if(m_llTotalReceived == m_llExpectReceived)
|
||
|
|
{
|
||
|
|
m_dwTimeconsuming = ::GetTimeGap32(m_dwBeginTickCount);
|
||
|
|
::PostTimeConsuming(m_dwTimeconsuming);
|
||
|
|
|
||
|
|
printf("> ");
|
||
|
|
fflush(stdout);
|
||
|
|
}
|
||
|
|
|
||
|
|
ASSERT(m_llTotalReceived <= m_llExpectReceived);
|
||
|
|
}
|
||
|
|
|
||
|
|
void client_statistics_info::AddTotalSend(int iLength)
|
||
|
|
{
|
||
|
|
::InterlockedExchangeAdd(&m_llTotalSent, iLength);
|
||
|
|
}
|
||
|
|
|
||
|
|
void client_statistics_info::TermConnected()
|
||
|
|
{
|
||
|
|
if(m_iConnected >= 0)
|
||
|
|
m_iConnected = -0xFFFFFF;
|
||
|
|
}
|
||
|
|
|
||
|
|
void client_statistics_info::AddConnected()
|
||
|
|
{
|
||
|
|
::InterlockedIncrement(&m_iConnected);
|
||
|
|
}
|
||
|
|
|
||
|
|
int client_statistics_info::GetConnected()
|
||
|
|
{
|
||
|
|
return m_iConnected;
|
||
|
|
}
|
||
|
|
|
||
|
|
void client_statistics_info::CheckStatistics(BOOL bCheckSend)
|
||
|
|
{
|
||
|
|
::WaitFor(100L);
|
||
|
|
|
||
|
|
CString strMsg;
|
||
|
|
strMsg.Format( _T("*** Summary: expect - %lld, send - %lld, recv - %lld ***"),
|
||
|
|
m_llExpectReceived, m_llTotalSent, m_llTotalReceived);
|
||
|
|
|
||
|
|
::LogMsg(strMsg);
|
||
|
|
|
||
|
|
if(m_llExpectReceived == m_llTotalReceived && (!bCheckSend || m_llTotalSent == m_llExpectReceived))
|
||
|
|
strMsg.Format(_T("*** Success: time consuming - %u millisecond ! ***"), m_dwTimeconsuming);
|
||
|
|
else
|
||
|
|
strMsg.Format(_T("*** Fail: manual terminated ? (or data lost) ***"));
|
||
|
|
|
||
|
|
::LogMsg(strMsg);
|
||
|
|
}
|
||
|
|
|
||
|
|
info_msg* info_msg::Construct(CONNID dwConnID, LPCTSTR lpszEvent, int iContentLength, LPCTSTR lpszContent, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
return new info_msg(dwConnID, lpszEvent, iContentLength, lpszContent, lpszName);
|
||
|
|
}
|
||
|
|
|
||
|
|
void info_msg::Destruct(info_msg* pMsg)
|
||
|
|
{
|
||
|
|
delete pMsg;
|
||
|
|
}
|
||
|
|
|
||
|
|
info_msg::info_msg(CONNID dwConnID, LPCTSTR lpszEvent, int iContentLength, LPCTSTR lpszContent, LPCTSTR lpszName)
|
||
|
|
: connID(dwConnID), evt(lpszEvent), contentLength(iContentLength), content(lpszContent), name(nullptr)
|
||
|
|
{
|
||
|
|
if(lpszName)
|
||
|
|
{
|
||
|
|
int len = lstrlen(lpszName);
|
||
|
|
|
||
|
|
if(len > 0)
|
||
|
|
{
|
||
|
|
name = new TCHAR[len + 1];
|
||
|
|
memcpy((LPSTR)name, lpszName, (len + 1) * sizeof(TCHAR));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
info_msg::~info_msg()
|
||
|
|
{
|
||
|
|
if(name)
|
||
|
|
delete[] name;
|
||
|
|
|
||
|
|
if(contentLength > 0)
|
||
|
|
delete[] content;
|
||
|
|
}
|
||
|
|
|
||
|
|
inline CString SafeString(LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString str(lpszName);
|
||
|
|
|
||
|
|
if(lpszName) str.AppendChar(' ');
|
||
|
|
|
||
|
|
return str;
|
||
|
|
}
|
||
|
|
|
||
|
|
inline CString SafeString2(LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString str(lpszName);
|
||
|
|
|
||
|
|
if(lpszName) str.Append(_T(" #"));
|
||
|
|
|
||
|
|
return str;
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogServerStart(LPCTSTR lpszAddress, USHORT port, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sServer Start OK --> (%s#%d)"), (LPCTSTR)SafeString(lpszName), lpszAddress, port);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogServerStartFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sServer Start Fail --> %s (%d) [%d]"), (LPCTSTR)SafeString(lpszName), lpszDesc, code, ::GetLastError());
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogServerStop(LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sServer Stop"), (LPCTSTR)SafeString(lpszName));
|
||
|
|
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogServerStopFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sServer Stop Fail --> %s (%d)"), (LPCTSTR)SafeString(lpszName), lpszDesc, code);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogAgentStart(LPCTSTR lpszAddress, BOOL bAsync, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
if(!lpszAddress || lpszAddress[0] == 0)
|
||
|
|
lpszAddress = _T("***");
|
||
|
|
|
||
|
|
char c = bAsync ? 'A' : 'S';
|
||
|
|
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sAgent Start OK --> (%s - %c)"), (LPCTSTR)SafeString(lpszName), lpszAddress, c);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogAgentStarting(LPCTSTR lpszAddress, BOOL bAsync, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
if(!lpszAddress || lpszAddress[0] == 0)
|
||
|
|
lpszAddress = _T("***");
|
||
|
|
|
||
|
|
char c = bAsync ? 'A' : 'S';
|
||
|
|
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sAgent Starting --> (%s - %d)"), (LPCTSTR)SafeString(lpszName), lpszAddress, c);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogAgentStartFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sAgent Start Fail --> %s (%d) [%d]"), (LPCTSTR)SafeString(lpszName), lpszDesc, code, ::GetLastError());
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogAgentStopping(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sAgent Stopping --> (%zu)"), (LPCTSTR)SafeString(lpszName), dwConnID);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogAgentStop(LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sAgent Stop"), (LPCTSTR)SafeString(lpszName));
|
||
|
|
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogAgentStopFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sAgent Stop Fail --> %s (%d) [%d]"), (LPCTSTR)SafeString(lpszName), lpszDesc, code, ::GetLastError());
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogAgentSendFail(int iSequence, int iSocketIndex, DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sAgent Send Fail [SOCK: %d, SEQ: %d] --> %s (%d)"), (LPCTSTR)SafeString(lpszName), iSocketIndex, iSequence, lpszDesc, code);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogClientStart(LPCTSTR lpszAddress, USHORT port, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sClient Start OK --> (%s#%d)"), (LPCTSTR)SafeString(lpszName), lpszAddress, port);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogClientStarting(LPCTSTR lpszAddress, USHORT port, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sClient Starting --> (%s#%d)"), (LPCTSTR)SafeString(lpszName), lpszAddress, port);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogClientStartFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sClient Start Fail --> %s (%d) [%d]"), (LPCTSTR)SafeString(lpszName), lpszDesc, code, ::GetLastError());
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogClientStopping(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sClient Stopping --> (%zu)"), (LPCTSTR)SafeString(lpszName), dwConnID);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogClientStop(LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sClient Stop"), (LPCTSTR)SafeString(lpszName));
|
||
|
|
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogClientStopFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sClient Stop Fail --> %s (%d) [%d]"), (LPCTSTR)SafeString(lpszName), lpszDesc, code, ::GetLastError());
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogClientSendFail(int iSequence, int iSocketIndex, DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sClient Send Fail [SOCK: %d, SEQ: %d] --> %s (%d)"), (LPCTSTR)SafeString(lpszName), iSocketIndex, iSequence, lpszDesc, code);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogStart(LPCTSTR lpszAddress, USHORT port, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sStart OK --> (%s#%d)"), (LPCTSTR)SafeString(lpszName), lpszAddress, port);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogStartFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sStart Fail --> %s (%d) [%d]"), (LPCTSTR)SafeString(lpszName), lpszDesc, code, ::GetLastError());
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogStop(LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sStop"), (LPCTSTR)SafeString(lpszName));
|
||
|
|
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogSend(CONNID dwConnID, LPCTSTR lpszContent, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %s%zu Send OK --> %s"), (LPCTSTR)SafeString2(lpszName), dwConnID, lpszContent);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogSend(LPCTSTR lpszContent, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sSend OK --> %s"), (LPCTSTR)SafeString(lpszName), lpszContent);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogSending(CONNID dwConnID, LPCTSTR lpszContent, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %s%zu Sending --> %s"), (LPCTSTR)SafeString2(lpszName), dwConnID, lpszContent);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogSendFail(CONNID dwConnID, DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %s%zu Send Fail --> %s (%d)"), (LPCTSTR)SafeString2(lpszName), dwConnID, lpszDesc, code);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogSendFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sSend Fail --> %s (%d)"), (LPCTSTR)SafeString(lpszName), lpszDesc, code);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogDisconnect(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %s%zu, Disconnect OK"), (LPCTSTR)SafeString2(lpszName), dwConnID);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogDisconnectFail(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %s%zu, Disconnect Fail"), (LPCTSTR)SafeString2(lpszName), dwConnID);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogDisconnect2(CONNID dwConnID, BOOL bForce, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %s%zu, Disconnect OK (%c)"), (LPCTSTR)SafeString2(lpszName), dwConnID, bForce ? 'F' : 'N');
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogDisconnectFail2(CONNID dwConnID, BOOL bForce, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %s%zu, Disconnect Fail (%c)"), (LPCTSTR)SafeString2(lpszName), dwConnID, bForce ? 'F' : 'N');
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogDisconnectLong(DWORD dwSeconds, BOOL bForce, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sDisconnect OK (%us, %c)"), (LPCTSTR)SafeString(lpszName), dwSeconds, bForce ? 'F' : 'N');
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogDisconnectFailLong(DWORD dwSeconds, BOOL bForce, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sDisconnect Fail (%us, %c)"), (LPCTSTR)SafeString(lpszName), dwSeconds, bForce ? 'F' : 'N');
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogPause(CONNID dwConnID, BOOL bPause, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %s%zu, %s OK"), (LPCTSTR)SafeString2(lpszName), dwConnID, bPause ? "Pause" : "Unpause");
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogPauseFail(CONNID dwConnID, BOOL bPause, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %s%zu, %s Fail --> %s (%d)"), (LPCTSTR)SafeString2(lpszName), dwConnID, bPause ? "Pause" : "Unpause", ::GetLastErrorStr(), ::GetLastError());
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogConnect(LPCTSTR lpszAddress, USHORT usPort, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sConnecting to %s#%d ..."), (LPCTSTR)SafeString(lpszName), lpszAddress, usPort);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogConnectFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %sConnect Fail --> %s (%d)"), (LPCTSTR)SafeString(lpszName), lpszDesc, code);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogRelease(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %s%zu, Release OK"), (LPCTSTR)SafeString2(lpszName), dwConnID);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogReleaseFail(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %s%zu, Release Fail"), (LPCTSTR)SafeString2(lpszName), dwConnID);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogDetect(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %s%zu, Detect Connection OK"), (LPCTSTR)SafeString2(lpszName), dwConnID);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogDetectFail(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T("# %s%zu, Detect Connection Fail"), (LPCTSTR)SafeString2(lpszName), dwConnID);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogOnConnect(CONNID dwConnID, const CString& strAddress, USHORT usPort, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[100];
|
||
|
|
wsprintf(lpszContent, _T("local address: %s#%d"), (LPCTSTR)strAddress, usPort);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CONNECT, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
LogInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogOnConnect2(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T(" > [ %s%zu, %s ]"), (LPCTSTR)SafeString2(lpszName), dwConnID, EVT_ON_CONNECT);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogOnConnect3(CONNID dwConnID, const CString& strAddress, USHORT usPort, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[100];
|
||
|
|
wsprintf(lpszContent, _T("remote address: %s#%d"), (LPCTSTR)strAddress, usPort);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CONNECT, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
LogInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogOnHandShake2(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
msg.Format(_T(" > [ %s%zu, %s ]"), (LPCTSTR)SafeString2(lpszName), dwConnID, EVT_ON_HAND_SHAKE);
|
||
|
|
LogMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogOnClose(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CLOSE, 0, nullptr, lpszName);
|
||
|
|
|
||
|
|
LogInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnSend(CONNID dwConnID, const BYTE* pData, int iLength, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[20];
|
||
|
|
wsprintf(lpszContent, _T("(%d bytes)"), iLength);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_SEND, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnSendTo(CONNID dwConnID, LPCTSTR lpszAddress, USHORT usPort, const BYTE* pData, int iLength, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[100];
|
||
|
|
wsprintf(lpszContent, _T("<%s#%d> (%d bytes)"), lpszAddress, usPort, iLength);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_SEND, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnReceive(CONNID dwConnID, const BYTE* pData, int iLength, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[20];
|
||
|
|
wsprintf(lpszContent, _T("(%d bytes)"), iLength);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_RECEIVE, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnReceiveFrom(CONNID dwConnID, LPCTSTR lpszAddress, USHORT usPort, const BYTE* pData, int iLength, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[100];
|
||
|
|
wsprintf(lpszContent, _T("<%s#%d> (%d bytes)"), lpszAddress, usPort, iLength);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_RECEIVE, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnReceiveCast(CONNID dwConnID, LPCTSTR lpszAddress, USHORT usPort, const BYTE* pData, int iLength, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[100];
|
||
|
|
wsprintf(lpszContent, _T("<%s#%d> (%d bytes)"), lpszAddress, usPort, iLength);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_RECEIVE, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnClose(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CLOSE, 0, nullptr, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnError(CONNID dwConnID, int enOperation, int iErrorCode, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[100];
|
||
|
|
wsprintf(lpszContent, _T("OP: %d, CODE: %d"), enOperation, iErrorCode);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_ERROR, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnError2(CONNID dwConnID, int enOperation, int iErrorCode, LPCTSTR lpszAddress, USHORT usPort, const BYTE* pBuffer, int iLength, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[150];
|
||
|
|
wsprintf(lpszContent, _T("<%s#%d> OP: %d, CODE: %d (DATA: 0x%X, LEN: %d>"), lpszAddress, usPort, enOperation, iErrorCode, pBuffer, iLength);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_ERROR, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnAccept(CONNID dwConnID, LPCTSTR lpszAddress, USHORT usPort, BOOL bPass, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[100];
|
||
|
|
wsprintf(lpszContent, _T("%s (%s#%d)"), bPass ? _T("PASS") : _T("REJECT"), lpszAddress, usPort);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_ACCEPT, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnAccept2(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_ACCEPT, 0, nullptr, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnHandShake(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_HAND_SHAKE, 0, nullptr, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnPrepareListen(LPCTSTR lpszAddress, USHORT usPort, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[100];
|
||
|
|
wsprintf(lpszContent, _T("bind address: %s#%d"), lpszAddress, usPort);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(0, EVT_ON_PREPARE_LISTEN, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
LogInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnPrepareConnect(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_PREPARE_CONNECT, 0, nullptr, lpszName);
|
||
|
|
|
||
|
|
LogInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnConnect(CONNID dwConnID, LPCTSTR lpszAddress, USHORT usPort, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[100];
|
||
|
|
wsprintf(lpszContent, _T("local address: %s#%d"), lpszAddress, usPort);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CONNECT, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnConnect2(CONNID dwConnID, LPCTSTR lpszAddress, USHORT usPort, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[100];
|
||
|
|
wsprintf(lpszContent, _T("remote address: %s#%d"), lpszAddress, usPort);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CONNECT, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnConnect3(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CONNECT, 0, nullptr, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnShutdown(LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
info_msg* msg = info_msg::Construct(0, EVT_ON_SHUTDOWN, 0, nullptr, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostServerStatics(const LONGLONG& llTotalSent, const LONGLONG& llTotalReceived, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[100];
|
||
|
|
wsprintf(lpszContent, _T("*** Summary: send - %lld, recv - %lld ***"), llTotalSent, llTotalReceived);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(0, EVT_ON_END_TEST, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostServerTemporaryStatics(const LONGLONG& llTotalSent, const LONGLONG& llTotalReceived, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[100];
|
||
|
|
wsprintf(lpszContent, _T("*** Summary: send - %lld, recv - %lld ***"), llTotalSent, llTotalReceived);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(0, EVT_ON_STAT_TEST, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostTimeConsuming(DWORD dwTickCount, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[100];
|
||
|
|
wsprintf(lpszContent, _T("Total Time Consuming: %u"), dwTickCount);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(0, EVT_ON_END_TEST, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
#ifdef _NEED_HTTP
|
||
|
|
|
||
|
|
void PostOnMessageBegin(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_MESSAGE_BEGIN, 0, nullptr, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnRequestLine(CONNID dwConnID, LPCSTR lpszMethod, USHORT usUrlFieldSet, LPCSTR lpszUrl, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
USES_CONVERSION;
|
||
|
|
|
||
|
|
int content_len = (int)(strlen(lpszMethod) + strlen(lpszUrl) + 20);
|
||
|
|
LPTSTR lpszContent = new TCHAR[content_len];
|
||
|
|
|
||
|
|
wsprintf(lpszContent, _T("[%s/0x%02X] : %s"), A2T(lpszMethod), usUrlFieldSet, A2T(lpszUrl));
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_REQUEST_LINE, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnStatusLine(CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
USES_CONVERSION;
|
||
|
|
|
||
|
|
int content_len = (int)(strlen(lpszDesc) + 10);
|
||
|
|
LPTSTR lpszContent = new TCHAR[content_len];
|
||
|
|
|
||
|
|
wsprintf(lpszContent, _T("(%u) : %s"), usStatusCode, A2T(lpszDesc));
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_STATUS_LINE, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnHeader(CONNID dwConnID, LPCSTR lpszHeaderName, LPCSTR lpszHeaderValue, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
USES_CONVERSION;
|
||
|
|
|
||
|
|
int content_len = (int)(strlen(lpszHeaderName) + strlen(lpszHeaderValue) + 10);
|
||
|
|
LPTSTR lpszContent = new TCHAR[content_len];
|
||
|
|
|
||
|
|
wsprintf(lpszContent, _T("%s: %s"), A2T(lpszHeaderName), A2T(lpszHeaderValue));
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_HEADER, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnHeadersComplete(CONNID dwConnID, LPCSTR lpszSummary, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
USES_CONVERSION;
|
||
|
|
|
||
|
|
static LPCTSTR PREFIX = _T("* * * * * * * * * Summary * * * * * * * * *\r\n");
|
||
|
|
static int PREFIX_LEN = lstrlen(PREFIX);
|
||
|
|
|
||
|
|
LPCTSTR lpszSummaryT = A2CT(lpszSummary);
|
||
|
|
|
||
|
|
|
||
|
|
int content_len = lstrlen(lpszSummaryT) + PREFIX_LEN + 1;
|
||
|
|
LPTSTR lpszContent = new TCHAR[content_len];
|
||
|
|
|
||
|
|
memcpy(lpszContent, PREFIX, PREFIX_LEN * sizeof(TCHAR));
|
||
|
|
memcpy(lpszContent + PREFIX_LEN, lpszSummaryT, (content_len - PREFIX_LEN) * sizeof(TCHAR));
|
||
|
|
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_HEADERS_COMPLETE, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnBody(CONNID dwConnID, const BYTE* pData, int iLength, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[20];
|
||
|
|
wsprintf(lpszContent, _T("(%d bytes)"), iLength);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_BODY, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnChunkHeader(CONNID dwConnID, int iLength, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[20];
|
||
|
|
wsprintf(lpszContent, _T("(%d bytes)"), iLength);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CHUNK_HEADER, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnChunkComplete(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CHUNK_COMPLETE, 0, nullptr, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnMessageComplete(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_MESSAGE_COMPLETE, 0, nullptr, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnUpgrade(CONNID dwConnID, EnHttpUpgradeType enUpgradeType, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[20];
|
||
|
|
wsprintf(lpszContent, _T("(type: %d)"), enUpgradeType);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_UPGRADE, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnParseError(CONNID dwConnID, int iErrorCode, LPCSTR lpszErrorDesc, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
USES_CONVERSION;
|
||
|
|
|
||
|
|
int content_len = (int)(strlen(lpszErrorDesc) + 10);
|
||
|
|
LPTSTR lpszContent = new TCHAR[content_len];
|
||
|
|
|
||
|
|
wsprintf(lpszContent, _T("(%i) : %s"), iErrorCode, A2T(lpszErrorDesc));
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_PARSE_ERROR, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnWSMessageHeader(CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[100];
|
||
|
|
wsprintf(lpszContent, _T("(fin: %d, rsv: 0x%x, oc: 0x%x, mask: %d, len: %lld)"), bFinal, iReserved, iOperationCode, lpszMask ? 1 : 0, ullBodyLen);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_WS_MSG_HEADER, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnWSMessageBody(CONNID dwConnID, const BYTE* pData, int iLength, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[20];
|
||
|
|
wsprintf(lpszContent, _T("(%d bytes)"), iLength);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_WS_MSG_BODY, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostOnWSMessageComplete(CONNID dwConnID, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_WS_MSG_COMPLETE, 0, nullptr, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostUncompressBody(CONNID dwConnID, int iLength, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[40];
|
||
|
|
wsprintf(lpszContent, _T("(%d bytes)"), iLength);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_UNCOMPRESS_BODY, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void PostUncompressBodyFail(CONNID dwConnID, int iResult, LPCTSTR lpszName)
|
||
|
|
{
|
||
|
|
LPTSTR lpszContent = new TCHAR[40];
|
||
|
|
wsprintf(lpszContent, _T("(rs: %d)"), iResult);
|
||
|
|
int content_len = lstrlen(lpszContent);
|
||
|
|
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_UNCOMPRESS_BODY_FAIL, content_len, lpszContent, lpszName);
|
||
|
|
|
||
|
|
PostInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
#endif
|
||
|
|
|
||
|
|
void PostInfoMsg(info_msg* msg)
|
||
|
|
{
|
||
|
|
LogInfoMsg(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogInfoMsg(info_msg* pInfoMsg)
|
||
|
|
{
|
||
|
|
CString msg;
|
||
|
|
|
||
|
|
if(pInfoMsg->name)
|
||
|
|
{
|
||
|
|
if(pInfoMsg->connID > 0)
|
||
|
|
{
|
||
|
|
if(pInfoMsg->contentLength > 0)
|
||
|
|
msg.Format(_T("[ %s #%zu, %s ] -> %s"), pInfoMsg->name, pInfoMsg->connID, pInfoMsg->evt, pInfoMsg->content);
|
||
|
|
else
|
||
|
|
msg.Format(_T("[ %s #%zu, %s ]"), pInfoMsg->name, pInfoMsg->connID, pInfoMsg->evt);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
if(pInfoMsg->contentLength > 0)
|
||
|
|
msg.Format(_T("[ %s - %s ] -> %s"), pInfoMsg->name, pInfoMsg->evt, pInfoMsg->content);
|
||
|
|
else
|
||
|
|
msg.Format(_T("[ %s - %s ]"), pInfoMsg->name, pInfoMsg->evt);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
if(pInfoMsg->connID > 0)
|
||
|
|
{
|
||
|
|
if(pInfoMsg->contentLength > 0)
|
||
|
|
msg.Format(_T("[ %zu, %s ] -> %s"), pInfoMsg->connID, pInfoMsg->evt, pInfoMsg->content);
|
||
|
|
else
|
||
|
|
msg.Format(_T("[ %zu, %s ]"), pInfoMsg->connID, pInfoMsg->evt);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
if(pInfoMsg->contentLength > 0)
|
||
|
|
msg.Format(_T("[ %s ] -> %s"), pInfoMsg->evt, pInfoMsg->content);
|
||
|
|
else
|
||
|
|
msg.Format(_T("[ %s ]"), pInfoMsg->evt);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
LogMsg(msg);
|
||
|
|
|
||
|
|
info_msg::Destruct(pInfoMsg);
|
||
|
|
}
|
||
|
|
|
||
|
|
void LogMsg(const CString& msg)
|
||
|
|
{
|
||
|
|
puts(msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
BOOL SplitStr(LPCTSTR lpszSrc, vector<CString>& vtItem, LPCTSTR pszSepectors, LPCTSTR pszQMarks)
|
||
|
|
{
|
||
|
|
vtItem.clear();
|
||
|
|
|
||
|
|
CString strQMarks = pszQMarks;
|
||
|
|
CString strSepectors = pszSepectors;
|
||
|
|
|
||
|
|
if(strSepectors.IsEmpty())
|
||
|
|
strSepectors = _T(" ");
|
||
|
|
|
||
|
|
if(!strQMarks.IsEmpty())
|
||
|
|
if(strQMarks.FindOneOf(strSepectors) != -1)
|
||
|
|
return FALSE;
|
||
|
|
|
||
|
|
BOOL bRetVal = TRUE;
|
||
|
|
CString strSrc = lpszSrc;
|
||
|
|
|
||
|
|
while(!strSrc.Trim(strSepectors).IsEmpty())
|
||
|
|
{
|
||
|
|
CString strItem;
|
||
|
|
|
||
|
|
int iSrcLen = strSrc.GetLength();
|
||
|
|
int iPos1 = strSrc.FindOneOf(strSepectors);
|
||
|
|
int iPos2 = !strQMarks.IsEmpty() ? strSrc.FindOneOf(strQMarks) : -1;
|
||
|
|
int iPos3 = -1;
|
||
|
|
|
||
|
|
if(iPos1 == -1 && iPos2 == -1)
|
||
|
|
strItem = strSrc;
|
||
|
|
else if(iPos1 != -1 && (iPos1 < iPos2 || iPos2 == -1))
|
||
|
|
strItem = strSrc.Left(iPos1);
|
||
|
|
else // (iPos1 > iPos2 || iPos1 == -1)
|
||
|
|
{
|
||
|
|
TCHAR tc = strSrc[iPos2];
|
||
|
|
iPos3 = strSrc.Find(tc, iPos2 + 1);
|
||
|
|
if(iPos3 != -1)
|
||
|
|
strItem = strSrc.Mid(iPos2 + 1, iPos3 - iPos2 - 1);
|
||
|
|
else
|
||
|
|
{
|
||
|
|
vtItem.clear();
|
||
|
|
bRetVal = FALSE;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
vtItem.push_back(strItem);
|
||
|
|
|
||
|
|
strSrc = strSrc.Right(iPos3 == -1 ? (iSrcLen - (iPos1 == -1 ? strItem.GetLength() : iPos1 + 1)) : (iSrcLen - iPos3 - 1));
|
||
|
|
}
|
||
|
|
|
||
|
|
return bRetVal;
|
||
|
|
}
|
||
|
|
|
||
|
|
sa_family_t GuessAddrFamily(LPCTSTR lpszAddress)
|
||
|
|
{
|
||
|
|
if (!lpszAddress || lpszAddress[0] == 0)
|
||
|
|
return AF_UNSPEC;
|
||
|
|
|
||
|
|
if(::StrChr(lpszAddress, ':'))
|
||
|
|
return AF_INET6;
|
||
|
|
|
||
|
|
TCHAR c;
|
||
|
|
int arr[4];
|
||
|
|
|
||
|
|
if(stscanf(lpszAddress, _T("%d.%d.%d.%d%c"), &arr[0], &arr[1], &arr[2], &arr[3], &c) != 4)
|
||
|
|
return AF_UNSPEC;
|
||
|
|
|
||
|
|
for(int i = 0; i < 4; i++)
|
||
|
|
{
|
||
|
|
if(arr[i] < 0 || arr[i] > 255)
|
||
|
|
return AF_UNSPEC;
|
||
|
|
}
|
||
|
|
|
||
|
|
return AF_INET;
|
||
|
|
}
|
||
|
|
|
||
|
|
CBufferPtr* GeneratePkgBuffer(DWORD seq, LPCTSTR lpszName, short age, LPCTSTR lpszDesc)
|
||
|
|
{
|
||
|
|
USES_CONVERSION;
|
||
|
|
|
||
|
|
LPCSTR name = T2A((LPTSTR)lpszName);
|
||
|
|
LPCSTR desc = T2A((LPTSTR)lpszDesc);
|
||
|
|
int desc_len = (int)strlen(desc) + 1;
|
||
|
|
int body_len = (int)offsetof(TPkgBody, desc) + desc_len;
|
||
|
|
|
||
|
|
TPkgBody* pBody = (TPkgBody*)alloca(body_len);
|
||
|
|
memset(pBody, 0, body_len);
|
||
|
|
|
||
|
|
pBody->age = age;
|
||
|
|
strcpy(pBody->name, name);
|
||
|
|
strcpy(pBody->desc, desc);
|
||
|
|
|
||
|
|
TPkgHeader header;
|
||
|
|
header.seq = seq;
|
||
|
|
header.body_len = body_len;
|
||
|
|
|
||
|
|
return GeneratePkgBuffer(header, *pBody);
|
||
|
|
}
|
||
|
|
|
||
|
|
CBufferPtr* GeneratePkgBuffer(const TPkgHeader& header, const TPkgBody& body)
|
||
|
|
{
|
||
|
|
int header_len = sizeof(TPkgHeader);
|
||
|
|
int body_len = header.body_len;
|
||
|
|
|
||
|
|
CBufferPtr* pBuffer = new CBufferPtr(header_len + body_len);
|
||
|
|
|
||
|
|
memcpy(pBuffer->Ptr(), (BYTE*)&header, header_len);
|
||
|
|
memcpy(pBuffer->Ptr() + header_len, (BYTE*)&body, body_len);
|
||
|
|
|
||
|
|
return pBuffer;
|
||
|
|
}
|
||
|
|
|
||
|
|
LPCTSTR GetLoopbackAddress(LPCTSTR lpszLikeAddress)
|
||
|
|
{
|
||
|
|
sa_family_t f = GuessAddrFamily(lpszLikeAddress);
|
||
|
|
|
||
|
|
if(f == AF_INET)
|
||
|
|
return IPV4_LOOPBACK_ADDRESS;
|
||
|
|
if(f == AF_INET6)
|
||
|
|
return IPV6_LOOPBACK_ADDRESS;
|
||
|
|
|
||
|
|
return nullptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
LPCTSTR GetAnyAddress(LPCTSTR lpszLikeAddress)
|
||
|
|
{
|
||
|
|
sa_family_t f = GuessAddrFamily(lpszLikeAddress);
|
||
|
|
|
||
|
|
if(f == AF_INET)
|
||
|
|
return IPV4_ANY_ADDRESS;
|
||
|
|
if(f == AF_INET6)
|
||
|
|
return IPV6_ANY_ADDRESS;
|
||
|
|
|
||
|
|
return nullptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
LPCTSTR g_lpszDefaultCookieFile = GetDefaultCookieFile();
|
||
|
|
|
||
|
|
LPCTSTR GetDefaultCookieFile()
|
||
|
|
{
|
||
|
|
static TCHAR c_szCookieFile[MAX_PATH] = {0};
|
||
|
|
|
||
|
|
if(c_szCookieFile[0] == 0)
|
||
|
|
{
|
||
|
|
CString strName = ::GetModuleFileName();
|
||
|
|
ASSERT(!strName.IsEmpty());
|
||
|
|
|
||
|
|
strName.Append(".cki");
|
||
|
|
lstrcpy(c_szCookieFile, strName);
|
||
|
|
}
|
||
|
|
|
||
|
|
return c_szCookieFile;
|
||
|
|
}
|
||
|
|
|
||
|
|
#ifdef _NEED_SSL
|
||
|
|
|
||
|
|
#include "../../src/common/FuncHelper.h"
|
||
|
|
|
||
|
|
#define SSL_CERT_RELATIVE_PATH_1 _T("/hp-ssl-cert/")
|
||
|
|
#define SSL_CERT_RELATIVE_PATH_2 _T("/../../ssl-cert/")
|
||
|
|
|
||
|
|
LPCSTR g_c_lpszPemCert =
|
||
|
|
"-----BEGIN CERTIFICATE-----\n"
|
||
|
|
"MIIDszCCApugAwIBAgIBATANBgkqhkiG9w0BAQsFADB7MQswCQYDVQQGEwJDTjEL\n"
|
||
|
|
"MAkGA1UECAwCR0QxCzAJBgNVBAcMAkdaMQwwCgYDVQQKDANTU1QxDzANBgNVBAsM\n"
|
||
|
|
"Bkplc3NtYTETMBEGA1UEAwwKamVzc21hLm9yZzEeMBwGCSqGSIb3DQEJARYPbGRj\n"
|
||
|
|
"c2FhQDIxY24uY29tMCAXDTI0MDYyNjA1MjUwOFoYDzIyNDMwNzA5MDUyNTA4WjBu\n"
|
||
|
|
"MQswCQYDVQQGEwJDTjELMAkGA1UECAwCR0QxDDAKBgNVBAoMA1NTVDEPMA0GA1UE\n"
|
||
|
|
"CwwGSmVzc21hMRMwEQYDVQQDDApqZXNzbWEub3JnMR4wHAYJKoZIhvcNAQkBFg9s\n"
|
||
|
|
"ZGNzYWFAMjFjbi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCD\n"
|
||
|
|
"+MyrJEKCheRoOpMRjR78S8hr9W7XN0/EZWyVKwXRT7EE0aGiQdH/W2a+qpWRMa6E\n"
|
||
|
|
"Qi47zdBnt0P8ZoFiItQhuhwUJ064afpVoaHHX25UdbF8r+sRTofadughETBBj2Cf\n"
|
||
|
|
"qh0ia6EOB0QvpJpywWmGZPoMtypjbUiTb/YGOJh2qsVr67MN/E48vt7qt0VxF9SE\n"
|
||
|
|
"pucvqhraTBljWCeRVCae2c0yBSpq/n+7NhamK7+g3xxCKWRz4pN3wrIoEsXTboTh\n"
|
||
|
|
"z940caDgthCc23VJ080DN44jZg6c87huKIuxbebJqw2HCM4DwrW+OSzTLszpFAXZ\n"
|
||
|
|
"yarllOzWnBut20zmYnl1AgMBAAGjTTBLMAkGA1UdEwQCMAAwHQYDVR0OBBYEFJ5E\n"
|
||
|
|
"RJmJ4pUzEbcU9Yge6nr0oi51MB8GA1UdIwQYMBaAFN49z48DywmoD4cNTQgC6nn2\n"
|
||
|
|
"QJoUMA0GCSqGSIb3DQEBCwUAA4IBAQBpoSFfDDDKMAy95tSROpYu5WSWQXe6B7kl\n"
|
||
|
|
"PGJAF6mWe/4b7jHQqDUVkEmFmbMWUAtpTC3P01TrV77dhIosAnC/B76fb7Pto8W4\n"
|
||
|
|
"cjGpWAT0sSegZuhnLtguTGlnR0vVSh/yRRDEtjN8loWpu3BLWVHYOKnn62QGfY0B\n"
|
||
|
|
"sRGrfZsKvwB+1w+HOvGopnWv6UYwrzEKthjPMR65rOsoManOv24ua8baJmq0gqF9\n"
|
||
|
|
"752kD8n703uWUBx79/QlNIPMZC1iUIi1mEjyrTgSag6+3sWAIKihaoF/Nf9d01nw\n"
|
||
|
|
"iL16EIT5dJ0QJWDCeIxhuTZckw+gL1pBeQU7pqzKHPnvo+8GBnTG\n"
|
||
|
|
"-----END CERTIFICATE-----\n";
|
||
|
|
|
||
|
|
LPCSTR g_c_lpszPemKey =
|
||
|
|
"-----BEGIN ENCRYPTED PRIVATE KEY-----\n"
|
||
|
|
"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\n"
|
||
|
|
"-----END ENCRYPTED PRIVATE KEY-----\n";
|
||
|
|
|
||
|
|
LPCSTR g_c_lpszCAPemCert =
|
||
|
|
"-----BEGIN CERTIFICATE-----\n"
|
||
|
|
"MIID2TCCAsGgAwIBAgIUM8TTtPU+ejzffYXCcs/zZsU7OuIwDQYJKoZIhvcNAQEL\n"
|
||
|
|
"BQAwezELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQHDAJHWjEMMAoG\n"
|
||
|
|
"A1UECgwDU1NUMQ8wDQYDVQQLDAZKZXNzbWExEzARBgNVBAMMCmplc3NtYS5vcmcx\n"
|
||
|
|
"HjAcBgkqhkiG9w0BCQEWD2xkY3NhYUAyMWNuLmNvbTAgFw0yNDA2MjYwNTA0NDNa\n"
|
||
|
|
"GA8yMjcwMTEyNDA1MDQ0M1owezELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQsw\n"
|
||
|
|
"CQYDVQQHDAJHWjEMMAoGA1UECgwDU1NUMQ8wDQYDVQQLDAZKZXNzbWExEzARBgNV\n"
|
||
|
|
"BAMMCmplc3NtYS5vcmcxHjAcBgkqhkiG9w0BCQEWD2xkY3NhYUAyMWNuLmNvbTCC\n"
|
||
|
|
"ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAML+v79+aLQt0Za0dTIZHI5B\n"
|
||
|
|
"NDs0g5G8bhdOTlW/kNWflaziZ3GY6d6nJSkQ5e29kyFKxlOD6Gls6bOJ86U71u4R\n"
|
||
|
|
"bCmoFvRTDH4q2cJ/+PbiioLpNveDG6lnRCs9JNRQoJrkpRo6urnVnAdsIf6UFjLI\n"
|
||
|
|
"dlByNMPGYJ0V8/oKJG5Vu5gcbZV0jVA5+tswkH/zquexEXoKvp18mcwl+pNc/LwW\n"
|
||
|
|
"0WnGj0uoJjxHg4GsS78PASjhxMR/2d/1OpgPauldFaNHjVPtaLqJnuejwA6M6Sz8\n"
|
||
|
|
"iFPybAQAMpHL9W8kf08jtbnFvnm4ibUkQL5h+OJoIEQa9AVZOSoFG2/g5Zcn8X8C\n"
|
||
|
|
"AwEAAaNTMFEwHQYDVR0OBBYEFN49z48DywmoD4cNTQgC6nn2QJoUMB8GA1UdIwQY\n"
|
||
|
|
"MBaAFN49z48DywmoD4cNTQgC6nn2QJoUMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI\n"
|
||
|
|
"hvcNAQELBQADggEBALJnYrYBSZLyYX14FQ04zxG3AX0CtQzNOOa7LDrr+H8Ly+nK\n"
|
||
|
|
"qS87gg2njMVZH1zM2demtMwydR/F2Ui8ggaduMvc9h5YgQKEwYl8KarJEY03oZoe\n"
|
||
|
|
"zbQGBxCXpDOtMs1vujzcl/iZbSzwEDF3g4la5U8q4MlmfGFKz9CJbvoxecqYA206\n"
|
||
|
|
"nNbW2XZsW/xMiQv6iAw5iP/LOR9HAyxcvXIsL790nfcgnTYLmyP254Dj4outc6R+\n"
|
||
|
|
"PA+f/c1FvkbUBTR5vJt2tsvHcNU218rY2hyOIhDmZeUWprqBO19sUk3scLbVPr3+\n"
|
||
|
|
"WEWEl2XaCekKuPtAnMgVQuFsocXGyiuIhkOe5Z4=\n"
|
||
|
|
"-----END CERTIFICATE-----\n";
|
||
|
|
|
||
|
|
LPCSTR g_s_lpszPemCert =
|
||
|
|
"-----BEGIN CERTIFICATE-----\n"
|
||
|
|
"MIIEJjCCAw6gAwIBAgIBAzANBgkqhkiG9w0BAQsFADB7MQswCQYDVQQGEwJDTjEL\n"
|
||
|
|
"MAkGA1UECAwCR0QxCzAJBgNVBAcMAkdaMQwwCgYDVQQKDANTU1QxDzANBgNVBAsM\n"
|
||
|
|
"Bkplc3NtYTETMBEGA1UEAwwKamVzc21hLm9yZzEeMBwGCSqGSIb3DQEJARYPbGRj\n"
|
||
|
|
"c2FhQDIxY24uY29tMCAXDTI0MDYyNjA1MTY1NFoYDzIyNDMwNzA5MDUxNjU0WjBu\n"
|
||
|
|
"MQswCQYDVQQGEwJDTjELMAkGA1UECAwCR0QxDDAKBgNVBAoMA1NTVDEPMA0GA1UE\n"
|
||
|
|
"CwwGSmVzc21hMRMwEQYDVQQDDApqZXNzbWEub3JnMR4wHAYJKoZIhvcNAQkBFg9s\n"
|
||
|
|
"ZGNzYWFAMjFjbi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7\n"
|
||
|
|
"x3ilLjZtH2ZKuofj4FpVl/IF2yDI5503YQbwllxp7kNEaqTyjJUgmLlZBbwHQzTD\n"
|
||
|
|
"xfPk/nZ/m3xUHsVjwXMZqNNufgtSLaBoK4CvBAOTkELphIOZdJYPpuaU66W0phjG\n"
|
||
|
|
"VM2R4EFm/rTXddZ7N6sq3fYEL0bxqUJ6fW/+0QhdNSwfdevdAHgOmGkrTj5rILJ8\n"
|
||
|
|
"A7FwbkcuV5vBWZ+9ZhNG4csqAjH5LLLCn5hJdhE9WqUp+slfIuXE5vZGDpCQrcc5\n"
|
||
|
|
"I1qWt8VNfdwzaBDL/hXl7pAiVpZRvQxyJgbUMLr2QrYFwrPkgpncU7R7AyT/C0tO\n"
|
||
|
|
"vgPVZb+IGqbf+NrbHEk3AgMBAAGjgb8wgbwwHwYDVR0jBBgwFoAU3j3PjwPLCagP\n"
|
||
|
|
"hw1NCALqefZAmhQwCQYDVR0TBAIwADALBgNVHQ8EBAMCBPAwYgYDVR0RBFswWYIJ\n"
|
||
|
|
"bG9jYWxob3N0ggpqZXNzbWEub3JnggwqLmplc3NtYS5vcmeCCmplc3NtYS5jb22C\n"
|
||
|
|
"DCouamVzc21hLmNvbYIKamVzc21hLm5ldIIMKi5qZXNzbWEubmV0MB0GA1UdDgQW\n"
|
||
|
|
"BBRZ97VSkfue5s8/OkYvUe+lXUgsHzANBgkqhkiG9w0BAQsFAAOCAQEAvM1QrhTL\n"
|
||
|
|
"/I1ws4fozKQlfmd3S0AdfFJX4BMTbp88proWpjrNZt6ZJ3EETHKcXu0z4gn3jWy6\n"
|
||
|
|
"1d8bDCytYQXjpG3Na7Ym5jc/E7wc+XUCUxlW41G/HnaLaIVccmRbyxMOWkr3yUX1\n"
|
||
|
|
"tc8rxUSKWzZBmYtJ49QzIvNzDuoLklE44g8XuqsZZlOZ2wRWJxc/hDG0MkKhRnc1\n"
|
||
|
|
"mqeaoY/79QZNE1RvX/aRRJoSl7NQ00/rMP8MU6OMzPvbIsMVK2uT+BVZG0RZJXaG\n"
|
||
|
|
"ikQJvxYZrDVZdRZL6tWPtS2wI49KkzGHNH4S1Fni/dDq3P2rxzisMY1gtKQLeVYY\n"
|
||
|
|
"eTQDDybjTWWiTg==\n"
|
||
|
|
"-----END CERTIFICATE-----\n";
|
||
|
|
|
||
|
|
LPCSTR g_s_lpszPemKey =
|
||
|
|
"-----BEGIN ENCRYPTED PRIVATE KEY-----\n"
|
||
|
|
"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\n"
|
||
|
|
"8PQL73vd5pU4jC6WdOaXwkI=\n"
|
||
|
|
"-----END ENCRYPTED PRIVATE KEY-----\n";
|
||
|
|
|
||
|
|
LPCSTR g_s_lpszCAPemCert =
|
||
|
|
"-----BEGIN CERTIFICATE-----\n"
|
||
|
|
"MIID2TCCAsGgAwIBAgIUM8TTtPU+ejzffYXCcs/zZsU7OuIwDQYJKoZIhvcNAQEL\n"
|
||
|
|
"BQAwezELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQHDAJHWjEMMAoG\n"
|
||
|
|
"A1UECgwDU1NUMQ8wDQYDVQQLDAZKZXNzbWExEzARBgNVBAMMCmplc3NtYS5vcmcx\n"
|
||
|
|
"HjAcBgkqhkiG9w0BCQEWD2xkY3NhYUAyMWNuLmNvbTAgFw0yNDA2MjYwNTA0NDNa\n"
|
||
|
|
"GA8yMjcwMTEyNDA1MDQ0M1owezELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQsw\n"
|
||
|
|
"CQYDVQQHDAJHWjEMMAoGA1UECgwDU1NUMQ8wDQYDVQQLDAZKZXNzbWExEzARBgNV\n"
|
||
|
|
"BAMMCmplc3NtYS5vcmcxHjAcBgkqhkiG9w0BCQEWD2xkY3NhYUAyMWNuLmNvbTCC\n"
|
||
|
|
"ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAML+v79+aLQt0Za0dTIZHI5B\n"
|
||
|
|
"NDs0g5G8bhdOTlW/kNWflaziZ3GY6d6nJSkQ5e29kyFKxlOD6Gls6bOJ86U71u4R\n"
|
||
|
|
"bCmoFvRTDH4q2cJ/+PbiioLpNveDG6lnRCs9JNRQoJrkpRo6urnVnAdsIf6UFjLI\n"
|
||
|
|
"dlByNMPGYJ0V8/oKJG5Vu5gcbZV0jVA5+tswkH/zquexEXoKvp18mcwl+pNc/LwW\n"
|
||
|
|
"0WnGj0uoJjxHg4GsS78PASjhxMR/2d/1OpgPauldFaNHjVPtaLqJnuejwA6M6Sz8\n"
|
||
|
|
"iFPybAQAMpHL9W8kf08jtbnFvnm4ibUkQL5h+OJoIEQa9AVZOSoFG2/g5Zcn8X8C\n"
|
||
|
|
"AwEAAaNTMFEwHQYDVR0OBBYEFN49z48DywmoD4cNTQgC6nn2QJoUMB8GA1UdIwQY\n"
|
||
|
|
"MBaAFN49z48DywmoD4cNTQgC6nn2QJoUMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI\n"
|
||
|
|
"hvcNAQELBQADggEBALJnYrYBSZLyYX14FQ04zxG3AX0CtQzNOOa7LDrr+H8Ly+nK\n"
|
||
|
|
"qS87gg2njMVZH1zM2demtMwydR/F2Ui8ggaduMvc9h5YgQKEwYl8KarJEY03oZoe\n"
|
||
|
|
"zbQGBxCXpDOtMs1vujzcl/iZbSzwEDF3g4la5U8q4MlmfGFKz9CJbvoxecqYA206\n"
|
||
|
|
"nNbW2XZsW/xMiQv6iAw5iP/LOR9HAyxcvXIsL790nfcgnTYLmyP254Dj4outc6R+\n"
|
||
|
|
"PA+f/c1FvkbUBTR5vJt2tsvHcNU218rY2hyOIhDmZeUWprqBO19sUk3scLbVPr3+\n"
|
||
|
|
"WEWEl2XaCekKuPtAnMgVQuFsocXGyiuIhkOe5Z4=\n"
|
||
|
|
"-----END CERTIFICATE-----\n";
|
||
|
|
|
||
|
|
CString g_c_strCAPemCertFileOrPath;
|
||
|
|
CString g_c_strPemCertFile;
|
||
|
|
CString g_c_strPemKeyFile;
|
||
|
|
|
||
|
|
CString g_s_strCAPemCertFileOrPath;
|
||
|
|
CString g_s_strPemCertFile;
|
||
|
|
CString g_s_strPemKeyFile;
|
||
|
|
|
||
|
|
int g_c_iVerifyMode = SSL_VM_PEER;
|
||
|
|
LPCTSTR g_c_lpszCAPemCertFileOrPath = _T("ca.crt");
|
||
|
|
LPCTSTR g_c_lpszPemCertFile = _T("client.cer");
|
||
|
|
LPCTSTR g_c_lpszPemKeyFile = _T("client.key");
|
||
|
|
LPCTSTR g_c_lpszKeyPasswod = _T("123456");
|
||
|
|
|
||
|
|
int g_s_iVerifyMode = SSL_VM_PEER | SSL_VM_FAIL_IF_NO_PEER_CERT;
|
||
|
|
LPCTSTR g_s_lpszCAPemCertFileOrPath = _T("ca.crt");
|
||
|
|
LPCTSTR g_s_lpszPemCertFile = _T("server.cer");
|
||
|
|
LPCTSTR g_s_lpszPemKeyFile = _T("server.key");
|
||
|
|
LPCTSTR g_s_lpszKeyPasswod = _T("123456");
|
||
|
|
|
||
|
|
CString g_c_strCAPemCertFileOrPath2;
|
||
|
|
CString g_c_strPemCertFile2;
|
||
|
|
CString g_c_strPemKeyFile2;
|
||
|
|
|
||
|
|
CString g_s_strCAPemCertFileOrPath2;
|
||
|
|
CString g_s_strPemCertFile2;
|
||
|
|
CString g_s_strPemKeyFile2;
|
||
|
|
|
||
|
|
int g_c_iVerifyMode2 = SSL_VM_PEER;
|
||
|
|
LPCTSTR g_c_lpszCAPemCertFileOrPath2 = _T("ca2.crt");
|
||
|
|
LPCTSTR g_c_lpszPemCertFile2 = _T("client2.cer");
|
||
|
|
LPCTSTR g_c_lpszPemKeyFile2 = _T("client2.key");
|
||
|
|
LPCTSTR g_c_lpszKeyPasswod2 = _T("123456");
|
||
|
|
|
||
|
|
int g_s_iVerifyMode2 = SSL_VM_PEER | SSL_VM_FAIL_IF_NO_PEER_CERT;
|
||
|
|
LPCTSTR g_s_lpszCAPemCertFileOrPath2 = _T("ca2.crt");
|
||
|
|
LPCTSTR g_s_lpszPemCertFile2 = _T("server2.cer");
|
||
|
|
LPCTSTR g_s_lpszPemKeyFile2 = _T("server2.key");
|
||
|
|
LPCTSTR g_s_lpszKeyPasswod2 = _T("123456");
|
||
|
|
|
||
|
|
BOOL InitSSLParams();
|
||
|
|
BOOL g_SSLParams = InitSSLParams();
|
||
|
|
|
||
|
|
BOOL InitSSLParams()
|
||
|
|
{
|
||
|
|
::SetCurrentPathToModulePath();
|
||
|
|
|
||
|
|
CString strCur = ::GetCurrentDirectory();
|
||
|
|
CString strPath = strCur + SSL_CERT_RELATIVE_PATH_1;
|
||
|
|
|
||
|
|
if(!CFile::IsDirectory(strPath))
|
||
|
|
strPath = strCur + SSL_CERT_RELATIVE_PATH_2;
|
||
|
|
|
||
|
|
if(g_c_lpszPemCertFile)
|
||
|
|
{
|
||
|
|
g_c_strPemCertFile = strPath + g_c_lpszPemCertFile;
|
||
|
|
g_c_lpszPemCertFile = g_c_strPemCertFile;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(g_c_lpszPemKeyFile)
|
||
|
|
{
|
||
|
|
g_c_strPemKeyFile = strPath + g_c_lpszPemKeyFile;
|
||
|
|
g_c_lpszPemKeyFile = g_c_strPemKeyFile;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(g_c_lpszCAPemCertFileOrPath)
|
||
|
|
{
|
||
|
|
g_c_strCAPemCertFileOrPath = strPath + g_c_lpszCAPemCertFileOrPath;
|
||
|
|
g_c_lpszCAPemCertFileOrPath = g_c_strCAPemCertFileOrPath;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(g_s_lpszPemCertFile)
|
||
|
|
{
|
||
|
|
g_s_strPemCertFile = strPath + g_s_lpszPemCertFile;
|
||
|
|
g_s_lpszPemCertFile = g_s_strPemCertFile;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(g_s_lpszPemKeyFile)
|
||
|
|
{
|
||
|
|
g_s_strPemKeyFile = strPath + g_s_lpszPemKeyFile;
|
||
|
|
g_s_lpszPemKeyFile = g_s_strPemKeyFile;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(g_s_lpszCAPemCertFileOrPath)
|
||
|
|
{
|
||
|
|
g_s_strCAPemCertFileOrPath = strPath + g_s_lpszCAPemCertFileOrPath;
|
||
|
|
g_s_lpszCAPemCertFileOrPath = g_s_strCAPemCertFileOrPath;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(g_c_lpszPemCertFile2)
|
||
|
|
{
|
||
|
|
g_c_strPemCertFile2 = strPath + g_c_lpszPemCertFile2;
|
||
|
|
g_c_lpszPemCertFile2 = g_c_strPemCertFile2;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(g_c_lpszPemKeyFile2)
|
||
|
|
{
|
||
|
|
g_c_strPemKeyFile2 = strPath + g_c_lpszPemKeyFile2;
|
||
|
|
g_c_lpszPemKeyFile2 = g_c_strPemKeyFile2;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(g_c_lpszCAPemCertFileOrPath2)
|
||
|
|
{
|
||
|
|
g_c_strCAPemCertFileOrPath2 = strPath + g_c_lpszCAPemCertFileOrPath2;
|
||
|
|
g_c_lpszCAPemCertFileOrPath2 = g_c_strCAPemCertFileOrPath2;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(g_s_lpszPemCertFile2)
|
||
|
|
{
|
||
|
|
g_s_strPemCertFile2 = strPath + g_s_lpszPemCertFile2;
|
||
|
|
g_s_lpszPemCertFile2 = g_s_strPemCertFile2;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(g_s_lpszPemKeyFile2)
|
||
|
|
{
|
||
|
|
g_s_strPemKeyFile2 = strPath + g_s_lpszPemKeyFile2;
|
||
|
|
g_s_lpszPemKeyFile2 = g_s_strPemKeyFile2;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(g_s_lpszCAPemCertFileOrPath2)
|
||
|
|
{
|
||
|
|
g_s_strCAPemCertFileOrPath2 = strPath + g_s_lpszCAPemCertFileOrPath2;
|
||
|
|
g_s_lpszCAPemCertFileOrPath2 = g_s_strCAPemCertFileOrPath2;
|
||
|
|
}
|
||
|
|
|
||
|
|
return TRUE;
|
||
|
|
}
|
||
|
|
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#ifdef _NEED_HTTP
|
||
|
|
|
||
|
|
LPCSTR HTTP_WEB_SOCKET_CLOSE_FLAG = "$close";
|
||
|
|
const BYTE HTTP_WEB_SOCKET_MASK_KEY[] = {0x1, 0x2, 0x3, 0x4};
|
||
|
|
|
||
|
|
CStringA& HttpVersionToString(EnHttpVersion enVersion, CStringA& strResult)
|
||
|
|
{
|
||
|
|
strResult.Format("HTTP/%d.%d", LOBYTE(enVersion), HIBYTE(enVersion));
|
||
|
|
return strResult;
|
||
|
|
}
|
||
|
|
|
||
|
|
CStringA& MakeSecWebSocketAccept(LPCSTR lpszKey, CStringA& strAccept)
|
||
|
|
{
|
||
|
|
CStringA strKey(lpszKey);
|
||
|
|
strKey.Append(HTTP_WEB_SOCKET_SEC_SALT);
|
||
|
|
|
||
|
|
_SHA1_CTX ctx;
|
||
|
|
BYTE buf[SHA1_BLOCK_SIZE];
|
||
|
|
|
||
|
|
::sha1_init(&ctx);
|
||
|
|
::sha1_update(&ctx, (BYTE*)(LPCSTR)strKey, strKey.GetLength());
|
||
|
|
::sha1_final(&ctx, buf);
|
||
|
|
|
||
|
|
BYTE* lpszAccept = (BYTE*)strAccept.GetBuffer(SHA1_BLOCK_SIZE * 4 / 3 + 4);
|
||
|
|
|
||
|
|
int len = (int)::base64_encode(buf, lpszAccept, SHA1_BLOCK_SIZE, FALSE);
|
||
|
|
strAccept.ReleaseBufferSetLength(len);
|
||
|
|
|
||
|
|
return strAccept;
|
||
|
|
}
|
||
|
|
|
||
|
|
#endif
|