基于LR的HTTP协议接口性能测试脚本(转)
转自:
http://www.cnblogs.com/yezhaohui/p/3280239.html
http://www.cnblogs.com/yezhaohui/p/3283110.html
关于LR中手工编写http协议脚本,核心是通过web_custom_request函数来实现,前一篇博文《web_custom_request函数详解》已对该函数有了较详细的说明,不再赘述。本文是对一次实际场景手工完成LR中http协议脚本编写的简单总结和回顾。
背景介绍
XXX项目性能测试中新增业务场景:XX设备的在线激活,因为存在多用户同时在线激活,故需进行性能测试以确认后台服务器系统在多用并发时功能是否正常,性能指标是否满足规格要求。用户使用场景为用户通过华赛设备平台(类似客户端)触发激活请求,该请求经过中间系统处理并最终被Licnese后台服务器处理并响应。客户端与服务器经过了广域网环境,无设备在线激活业务操作界面。
场景和现状
XX设备平台通过http协议与中转系统进行交互,中转系统将http协议的消息转换为Web Service(SOAP)消息并转送给Licnese服务器进行处理,XX设备发出的http消息数据是经过加密处理的。已提供XX设备激活模拟工具(.exe文件+配置文件)和加解密dll文件/加解密jar包。.exe文件为win32控制台程序编写的模拟激活业务的工具,模拟工具执行时间很短,在几秒钟就完成激活业务(与XXX服务器发生五次交互),试图通过LR工具试录制脚本,发现无法录制到模拟工具发出的请求消息脚本。
方案确定
在LR中通过手工编写http协议脚本,在LR中模拟华赛设备在线激活业务与中转系统交互,由于提供的加解密DLL文件并非C/C++语言写的,所以LR中选择http协议时无法直接调用加解密DLL,但因为提供了加解密jar包,可以在本地java环境中部署该jar包,在命令行中执行java命令来进行加解密操作,最终确定通过手工编写一个C的DLL,在该DLL中编写调用命令行并获取命令行结果的函数,在LR中加载并调用该DLL来实现数据的加解密, 另外,因为加解密后的数据为二进制数据,所以需要使用web_custom_request函数发送二进制消息体,如对二进制消息体的处理过程中需要使用循环,处于执行的效率考虑,可将这部分代码一并放入DLL中文件。
脚本
1 #ifndef _GLOBALS_H 2 #define _GLOBALS_H 3 4 //-------------------------------------------------------------------- 5 // Include Files 6 #include "lrun.h" 7 #include "web_api.h" 8 #include "lrw_custom_body.h" 9 10 //-------------------------------------------------------------------- 11 // Global Variables 12 //#define TESTDLL 0 13 14 //--------------------------------初始化-------------------------------- 15 //获取安全码的局部变量 16 char szSecurityCodeBody[8192]; //存放Body 17 char szPdtName[128]; //产品名称 18 char szPdtVer[128]; //产品版本号 19 char szDevESN[128]; //生成ESN,20-30位随机数字和字母 20 char szDevIndex[5]; //生成devIndex,设备ESN哈希后取前四个字节.... 21 char szSecurityCodBodyEnc[8192];//存放加密后的Body 22 char getSecurityCode_requestData[8192];//存放待解密data数据 23 char getSecurityCode_requestDataDnc[8192];//存放解密后的data数据 24 char vuserid_str[50]; //组装临时文件名 25 char curtime_str[50]; 26 char TmpFileName[100]; //临时文件名 27 int iRet = -1; //加解密函数返回值 28 int ContentLength = 0; 29 const char *SecurityCodeTou = "securityCode="; 30 char *SecurityCodeTmp = NULL; 31 const char *resCodeTou = "resCode="; 32 char *resCodeTmp = NULL; 33 int resCode = 0; 34 char *delim = "&"; 35 char requestDataDnc_Tmp[8192];//临时存放各响应解密后的data数据 36 37 //获取订单授权信息 38 char szAuthorizeBody[8192]; 39 char szOrdLac[128]; 40 char szAuthorizeBodyEnc[8192]; 41 char getAuthInfo_requestData[8192];//存放待解密data数据 42 char getAuthInfo_requestDataDnc[8192];//存放解密后的data数据 43 const char *authInfoTou = "authInfo="; 44 char *authInfoTmp = NULL; 45 46 //在线激活 47 char szActDevLicenseBody[8192]; 48 char szActDevLicenseBodyEnc[8192]; 49 char actDevLicense_requestData[8192];//存放待解密data数据 50 char actDevLicense_requestDataDnc[8192];//存放解密后的data数据 51 52 //在线下载 53 char szDownLoadOnlineBody[8192]; 54 char szDownLoadOnlineBodyEnc[8192]; 55 char getDevLicense_requestData[8192];//存放待解密data数据 56 char getDevLicense_requestDataDnc[8192];//存放解密后的data数据 57 58 //释放会话资源 59 char szReleaseSessionBody[8192]; 60 char szJsessionid[128]; 61 char szReleaseSessionBodyEnc[8192]; 62 char relSesRsr_requestData[8192];//存放待解密data数据 63 char relSesRsr_requestDataDnc[8192];//存放解密后的data数据 64 65 //文件内容校验 66 const char *ProductNameTou = "Product="; 67 char *ProductNameTmp = NULL; 68 char ProductNameTmp_STR[64]; 69 char *ProductName_delim = "\n"; 70 const char *VersionTou = "Version="; 71 char *VersionTmp = NULL; 72 char VersionTmp_STR[64]; 73 char *Version_delim = "\n"; 74 const char *EsnTou = "Esn=\""; 75 char *EsnTmp = NULL; 76 char EsnTmp_STR[128]; 77 char *Esn_delim = "\"\n"; 78 int strcmp_result = 0; //比较结果,相等为0 79 80 81 #endif // _GLOBALS_H
1 vuser_init()
2 {
3
4 int iLoadDllRes1 = -1;
5
6
7 //char szRes[4096] = {0}; //加密后的字符串,一定要定义足够大,防止越界!!!
8 //char szRes[4096] = "3d9d1defa4044f28e228b43de69b48ca9c992f974d184bc353905bee18d4890614eed06bce9a237da6a636043c456b3831e62ddf6ad7571487b38afc6a0ee1041b32f4ecf69c1d135f79e51ff71684132458d5d1935ddc8c700bf9552b06c80dd568cb4711a2d841674874d16570c3ac0efd5c8e2201e98788fdaa11763cf968f7b7b800655c26d3731fda05362ff59b6a9ec1caa8e06adf9db3900ef26c4dd898cc462f7597ee6800053e5748cc97584419b3f7b60a301bdb034701a9e97ee62749b1d9308deef976e1eaa103123ac2db17bc5e86545a6ad75711fc2442434fd0c9d365baf6267c12b070d1836b8e0e843c70232644a963a06a14357c78de0d";
9 //int iRet = -1;
10 //char szRes2[4096] = {0}; //解密后的字符串
11 //char hello[100] = "hello";
12 //char hello[100] = "version=1.0&reqType=getSecurityCode&prdName=USG5560&prdVer=V300R001&devIndex=CEA9";
13
14
15 iLoadDllRes1 = lr_load_dll("dencdll.dll");
16 if (0 != iLoadDllRes1)
17 {
18 lr_output_message("Notify:Load Dll error: dencdll.dll");
19 return -1;
20 }
21
22 //----------------------------------------------测试加密----------------------------------------------
23 /*
24 * 打印hello的加密结果
25 * 注意:1. SdpEndecTest文件夹、commons-codec-1.8.jar、libscpjavainterface.dll、log4j-1.2.15.jar、
26 * scpjavainterface.jar、SdpEndecApi.jar、vcgscpjavainterface.dll等均要放到“D:\dm\sdp\systemdll\”目录下
27 * 函数原型: int Encrypt(int iType, const char* szSecurityCode, const char* szOri, const char* szFileName, char *szRes)
28 * iType: 类型
29 * szSecurityCode: 安全码
30 * szOri:需要被加密的字符串;
31 * szFileName:临时文件(建议一个用户创建一个);
32 * szRes: 加密后的字符串
33 *
34 */
35
36 //iRet = Encrypt(0,"",hello,"D:\\dm\\sdp\\LicenseLog\\TmpFile\\TmpFile1",szRes);
37 //lr_output_message("Notify:The result = %d, the encrypt are: %s",iRet,szRes);
38
39 // iRet = Decrypt(0,"",szRes,"D:\\dm\\sdp\\LicenseLog\\TmpFile\\TmpFile2",szRes2);
40 // lr_output_message("Notify:The result = %d, the decrypt are: %s",iRet,szRes2);
41
42 return 0;
43 }
1 Action()
2 {
3 web_set_max_html_param_len("40960");
4
5 START:
6 //--------------------------------初始化--------------------------------
7 memset(szSecurityCodeBody, '\0',sizeof(szSecurityCodeBody));
8 memset(szSecurityCodBodyEnc, '\0',sizeof(szSecurityCodBodyEnc));
9 memset(szPdtName, '\0',sizeof(szPdtName));
10 memset(szPdtVer, '\0',sizeof(szPdtVer));
11 memset(szDevESN, '\0',sizeof(szDevESN));
12 memset(szDevIndex, '\0',sizeof(szDevIndex));
13 memset(szAuthorizeBody, '\0',sizeof(szAuthorizeBody));
14 memset(szOrdLac, '\0',sizeof(szOrdLac));
15 memset(szActDevLicenseBody, '\0',sizeof(szActDevLicenseBody));
16 memset(szAuthorizeBodyEnc, '\0',sizeof(szAuthorizeBodyEnc));
17
18 memset(szActDevLicenseBodyEnc, '\0',sizeof(szActDevLicenseBodyEnc));
19 memset(szDownLoadOnlineBody, '\0',sizeof(szDownLoadOnlineBody));
20 memset(szReleaseSessionBody, '\0',sizeof(szReleaseSessionBody));
21 memset(szJsessionid, '\0',sizeof(szJsessionid));
22 memset(getSecurityCode_requestData,'\0',sizeof(getSecurityCode_requestData));
23 memset(getSecurityCode_requestDataDnc,'\0',sizeof(getSecurityCode_requestDataDnc));
24 memset(requestDataDnc_Tmp,'\0',sizeof(requestDataDnc_Tmp));
25 memset(vuserid_str,'\0',sizeof(vuserid_str));
26 memset(curtime_str,'\0',sizeof(curtime_str));
27 memset(TmpFileName,'\0',sizeof(TmpFileName));
28
29 memset(actDevLicense_requestData,'\0',sizeof(actDevLicense_requestData));
30 memset(actDevLicense_requestDataDnc,'\0',sizeof(actDevLicense_requestDataDnc));
31 memset(ProductNameTmp_STR,'\0',sizeof(ProductNameTmp_STR));
32 memset(VersionTmp_STR,'\0',sizeof(VersionTmp_STR));
33 memset(EsnTmp_STR,'\0',sizeof(EsnTmp_STR));
34 memset(szDownLoadOnlineBodyEnc,'\0',sizeof(szDownLoadOnlineBodyEnc));
35 memset(getDevLicense_requestData,'\0',sizeof(getDevLicense_requestData));
36 memset(getDevLicense_requestDataDnc,'\0',sizeof(getDevLicense_requestDataDnc));
37 memset(szReleaseSessionBodyEnc,'\0',sizeof(szReleaseSessionBodyEnc));
38 memset(relSesRsr_requestData,'\0',sizeof(relSesRsr_requestData));
39
40 memset(relSesRsr_requestDataDnc,'\0',sizeof(relSesRsr_requestDataDnc));
41 memset(getAuthInfo_requestData,'\0',sizeof(getAuthInfo_requestData));
42 memset(getAuthInfo_requestDataDnc,'\0',sizeof(getAuthInfo_requestDataDnc));
43
44 strcpy(szSecurityCodeBody,"version=1.1&reqType=getSecurityCode&prdName=");
45 strcpy(szAuthorizeBody,"version=1.1&reqType=getAuthInfo&prdName=");
46 strcpy(szActDevLicenseBody,"version=1.1&reqType=actDevLicense&prdName=");
47 strcpy(szDownLoadOnlineBody,"version=1.1&reqType=getDevLicense&prdName=");
48 strcpy(szReleaseSessionBody,"version=1.1&reqType=relSesRsr&jsessionid=");
49 strcpy(szOrdLac,lr_eval_string("{Param_OrdLac}"));
50 strcpy(szPdtName,lr_eval_string("{Param_PdtName}")); //获取产品名称
51 strcpy(szPdtVer, lr_eval_string("{Param_PdtVer}")); //获取产品版本号
52
53 //USG5560,V300R001,PSCE59A36540B14
54 //USG5560,V300R001,T69YGLB7A405
55 //USG5560,V300R001,PSCE59A36540B12
56 //---调试用ESN
57 //strcpy(szDevESN,lr_eval_string("{Param_ESN_Part1}"));
58 //strcat(szDevESN,lr_eval_string("{Param_ESN_Part2}"));
59 //strcpy(szDevESN,"456789ASWABCDHSJEUWYDSWDF");
60 strcpy(szDevESN,lr_eval_string("{Param_ESN}"));
61
62 //对szDevESN进行HASH
63
64 //取前四个字节得到szDevIndex ASDE
65 //strcpy(szDevIndex,"SWDF");
66 strcpy(szDevIndex,lr_eval_string("{Param_DevIndex}"));
67
68 lr_output_message("----------szOrdLac:%s, szPdtName:%s, szPdtVer:%s, szDevESN:%s, szDevIndex:%s----------", szOrdLac,szPdtName,szPdtVer,szDevESN,szDevIndex);
69
70 //固定头
71 web_add_auto_header("Accept",
72 "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
73 web_add_auto_header("Accept-Language",
74 "zh-cn,zh;q=0.5");
75 web_add_auto_header("Accept-Encoding",
76 "gzip,deflate");
77 web_add_auto_header("Connection",
78 "keep-alive");
79 web_remove_auto_header("Content-Type",
80 LAST);
81 web_remove_auto_header("Cache-Control",
82 LAST);
83 web_remove_auto_header("User-Agent",
84 LAST);
85
86 //--------------------------------获取安全码-------------------------------
87 //封装body
88 strcat(szSecurityCodeBody,szPdtName);
89 strcat(szSecurityCodeBody,"&prdVer=");
90 strcat(szSecurityCodeBody,szPdtVer);
91 strcat(szSecurityCodeBody,"&devIndex=");
92 strcat(szSecurityCodeBody,szDevIndex);
93 lr_output_message("Notify:The szSecurityCodeBody: %s",szSecurityCodeBody);
94
95 //临时文件名生成
96 strcpy(TmpFileName,"D:\\dm\\sdp\\LicenseLog\\TmpFile\\TmpFile");
97 strcpy(vuserid_str,lr_eval_string("{vuserid_Param}"));
98 strcpy(curtime_str,lr_eval_string("{curtime_Param}"));
99
100 strcat(TmpFileName,vuserid_str);
101 strcat(TmpFileName,"_");
102 strcat(TmpFileName,curtime_str);
103
104 //加密szSecurityCodeBody
105 iRet = Encrypt(0,"",szSecurityCodeBody,TmpFileName,szSecurityCodBodyEnc);
106 lr_output_message("----------iRet:%d,TmpFileName:%s,szSecurityCodBodyEnc:%s----------", iRet,TmpFileName,szSecurityCodBodyEnc);
107
108 //放入参数中
109 lr_save_string(szSecurityCodBodyEnc,"getSecurityCodeBody_Param");
110 //lr_save_string(destHexCode,"getSecurityCodeBody_Param");
111
112 //关联data内容
113 web_reg_save_param_ex(
114 "ParamName=getSecurityCode_requestData_Param",
115 "LB=data=",
116 "RB=",
117 SEARCH_FILTERS,
118 LAST);
119
120 //关联Content-Length的值
121 web_reg_save_param_ex(
122 "ParamName=ContentLength_Param",
123 "LB=Content-Length: ",
124 "RB=\r\n",
125 SEARCH_FILTERS,
126 "Scope=HEADERS",
127 LAST);
128
129 //关联会话ID
130 web_reg_save_param_ex(
131 "ParamName=jsessionid_Param",
132 "LB=JSESSIONID=",
133 "RB=;",
134 SEARCH_FILTERS,
135 LAST);
136
137 //事物开始
138 lr_start_transaction("GetSecurityCode");
139
140 //发起获取安全码请求
141 web_custom_request("web_custom_request",
142 "URL=http://{Param_serverIP}/LSP/device/licOnlineActivation.do?type=0",
143 "Method=POST",
144 "TargetFrame=",
145 "Resource=0",
146 "Referer=",
147 "Mode=HTTP",
148 "BodyBinary={getSecurityCodeBody_Param}",
149 LAST);
150
151 lr_end_transaction("GetSecurityCode", LR_AUTO);
152
153
154 ContentLength = atoi(lr_eval_string("{ContentLength_Param}")) - strlen("type=0&data=");
155
156 //解密data内容
157 memcpy(getSecurityCode_requestData,lr_eval_string("{getSecurityCode_requestData_Param}"),ContentLength);
158 iRet = Decrypt(0,"",getSecurityCode_requestData,ContentLength,TmpFileName,getSecurityCode_requestDataDnc);
159 lr_output_message("----------iRet:%d,getSecurityCode_requestData:%s,getSecurityCode_requestDataDnc: %s----------",iRet,getSecurityCode_requestData,getSecurityCode_requestDataDnc);
160
161
162 //提取resCode
163 strcpy(requestDataDnc_Tmp,getSecurityCode_requestDataDnc);
164 resCodeTmp = (char *)strstr(requestDataDnc_Tmp,resCodeTou);
165 if (NULL == resCodeTmp)
166 {
167 lr_error_message("resCodeTmp is NULL!");
168 //return -1;
169 goto START;
170 }
171 resCodeTmp += strlen(resCodeTou);
172 resCodeTmp = (char *)strtok(resCodeTmp,delim);
173 resCode = atoi(resCodeTmp);
174 lr_output_message("----------resCode:%d----------",resCode);
175
176
177 //判断响应的返回码是否正确,如果不正确就退出!
178 if (100!=resCode && 200!=resCode)
179 {
180 //return -1;
181 goto START;
182 }
183
184 //提取安全码
185 SecurityCodeTmp = (char *)strstr(getSecurityCode_requestDataDnc,SecurityCodeTou);
186 if (NULL == SecurityCodeTmp)
187 {
188 //return -1;
189 goto START;
190 }
191 SecurityCodeTmp += strlen(SecurityCodeTou);
192 lr_output_message("----------SecurityCodeTmp:%s----------",SecurityCodeTmp);
193
194
195 //--------------------------------获取订单授权信息--------------------------------
196 //封装body
197 strcat(szAuthorizeBody,szPdtName);
198 strcat(szAuthorizeBody,"&prdVer=");
199 strcat(szAuthorizeBody,szPdtVer);
200 strcat(szAuthorizeBody,"&devEsn=");
201 strcat(szAuthorizeBody,szDevESN);
202 strcat(szAuthorizeBody,"&ordLac=");
203 strcat(szAuthorizeBody,szOrdLac);
204
205 //临时文件名生成
206 strcpy(TmpFileName,"D:\\dm\\sdp\\LicenseLog\\TmpFile\\TmpFile");
207 strcpy(vuserid_str,lr_eval_string("{vuserid_Param}"));
208 strcpy(curtime_str,lr_eval_string("{curtime_Param}"));
209 strcat(TmpFileName,vuserid_str);
210 strcat(TmpFileName,"_");
211 strcat(TmpFileName,curtime_str);
212
213
214 //加密szAuthorizeBody
215 iRet = Encrypt(1,SecurityCodeTmp,szAuthorizeBody,TmpFileName,szAuthorizeBodyEnc);
216 lr_output_message("----------iRet:%d, szAuthorizeBodyEnc: %s----------",iRet,szAuthorizeBodyEnc);
217
218 //放入参数中
219 lr_save_string(szAuthorizeBodyEnc,"getAuthBody_Param");
220
221 //关联data内容
222 web_reg_save_param_ex(
223 "ParamName=getAuthInfo_requestData_Param",
224 "LB=data=",
225 "RB=",
226 SEARCH_FILTERS,
227 LAST);
228
229 //关联Content-Length的值
230 web_reg_save_param_ex(
231 "ParamName=ContentLength_Param",
232 "LB=Content-Length: ",
233 "RB=\r\n",
234 SEARCH_FILTERS,
235 "Scope=HEADERS",
236 LAST);
237
238 lr_start_transaction("GetOrderAuthorInfo");
239
240 web_custom_request("web_custom_request",
241 "URL=http://{Param_serverIP}/LSP/device/licOnlineActivation.do;jsessionid={jsessionid_Param}?type=1",
242 "Method=POST",
243 "TargetFrame=",
244 "Resource=0",
245 "Referer=",
246 "Mode=HTTP",
247 "BodyBinary={getAuthBody_Param}",
248 LAST);
249 lr_end_transaction("GetOrderAuthorInfo", LR_AUTO);
250
251 ContentLength = atoi(lr_eval_string("{ContentLength_Param}")) - strlen("type=0&data=");
252
253
254 //解密data内容
255 memcpy(getAuthInfo_requestData,lr_eval_string("{getAuthInfo_requestData_Param}"),ContentLength);
256 iRet = Decrypt(1,SecurityCodeTmp,getAuthInfo_requestData,ContentLength,TmpFileName,getAuthInfo_requestDataDnc);
257 lr_output_message("----------iRet:%d, getAuthInfo_requestDataDnc: %s----------",iRet,getAuthInfo_requestDataDnc);
258
259
260 //提取resCode
261 memset(requestDataDnc_Tmp,'\0',sizeof(requestDataDnc_Tmp));
262 strcpy(requestDataDnc_Tmp,getAuthInfo_requestDataDnc);
263 resCodeTmp = (char *)strstr(requestDataDnc_Tmp,resCodeTou);
264 if (NULL == resCodeTmp)
265 {
266 lr_error_message("resCodeTmp is NULL!");
267 //return -1;
268 goto START;
269
270 }
271 resCodeTmp += strlen(resCodeTou);
272 resCodeTmp = (char *)strtok(resCodeTmp,delim);
273 resCode = atoi(resCodeTmp);
274 lr_output_message("Notify:resCode:%d",resCode);
275
276 //判断响应的返回码是否正确,为100,如果不正确就退出!
277 if (100!=resCode && 200!=resCode && 104!=resCode)
278 {
279 lr_error_message("resCode is not 100 !");
280 //return -1;
281 goto START;
282 }
283
284 //提取授权信息/
285 /*
286 authInfoTmp = (char *)strstr(getAuthInfo_requestDataDnc,authInfoTou);
287 if (NULL == authInfoTmp)
288 {
289 lr_error_message("authInfoTmp is NULL!");
290 return -1;
291
292 }
293 authInfoTmp += strlen(authInfoTou);
294 lr_output_message("Notify:authInfoTmp:%s",authInfoTmp);
295 */
296
297
298 //--------------------------------在线激活--------------------------------
299 //封装body
300 strcat(szActDevLicenseBody,szPdtName);
301 strcat(szActDevLicenseBody,"&prdVer=");
302 strcat(szActDevLicenseBody,szPdtVer);
303 strcat(szActDevLicenseBody,"&devEsn=");
304 strcat(szActDevLicenseBody,szDevESN);
305 strcat(szActDevLicenseBody,"&ordLac=");
306 strcat(szActDevLicenseBody,szOrdLac);
307
308 //临时文件名生成
309 strcpy(TmpFileName,"D:\\dm\\sdp\\LicenseLog\\TmpFile\\TmpFile");
310 strcpy(vuserid_str,lr_eval_string("{vuserid_Param}"));
311 strcpy(curtime_str,lr_eval_string("{curtime_Param}"));
312 strcat(TmpFileName,vuserid_str);
313 strcat(TmpFileName,"_");
314 strcat(TmpFileName,curtime_str);
315
316 //加密szActDevLicenseBody
317 iRet = Encrypt(1,SecurityCodeTmp,szActDevLicenseBody,TmpFileName,szActDevLicenseBodyEnc);
318 lr_output_message("----------iRet:%d, szActDevLicenseBodyEnc: %s----------",iRet,szActDevLicenseBodyEnc);
319
320 //放入参数中
321 lr_save_string(szActDevLicenseBodyEnc,"actDevLicenseBody_Param");
322
323 //关联data内容
324 web_reg_save_param_ex(
325 "ParamName=actDevLicense_requestData_Param",
326 "LB=data=",
327 "RB=",
328 SEARCH_FILTERS,
329 LAST);
330
331 //关联Content-Length的值
332 web_reg_save_param_ex(
333 "ParamName=ContentLength_Param",
334 "LB=Content-Length: ",
335 "RB=\r\n",
336 SEARCH_FILTERS,
337 "Scope=HEADERS",
338 LAST);
339
340 lr_start_transaction("ActiveOnline");
341
342 web_custom_request("web_custom_request",
343 "URL=http://{Param_serverIP}/LSP/device/licOnlineActivation.do;jsessionid={jsessionid_Param}?type=1",
344 "Method=POST",
345 "TargetFrame=",
346 "Resource=0",
347 "Referer=",
348 "Mode=HTTP",
349 "BodyBinary={actDevLicenseBody_Param}",
350 LAST);
351
352 lr_end_transaction("ActiveOnline", LR_AUTO);
353
354 ContentLength = atoi(lr_eval_string("{ContentLength_Param}")) - strlen("type=0&data=");
355
356 //解密data内容
357 memcpy(actDevLicense_requestData,lr_eval_string("{actDevLicense_requestData_Param}"),ContentLength);
358 iRet = Decrypt(1,SecurityCodeTmp,actDevLicense_requestData,ContentLength,TmpFileName,actDevLicense_requestDataDnc);
359 lr_output_message("----------iRet:%d, actDevLicense_requestDataDnc: %s----------",iRet,actDevLicense_requestDataDnc);
360
361 //提取resCode
362 memset(requestDataDnc_Tmp,'\0',sizeof(requestDataDnc_Tmp));
363 strcpy(requestDataDnc_Tmp,actDevLicense_requestDataDnc); //因为strtok会破坏源字符串,因此放在一个临时区域中
364 resCodeTmp = (char *)strstr(requestDataDnc_Tmp,resCodeTou);
365 if (NULL == resCodeTmp)
366 {
367 lr_error_message("resCodeTmp is NULL!");
368 //return -1;
369 goto START;
370
371 }
372 resCodeTmp += strlen(resCodeTou);
373 resCodeTmp = (char *)strtok(resCodeTmp,delim);
374 resCode = atoi(resCodeTmp);
375 lr_output_message("----------resCode:%d----------",resCode);
376
377 //判断响应的返回码是否正确,为100,如果不正确就退出!
378 if (100!=resCode && 200!=resCode && 104!=resCode)
379 {
380 lr_error_message("resCode is not 100 !");
381 //return -1;
382 goto START;
383 }
384
385 if (104 == resCode)
386 {
387 goto DOWNLOADSTEP;
388 }
389
390 //提取license文件信息中的产品名称
391 memset(requestDataDnc_Tmp,'\0',sizeof(requestDataDnc_Tmp));
392 strcpy(requestDataDnc_Tmp,actDevLicense_requestDataDnc);
393 ProductNameTmp = (char *)strstr(requestDataDnc_Tmp,ProductNameTou);
394 if (NULL == ProductNameTmp)
395 {
396 lr_error_message("ProductNameTmp is NULL!");
397 //return -1;
398 goto START;
399
400 }
401 ProductNameTmp += strlen(ProductNameTou);
402 ProductNameTmp = (char *)strtok(ProductNameTmp,ProductName_delim);
403 lr_output_message("Notify:ProductNameTmp:%s",ProductNameTmp);
404
405
406 //提取license文件信息中的版本号
407 memset(requestDataDnc_Tmp,'\0',sizeof(requestDataDnc_Tmp));
408 //strcpy(requestDataDnc_Tmp,getDevLicense_requestDataD); //jzq
409 strcpy(requestDataDnc_Tmp,actDevLicense_requestDataDnc);
410 VersionTmp = (char *)strstr(requestDataDnc_Tmp,VersionTou);
411 lr_output_message("actDevLicense_requestDataDnc:%s,requestDataDnc_Tmp:%s", actDevLicense_requestDataDnc,requestDataDnc_Tmp);
412 if (NULL == VersionTmp)
413 {
414 lr_error_message("VersionTmp is NULL!");
415 //return -1;
416 goto START;
417
418 }
419 VersionTmp += strlen(VersionTou);
420 VersionTmp = (char *)strtok(VersionTmp,Version_delim);
421 lr_output_message("Notify:VersionTmp:%s",VersionTmp);
422
423
424 //提取license文件信息中的ESN
425 memset(requestDataDnc_Tmp,'\0',sizeof(requestDataDnc_Tmp));
426 //strcpy(requestDataDnc_Tmp,getDevLicense_requestDataDnc); //jzq
427 strcpy(requestDataDnc_Tmp,actDevLicense_requestDataDnc);
428 EsnTmp = (char *)strstr(requestDataDnc_Tmp,EsnTou);
429 if (NULL == EsnTmp)
430 {
431 lr_error_message("Esn is NULL!");
432 //return -1;
433 goto START;
434
435 }
436 EsnTmp += strlen(EsnTou);
437 EsnTmp = (char *)strtok(EsnTmp,Esn_delim);
438 lr_output_message("Notify:EsnTmp:%s",EsnTmp);
439
440 //数据校验....1.需要用到安全码;2.需要用到刚才请求的返回值。校验规则:"产品名称、版本号、ESN"三者是否跟最初一致?如果不一致就事务报错!!!
441 //校验产品名称
442 memcpy(ProductNameTmp_STR,ProductNameTmp,strlen(szPdtName));
443 strcmp_result = strcmp(szPdtName,ProductNameTmp_STR);
444 if (0 != strcmp_result) {
445 lr_error_message("strcmp_result:%d ProductName is not same!!!",strcmp_result);
446 //return -1;
447 goto START;
448 }
449
450 //校验版本
451 memcpy(VersionTmp_STR,VersionTmp,strlen(szPdtVer));
452 strcmp_result = strcmp(szPdtVer,VersionTmp_STR);
453 if (0 != strcmp_result) {
454 lr_error_message("strcmp_result:%d Version is not same!!!",strcmp_result);
455 //return -1;
456 goto START;
457 }
458
459 //校验Esn
460 memcpy(EsnTmp_STR,EsnTmp,strlen(szDevESN));
461 strcmp_result = strcmp(szDevESN,EsnTmp_STR);
462 if (0 != strcmp_result) {
463 lr_error_message("strcmp_result:%d Esn is not same!!!",strcmp_result);
464 //return -1;
465 goto START;
466 }
467
468 goto RELEASESESSIONSTEP;
469
470
471 DOWNLOADSTEP:
472 //--------------------------------在线下载--------------------------------
473 //封装body
474 strcat(szDownLoadOnlineBody,szPdtName);
475 strcat(szDownLoadOnlineBody,"&prdVer=");
476 strcat(szDownLoadOnlineBody,szPdtVer);
477 strcat(szDownLoadOnlineBody,"&devEsn=");
478 strcat(szDownLoadOnlineBody,szDevESN);
479 strcat(szDownLoadOnlineBody,"&ordLac=");
480 strcat(szDownLoadOnlineBody,szOrdLac);
481
482 //临时文件名生成
483 strcpy(TmpFileName,"D:\\dm\\sdp\\LicenseLog\\TmpFile\\TmpFile");
484 strcpy(vuserid_str,lr_eval_string("{vuserid_Param}"));
485 strcpy(curtime_str,lr_eval_string("{curtime_Param}"));
486 strcat(TmpFileName,vuserid_str);
487 strcat(TmpFileName,"_");
488 strcat(TmpFileName,curtime_str);
489
490 //加密szDownLoadOnlineBody
491 iRet = Encrypt(1,SecurityCodeTmp,szDownLoadOnlineBody,TmpFileName,szDownLoadOnlineBodyEnc);
492 lr_output_message("----------iRet:%d, szDownLoadOnlineBodyEnc: %----------s",iRet,szDownLoadOnlineBodyEnc);
493
494 //放入参数中
495 lr_save_string(szDownLoadOnlineBodyEnc,"getDevLicenseBody_Param");
496
497 //设置能关联到得最大值
498 web_set_max_html_param_len("100000");
499
500
501 //关联data内容
502 web_reg_save_param_ex(
503 "ParamName=getDevLicense_requestData_Param",
504 "LB=data=",
505 "RB=",
506 SEARCH_FILTERS,
507 LAST);
508
509 //关联Content-Length的值
510 web_reg_save_param_ex(
511 "ParamName=ContentLength_Param",
512 "LB=Content-Length: ",
513 "RB=\r\n",
514 SEARCH_FILTERS,
515 "Scope=HEADERS",
516 LAST);
517
518 lr_start_transaction("DownloadOnline");
519
520 web_custom_request("web_custom_request",
521 "URL=http://{Param_serverIP}/LSP/device/licOnlineActivation.do;jsessionid={jsessionid_Param}?type=1",
522 "Method=POST",
523 "TargetFrame=",
524 "Resource=0",
525 "Referer=",
526 "Mode=HTTP",
527 "BodyBinary={getDevLicenseBody_Param}",
528 LAST);
529
530 lr_end_transaction("DownloadOnline", LR_AUTO);
531
532 ContentLength = atoi(lr_eval_string("{ContentLength_Param}")) - strlen("type=0&data=");
533
534 //解密data内容
535 memcpy(getDevLicense_requestData,lr_eval_string("{getDevLicense_requestData_Param}"),ContentLength);
536 iRet = Decrypt(1,SecurityCodeTmp,getDevLicense_requestData,ContentLength,TmpFileName,getDevLicense_requestDataDnc);
537 lr_output_message("----------iRet:%d, getDevLicense_requestDataDnc: %s----------",iRet,getDevLicense_requestDataDnc);
538
539
540 //提取resCode
541 memset(requestDataDnc_Tmp,'\0',sizeof(requestDataDnc_Tmp));
542 strcpy(requestDataDnc_Tmp,getDevLicense_requestDataDnc);
543 resCodeTmp = (char *)strstr(requestDataDnc_Tmp,resCodeTou);
544 if (NULL == resCodeTmp)
545 {
546 lr_error_message("resCodeTmp is NULL!");
547 //return -1;
548 goto START;
549
550 }
551 resCodeTmp += strlen(resCodeTou);
552 resCodeTmp = (char *)strtok(resCodeTmp,delim);
553 resCode = atoi(resCodeTmp);
554 lr_output_message("Notify:resCode:%d",resCode);
555
556 //判断响应的返回码是否正确,为100,如果不正确就退出!
557 if (100!=resCode && 200!=resCode)
558 {
559 //return -1;
560 goto START;
561 }
562
563 //提取license文件信息中的产品名称
564 memset(requestDataDnc_Tmp,'\0',sizeof(requestDataDnc_Tmp));
565 strcpy(requestDataDnc_Tmp,getDevLicense_requestDataDnc); //因为strtok会破坏源字符串,因此放在一个临时区域中
566 ProductNameTmp = (char *)strstr(requestDataDnc_Tmp,ProductNameTou);
567 if (NULL == ProductNameTmp)
568 {
569 lr_error_message("ProductNameTmp is NULL!");
570 //return -1;
571 goto START;
572
573 }
574 ProductNameTmp += strlen(ProductNameTou);
575 ProductNameTmp = (char *)strtok(ProductNameTmp,ProductName_delim);
576 lr_output_message("----------ProductNameTmp:%s----------",ProductNameTmp);
577
578
579 //提取license文件信息中的版本号
580 memset(requestDataDnc_Tmp,'\0',sizeof(requestDataDnc_Tmp));
581 strcpy(requestDataDnc_Tmp,getDevLicense_requestDataDnc); //因为strtok会破坏源字符串,因此放在一个临时区域中
582 VersionTmp = (char *)strstr(requestDataDnc_Tmp,VersionTou);
583 if (NULL == VersionTmp)
584 {
585 lr_error_message("VersionTmp is NULL!");
586 //return -1;
587 goto START;
588
589 }
590 VersionTmp += strlen(VersionTou);
591 VersionTmp = (char *)strtok(VersionTmp,Version_delim);
592 lr_output_message("----------VersionTmp:%s----------",VersionTmp);
593
594
595 //提取license文件信息中的ESN
596 memset(requestDataDnc_Tmp,'\0',sizeof(requestDataDnc_Tmp));
597 strcpy(requestDataDnc_Tmp,getDevLicense_requestDataDnc); //因为strtok会破坏源字符串,因此放在一个临时区域中
598 EsnTmp = (char *)strstr(requestDataDnc_Tmp,EsnTou);
599 if (NULL == EsnTmp)
600 {
601 lr_error_message("Esn is NULL!");
602 //return -1;
603 goto START;
604
605 }
606 EsnTmp += strlen(EsnTou);
607 EsnTmp = (char *)strtok(EsnTmp,Esn_delim);
608 lr_output_message("----------EsnTmp:%s----------",EsnTmp);
609
610 //数据校验....1.需要用到安全码;2.需要用到刚才请求的返回值。校验规则:"产品名称、版本号、ESN"三者是否跟最初一致?如果不一致就事务报错!!!
611 //校验产品名称
612 memcpy(ProductNameTmp_STR,ProductNameTmp,strlen(szPdtName));
613 strcmp_result = strcmp(szPdtName,ProductNameTmp_STR);
614 if (0 != strcmp_result)
615 {
616 lr_error_message("strcmp_result:%d ProductName is not same!",strcmp_result);
617 //return -1;
618 goto START;
619 }
620
621 //校验版本
622 memcpy(VersionTmp_STR,VersionTmp,strlen(szPdtVer));
623 strcmp_result = strcmp(szPdtVer,VersionTmp_STR);
624 if (0 != strcmp_result)
625 {
626 lr_error_message("strcmp_result:%d Version is not same!",strcmp_result);
627 //return -1;
628 goto START;
629 }
630
631 //校验Esn
632 memcpy(EsnTmp_STR,EsnTmp,strlen(szDevESN));
633 strcmp_result = strcmp(szDevESN,EsnTmp_STR);
634 if (0 != strcmp_result)
635 {
636 lr_error_message("strcmp_result:%d Esn is not same!",strcmp_result);
637 //return -1;
638 goto START;
639 }
640
641 RELEASESESSIONSTEP:
642 //--------------------------------释放会话资源--------------------------------
643 //封装body
644 strcpy(szJsessionid,lr_eval_string("{jsessionid_Param}"));
645 strcat(szReleaseSessionBody,szJsessionid);
646
647 //加密szReleaseSessionBody
648 iRet = Encrypt(0,"",szReleaseSessionBody,TmpFileName,szReleaseSessionBodyEnc);
649 lr_output_message("----------iRet:%d, szReleaseSessionBodyEnc: %s----------",iRet,szReleaseSessionBodyEnc);
650
651 //放入参数中
652 lr_save_string(szReleaseSessionBodyEnc,"relSesRsrBody_Param");
653
654 //关联data内容
655 web_reg_save_param_ex(
656 "ParamName=relSesRsr_requestData_Param",
657 "LB=data=",
658 "RB=",
659 SEARCH_FILTERS,
660 LAST);
661
662 //关联Content-Length的值
663 web_reg_save_param_ex(
664 "ParamName=ContentLength_Param",
665 "LB=Content-Length: ",
666 "RB=\r\n",
667 SEARCH_FILTERS,
668 "Scope=HEADERS",
669 LAST);
670
671 lr_start_transaction("ReleaseSession");
672
673 web_custom_request("web_custom_request",
674 "URL=http://{Param_serverIP}/LSP/device/licOnlineActivation.do;jsessionid={jsessionid_Param}?type=0",
675 "Method=POST",
676 "TargetFrame=",
677 "Resource=0",
678 "Referer=",
679 "Mode=HTTP",
680 "BodyBinary={relSesRsrBody_Param}",
681 LAST);
682
683 lr_end_transaction("ReleaseSession", LR_AUTO);
684
685 ContentLength = atoi(lr_eval_string("{ContentLength_Param}")) - strlen("type=0&data=");
686
687 //解密data内容
688 memcpy(relSesRsr_requestData,lr_eval_string("{relSesRsr_requestData_Param}"),ContentLength);
689 iRet = Decrypt(0,"",relSesRsr_requestData,ContentLength,TmpFileName,relSesRsr_requestDataDnc);
690 lr_output_message("----------iRet:%d, relSesRsr_requestDataDnc: %s----------",iRet,relSesRsr_requestDataDnc);
691
692 //提取resCode
693 memset(requestDataDnc_Tmp,'\0',sizeof(requestDataDnc_Tmp));
694 strcpy(requestDataDnc_Tmp,relSesRsr_requestDataDnc);
695 resCodeTmp = (char *)strstr(requestDataDnc_Tmp,resCodeTou);
696 if (NULL == resCodeTmp)
697 {
698 lr_error_message("resCodeTmp is NULL!");
699 //return -1;
700 goto START;
701
702 }
703 resCodeTmp += strlen(resCodeTou);
704 resCodeTmp = (char *)strtok(resCodeTmp,delim);
705 resCode = atoi(resCodeTmp);
706 lr_output_message("----------resCode:%d----------",resCode);
707
708 return 0;
709 }
DLL源码
头文件dencdll.h:
1 _declspec(dllexport) int Encrypt(int iType, const char *szSecurityCode, const char *szOri, const char *szFileName, char *szRes); 2 3 _declspec(dllexport) int Decrypt(int iType, const char *szSecurityCode, const unsigned char *szOri, int iOriLen, const char *szFileName, char *szRes);
源文件dencdll.c:
1 #include "dencdll.h"
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdlib.h>
5 #include <ctype.h>
6
7 /*
8 函数介绍:调用加密批处理命令进行加密操作,并将加密结果转换成十六进制的形式以供web_custom_request函数使用。(当没有安全码传入时使用enc0.bat进行加密,
9 如:enc0.bat enc 0 "string";当需要安全码传入时使用enc1.bat进行加密,如:enc1.bat enc 1 安全码 "string")
10
11 参数:iType--类型:0不传入安全码,1传入安全码; szSecurityCode--安全码; szOri--待加密的字符串; szFileName--临时文
12 件名(包含文件绝对路径); szRes--返回的密文串,调用者负责申请足够的内存
13
14 返回值:0--成功; 非0--失败
15 */
16 int Encrypt(int iType, const char *szSecurityCode, const char *szOri, const char *szFileName, char *szRes)
17 {
18 char *szCommand = NULL;
19 FILE *pFile = NULL;
20 char szTmp1[32];
21 char szTmp2[128];
22 const char *szTmp3 = "cd C:\\dm\\sdp\\systemdll\\SdpEndecTest\\bin";
23 char szTmp4 = '\0';
24 int iLen = 0;
25 int i = 0;
26 char szResTmp[4096];
27 char curHexCode[10];
28
29 memset(szTmp1,'\0',sizeof(szTmp1));
30 memset(szTmp2,'\0',sizeof(szTmp2));
31 memset(szResTmp,'\0',sizeof(szResTmp));
32 memset(curHexCode,'\0',sizeof(curHexCode));
33
34 //判断传入的参数是否齐全
35 if(NULL==szOri || NULL==szFileName || NULL==szRes)
36 {
37 return -1;
38 }
39
40 //判断是否需要传入安全码
41 if(0 == iType)
42 {
43 strcpy(szTmp1,"enc0.bat enc 0");
44 }
45 else if(1 == iType)
46 {
47 strcpy(szTmp1,"enc0.bat enc 1");
48 }
49 else
50 {
51 return -2;
52 }
53
54 //申请内存用于存放加密命令串
55 szCommand = (char *)malloc(strlen(szOri)+strlen(szTmp1)+strlen(szFileName)+64);
56 if(NULL == szCommand)
57 {
58 return -3;
59 }
60 sprintf(szCommand,"%s %s \"%s\" > %s",szTmp1,szSecurityCode,szOri,szFileName);
61
62 //进入到加解密批处理命令执行目录下
63 system(szTmp3);
64
65 //执行加密命令行,命令执行结果重定向到临时文件中
66 system(szCommand);
67
68 //释放存放加密命令串的内存
69 free(szCommand);
70
71 //读临时文件
72 pFile = fopen(szFileName,"r+");
73 if(NULL == pFile)
74 {
75 return -4;
76 }
77
78 while(!feof(pFile))
79 {
80 fread(szTmp2,sizeof(szTmp2)-1,1,pFile);
81 strcat(szResTmp,szTmp2);
82 memset(szTmp2,'\0',sizeof(szTmp2));
83 }
84
85 //文件尾处理
86 iLen = strlen(szResTmp);
87 if((0<iLen) && iscntrl(szResTmp[iLen-1]))
88 {
89 szResTmp[iLen-1] = '\0';
90 }
91
92 //将字符流转换成十六进制形式
93 iLen = strlen(szResTmp);
94 for(i=0; i<iLen; i+=2)
95 {
96 memset(curHexCode,'\0',sizeof(curHexCode));
97 curHexCode[0] = '\\';
98 curHexCode[1] = 'x';
99 curHexCode[2] = szResTmp[i];
100 curHexCode[3] = szResTmp[i+1];
101 strcat(szRes, curHexCode);
102 }
103
104 //关闭文件
105 fclose(pFile);
106 pFile = NULL;
107
108 return 0;
109 }
110
111
112
113
114 /*
115 函数介绍:调用解密批处理命令进行解密操作。(当没有安全码传入时使用dec0.bat进行解密;当需要安全码传入时使用dec1.bat进行解密)
116
117 参数:iType--类型:0不传入安全码,1传入安全码; szSecurityCode--安全码; szOri--待解密的密文串;iOriLen--密文串的长度;szFileName--临时文
118 件名(包含文件绝对路径); szRes--返回的解密后的字符串,调用者负责申请足够的内存
119
120 返回值:0--成功; 非0--失败
121 */
122 int Decrypt(int iType, const char *szSecurityCode, const unsigned char *szOri, int iOriLen, const char *szFileName, char *szRes)
123 {
124 char *szCommand = NULL;
125 FILE *pFile = NULL;
126 char szTmp1[32];
127 char szTmp2[128];
128 int iLen = 0;
129 int i = 0;
130 char hexCodeString[40960];
131 char curHexCode[10];
132 const char *szTmp3 = "cd C:\\dm\\sdp\\systemdll\\SdpEndecTest\\bin";
133
134 memset(szTmp1,'\0',sizeof(szTmp1));
135 memset(szTmp2,'\0',sizeof(szTmp2));
136 memset(curHexCode,'\0',sizeof(curHexCode));
137 memset(hexCodeString,'\0',sizeof(hexCodeString));
138
139 //将密文串格式化为十六进制形式
140 for (i=0; i<iOriLen; i++)
141 {
142 sprintf(curHexCode, "%02X", szOri[i]);
143 strcat(hexCodeString, curHexCode);
144 memset(curHexCode,'\0',sizeof(curHexCode));
145 }
146
147 //判断传入的参数是否齐全
148 if(NULL==szOri || NULL==szFileName || NULL==szRes)
149 {
150 return -1;
151 }
152
153 //判断是否需要传入安全码
154 if(0 == iType)
155 {
156 strcpy(szTmp1,"dec0.bat dec 0");
157 }
158 else if(1 == iType)
159 {
160 strcpy(szTmp1,"dec0.bat dec 1");
161 }
162 else
163 {
164 return -2;
165 }
166
167 //申请内存用于存放解密命令串
168 szCommand = (char *)malloc(strlen(hexCodeString)+strlen(szTmp1)+strlen(szFileName)+64);
169 if(NULL == szCommand)
170 {
171 return -3;
172 }
173 sprintf(szCommand,"%s %s \"%s\" > %s",szTmp1,szSecurityCode,hexCodeString,szFileName);
174
175 //进入到加解密批处理命令执行目录下
176 system(szTmp3);
177
178 //执行解密命令行,命令执行结果重定向到临时文件中
179 system(szCommand);
180
181 //释放存放加密命令串的内存
182 free(szCommand);
183
184 //读临时文件
185 pFile = fopen(szFileName,"r+");
186 if(NULL == pFile)
187 {
188 return -4;
189 }
190
191 while(!feof(pFile))
192 {
193 fread(szTmp2,sizeof(szTmp2)-1,1,pFile);
194 strcat(szRes,szTmp2);
195 memset(szTmp2,'\0',sizeof(szTmp2));
196 }
197
198 //文件尾处理
199 iLen = strlen(szRes);
200 if((0<iLen) && iscntrl(szRes[iLen-1]))
201 {
202 szRes[iLen-1] = '\0';
203 }
204
205 //关闭文件
206 fclose(pFile);
207 pFile = NULL;
208
209 return 0;
210 }


浙公网安备 33010602011771号