#include "stdafx.h" #include // MFC core and standard components #include // MFC extensions #include // MFC Automation classes #include "MobsetHttp.h" #include "..\FXSend.h" #include "..\FXSendDlg.h" #include "..\..\..\public\SendPub.h" #pragma comment(lib,"iphlpapi.lib") //因为用到openssl,需要引入相关lib //#pragma comment(lib,".\\mobsetHttp\\openssl\\libcryptoMT.lib") //#pragma comment(lib,".\\mobsetHttp\\openssl\\libsslMT.lib") #pragma comment(lib,"crypt32.lib") #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[] = __FILE__; #define new DEBUG_NEW #endif namespace MobsetHttp { void Logger_initiation() { return; //暂不使用此日志记录器 /* AutoPtr pChannel(new FileChannel); pChannel->setProperty("path", ".\\HTTPLog\\HttpLog.log"); pChannel->setProperty("rotation", "daily"); //按日归档 pChannel->setProperty("archive", "timestamp"); //pChannel->setProperty("purgeAge", "months"); //每月删除 pChannel->setProperty("purgeCount", "30"); //每月删除 Poco::AutoPtr patternFormatter(new Poco::PatternFormatter("%Y-%m-%d %H:%M:%S.%c %t")); patternFormatter->setProperty("times", "local"); // 格式化中的时间显示为本地时间 //patternFormatter->setProperty("pattern", "%Y-%m-%d %H:%M:%S.%c %t"); Poco::AutoPtr formattingChannel(new Poco::FormattingChannel(patternFormatter, pChannel)); //pChannel->setProperty("times", "local"); //pChannel->setProperty("pattern", "%Y-%m-%d-%m-%d %H:%M:%s"); //pChannel->setProperty("archive", "timestamp"); Logger::root().setChannel(formattingChannel); Logger& logger = Logger::get("HTTPLog"); // inherits root channel logger.information("Http Log 启动 "); */ } void logger_Setup() { static bool b_setup = false; // only allow run once time if (!b_setup) { b_setup = true; Logger_initiation(); } } class MyPartHandler : public Poco::Net::PartHandler { public: MyPartHandler() : _length(0) { } void handlePart(const MessageHeader& header, std::istream& stream) { _type = header.get("Content-Type", "(unspecified)"); if (header.has("Content-Disposition")) { std::string disp; NameValueCollection params; MessageHeader::splitParameters(header["Content-Disposition"], disp, params); _name = params.get("name", "(unnamed)"); _fileName = params.get("filename", "(unnamed)"); } CountingInputStream istr(stream); NullOutputStream ostr; StreamCopier::copyStream(istr, ostr); _length = istr.chars(); } int length() const { return _length; } const std::string& name() const { return _name; } const std::string& fileName() const { return _fileName; } const std::string& contentType() const { return _type; } private: int _length; std::string _type; std::string _name; std::string _fileName; }; class FormRequestHandler : public HTTPRequestHandler /// Return a HTML document with the current date and time. { public: enum SmsFuncType { SMS_UNKNOW=0, SMS_SEND = 1, SMS_GETRECV = 2, SMS_GETREPORT = 3, SMS_GETBALANCE = 4, SMS_GETSIGN = 5, SMS_GETSTATUS = 6, SMS_WXWORK=7, TEMPLATE_ADD = 8, TEMPLATE_MODIFY = 9, TEMPLATE_DEL = 10, TEMPLATE_QUERY = 11, TEMPLATE_LIST = 12, TEMPLATE_SENDSMS = 13, SIGNNAME_APPLY = 14, SIGNNAME_STATUS = 15, SMS_CANCEL=16, }; enum SmsHttpVer { SMS_HTTP_VER_UNKNOW=0, SMS_HTTP_VER_1 = 1, SMS_HTTP_VER_2 = 2, SMS_HTTP_VER_3 = 3, SMS_HTTP_VER_WXWORK =4, }; enum SmsReqCharset { SMS_REQCHARSET_AUTO = 0, SMS_REQCHARSET_GBK = 1, SMS_REQCHARSET_UTF8 = 2, }; public: MobsetHttpEx * m_pMobsetHttpEx; public: FormRequestHandler(MobsetHttpEx * pHttpEx) { m_pMobsetHttpEx = pHttpEx; } void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response) { //Application& app = Application::instance(); //app.logger().information("Request from " + request.clientAddress().toString()); //Logger::root().information("Request from " + request.clientAddress().toString()); //std::string text; //StreamCopier::copyToString(request.stream(), text); //std::string host = request.get("HOST"); DWORD dwReqTime = ::GetTickCount(); URI uri(request.getURI()); std::string path = uri.getPath(); //std::string query = uri.getQuery(); std::string query =uri.getRawQuery(); Poco::trim(path); std::string postdata; StreamCopier::copyToString(request.stream(), postdata); //获取 Post 过来的数据 //std::istringstream ss(postdata); //复制一个istream给HTMLForm读取参数 //std::istringstream ss(""); //复制一个istream给HTMLForm读取参数 //MyPartHandler partHandler; //HTMLForm form(request, ss, partHandler); MyHttpParamsParser form; form.Parser(&query,&postdata); DWORD dwReqCount = m_pMobsetHttpEx->m_dwReqCount++; long lRetCode = -1000; /* std::ostream& ostr2 = response.send(); ostr2 << "1,test OK"; return; */ //先判断URL CString strResponse; CStringA strResopnseA; SmsFuncType funcType = SMS_UNKNOW; SmsHttpVer httpVer = SMS_HTTP_VER_UNKNOW; SmsReqCharset reqCharset = SMS_REQCHARSET_AUTO; if (Poco::icompare(path, "/SDK3/Sms") == 0) { httpVer = SMS_HTTP_VER_3; CString strMethod = form.getAsStringW("Methods", "", reqCharset); strMethod.Trim(); if (strMethod.CompareNoCase( _T("SmsSend")) == 0) funcType = SMS_SEND; else if (strMethod.CompareNoCase(_T("SmsGetRecv")) == 0) funcType = SMS_GETRECV; else if (strMethod.CompareNoCase(_T("SmsGetReport")) == 0) funcType = SMS_GETREPORT; else if (strMethod.CompareNoCase(_T("SmsGetBalance")) == 0) funcType = SMS_GETBALANCE; else if (strMethod.CompareNoCase(_T("SmsGetSign")) == 0) funcType = SMS_GETSIGN; else if (strMethod.CompareNoCase(_T("SmsCancel")) == 0) funcType = SMS_CANCEL; else if (strMethod.CompareNoCase(_T("TemplateAdd")) == 0) funcType = TEMPLATE_ADD; else if (strMethod.CompareNoCase(_T("TemplateModify")) == 0) funcType = TEMPLATE_MODIFY; else if (strMethod.CompareNoCase(_T("TemplateDel")) == 0) funcType = TEMPLATE_DEL; else if (strMethod.CompareNoCase(_T("TemplateQuery")) == 0) funcType = TEMPLATE_QUERY; else if (strMethod.CompareNoCase(_T("TemplateList")) == 0) funcType = TEMPLATE_LIST; else if (strMethod.CompareNoCase(_T("TemplateSendSms")) == 0) funcType = TEMPLATE_SENDSMS; else if (strMethod.CompareNoCase(_T("SignNameApply")) == 0) funcType = SIGNNAME_APPLY; else if (strMethod.CompareNoCase(_T("SignNameStatus")) == 0) funcType = SIGNNAME_STATUS; else if (strMethod.CompareNoCase(_T("TemplateAdd")) == 0) funcType = TEMPLATE_ADD; else if (strMethod.CompareNoCase(_T("TemplateModify")) == 0) funcType = TEMPLATE_MODIFY; else if (strMethod.CompareNoCase(_T("TemplateDel")) == 0) funcType = TEMPLATE_DEL; else if (strMethod.CompareNoCase(_T("TemplateQuery")) == 0) funcType = TEMPLATE_QUERY; else if (strMethod.CompareNoCase(_T("TemplateList")) == 0) funcType = TEMPLATE_LIST; else if (strMethod.CompareNoCase(_T("TemplateSendSms")) == 0) funcType = TEMPLATE_SENDSMS; if (funcType == SMS_UNKNOW) { response.setChunkedTransferEncoding(true); MediaType mType("application/json"); mType.setParameter("Charset", "utf-8"); response.setContentType(mType); std::ostream& ostr = response.send(); std::ostringstream rspStr; Poco::JSON::Object rspObj; rspObj.set("Code", -191); rspObj.set("Message", "Method不存在"); rspObj.stringify(rspStr,2); strResopnseA = CW2A(CA2W(rspStr.str().c_str()),CP_UTF8); ostr << strResopnseA; return; } } if (funcType == SMS_UNKNOW && Poco::icompare(path, "/SDK/Sms_KYSms.asp") == 0) { funcType = SMS_GETBALANCE; httpVer = SMS_HTTP_VER_1; } if (funcType == SMS_UNKNOW && Poco::icompare(path, "/SDK2/Sms_KYSms.asp") == 0) { funcType = SMS_GETBALANCE; httpVer = SMS_HTTP_VER_2; } if (funcType == SMS_UNKNOW && Poco::icompare(path, "/SDK/Sms_Status.asp") == 0) { funcType = SMS_GETSTATUS; httpVer = SMS_HTTP_VER_1; } if (funcType == SMS_UNKNOW && Poco::icompare(path, "/SDK2/Sms_Status.asp") == 0) { funcType = SMS_GETSTATUS; httpVer = SMS_HTTP_VER_2; } if (funcType == SMS_UNKNOW && Poco::icompare(path, "/SDK/Sms_GetCM.asp") == 0) { funcType = SMS_GETSIGN; httpVer = SMS_HTTP_VER_1; } if (funcType == SMS_UNKNOW && Poco::icompare(path, "/SDK2/Sms_GetCM.asp") == 0) { funcType = SMS_GETSIGN; httpVer = SMS_HTTP_VER_2; } if (funcType == SMS_UNKNOW && Poco::icompare(path, "/SDK/Sms_Send.asp") == 0) { funcType = SMS_SEND; httpVer = SMS_HTTP_VER_1; } if (funcType == SMS_UNKNOW && Poco::icompare(path, "/SDK2/Sms_Send.asp") == 0) { funcType = SMS_SEND; httpVer = SMS_HTTP_VER_2; } if (funcType == SMS_UNKNOW && Poco::icompare(path, "/SDK/Sms_Recv.asp") == 0) { funcType = SMS_GETRECV; httpVer = SMS_HTTP_VER_1; } if (funcType == SMS_UNKNOW && Poco::icompare(path, "/SDK2/Sms_Recv.asp") == 0) { funcType = SMS_GETRECV; httpVer = SMS_HTTP_VER_2; } if (funcType == SMS_UNKNOW && Poco::icompare(path, "/SDK/Sms_Cancel.asp") == 0) { funcType = SMS_CANCEL; httpVer = SMS_HTTP_VER_1; } if (funcType == SMS_UNKNOW && Poco::icompare(path, "/SDK2/Sms_Cancel.asp") == 0) { funcType = SMS_CANCEL; httpVer = SMS_HTTP_VER_2; } if (funcType == SMS_UNKNOW && Poco::icompare(path, "/WxWork") == 0) { funcType = SMS_WXWORK; httpVer = SMS_HTTP_VER_WXWORK; } response.setChunkedTransferEncoding(true); switch (httpVer) { case SMS_HTTP_VER_3: { reqCharset = SMS_REQCHARSET_UTF8; //原始请求编码,UTF-8 MediaType mType("application/json"); mType.setParameter("Charset", "utf-8"); response.setContentType(mType); } break; case SMS_HTTP_VER_1: case SMS_HTTP_VER_2: { MediaType mType("text/html"); CStringW strCharset = form.getAsStringW("Charset", "", reqCharset); if (strCharset.CompareNoCase(_T("UTF-8")) == 0) { reqCharset = SMS_REQCHARSET_UTF8; mType.setParameter("Charset", "utf-8"); } else { reqCharset = SMS_REQCHARSET_GBK; //原始请求编码,GB2312 mType.setParameter("Charset", "GB2312"); } response.setContentType(mType); } break; case SMS_HTTP_VER_WXWORK: { MediaType mType("text/xml"); mType.setParameter("Charset", "utf-8"); response.setContentType(mType); } break; default: { MediaType mType("text/html"); mType.setParameter("Charset", "GB2312"); response.setContentType(mType); } break; } switch (funcType) { case SMS_SEND: strResponse = Http_Sms_Send(request, response, form, path,httpVer, reqCharset, lRetCode); break; case SMS_GETRECV: strResponse = Http_Sms_Recv(request, response, form, path, httpVer, reqCharset, lRetCode); break; case SMS_GETREPORT: strResponse = Http_Sms_Report(request, response, form, path, httpVer, reqCharset, lRetCode); break; case SMS_GETSTATUS: strResponse = Http_Sms_Status(request, response, form, path, httpVer, reqCharset, lRetCode); break; case SMS_GETBALANCE: strResponse = Http_Sms_KYSms(request, response, form, path, httpVer, reqCharset, lRetCode); break; case SMS_GETSIGN: strResponse = Http_Sms_GetCM(request, response, form, path, httpVer, reqCharset, lRetCode); break; case SMS_WXWORK: strResponse = Http_Sms_WxWork(request, response, form, path, httpVer, reqCharset, lRetCode, postdata); break; case SMS_CANCEL: strResponse = Http_Sms_Cancel(request, response, form, path, httpVer, reqCharset, lRetCode); break; case SIGNNAME_APPLY: strResponse = Http_SignName_Apply(request, response, form, path, httpVer, reqCharset, lRetCode, postdata); break; case SIGNNAME_STATUS: strResponse = Http_SignName_Status(request, response, form, path, httpVer, reqCharset,lRetCode); break; case TEMPLATE_ADD: strResponse = Http_Template_Add(request, response, form, path, httpVer, reqCharset, lRetCode); break; case TEMPLATE_MODIFY: strResponse = Http_Template_Modify(request, response, form, path, httpVer, reqCharset, lRetCode); break; case TEMPLATE_DEL: strResponse = Http_Template_Del(request, response, form, path, httpVer, reqCharset, lRetCode); break; case TEMPLATE_QUERY: strResponse = Http_Template_Query(request, response, form, path, httpVer, reqCharset, lRetCode); break; case TEMPLATE_LIST: strResponse = Http_Template_List(request, response, form, path, httpVer, reqCharset, lRetCode); break; case TEMPLATE_SENDSMS: strResponse = Http_Template_SendSms(request, response, form, path, httpVer, reqCharset, lRetCode); break; } std::ostream& ostr = response.send(); if (funcType != SMS_UNKNOW && strResponse.GetLength() > 0) //发送返回 { if (httpVer == SMS_HTTP_VER_3 || httpVer == SMS_HTTP_VER_WXWORK) strResopnseA = CW2A(strResponse, CP_UTF8); else { if (reqCharset == SMS_REQCHARSET_UTF8) strResopnseA = CW2A(strResponse, CP_UTF8); else strResopnseA = CW2A(strResponse); } ostr << strResopnseA; } else { if (funcType == SMS_UNKNOW) { response.setChunkedTransferEncoding(true); MediaType mType("text/html"); mType.setParameter("Charset", "GB2312"); response.setContentType(mType); strResopnseA = " MobsetApi HttpServices! "; sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr(); char IP[32] = { 0 }; //char *p = inet_ntoa(pSin->sin_addr); //strcpy(IP, inet_ntoa(pSin->sin_addr)); inet_ntop(AF_INET, &pSin->sin_addr, IP, 32); //211.147.242.59 http://192.168.1.16/ if (strcmp(IP,"211.147.242.59")!=0) { CString strHtmlFileName = CString(_T("\\MobsetWeb.html")); std::string host = request.get("HOST"); CStringA strHostA = CA2W(host.c_str()); strHostA.MakeLower(); if (strHostA.Find("web5.mobset.com") >= 0) strHtmlFileName = CString(_T("\\MobsetWeb_Oem.html")); if (strHostA.Find("sms3.mobset.net") >= 0) strHtmlFileName = CString(_T("\\MobsetWeb_Oem.html")); BOOL bReadFile = false; TCHAR RootDirectory[_MAX_PATH] = { 0 }; m_pMobsetHttpEx->GetCurrentPath(RootDirectory); CString strFileName = CString(RootDirectory) + strHtmlFileName; CFile file; if (file.Open(strFileName, CFile::modeRead)) { char * p = new char[file.GetLength()]; memset(p, 0, file.GetLength()); file.Read(p, file.GetLength()); CStringA str(p, file.GetLength()); file.Close(); strResopnseA = str; bReadFile = true; delete p; //return 404; } } /* CStringA strWebURL; if (this->m_pMobsetHttpEx->m_pParam) { CFXSendDlg * pDlg = (CFXSendDlg *)this->m_pMobsetHttpEx->m_pParam; strWebURL = CW2A(pDlg->m_MCom_Head.szA7); } CStringA strResopnseB = "\n" "\n" "短信易\n" "\n" "\n" "\n" "

抱歉,你访问的链接不存在,请检查!

\n" "

如果你想访问短信易Web版,它已迁移至:

\n" "

%s

\n" "\n" "\n"; strResopnseA.Format(strResopnseB, strWebURL, strWebURL); */ ostr << strResopnseA; } else { if (httpVer == SMS_HTTP_VER_3) { std::ostringstream rspStr; Poco::JSON::Object rspObj; rspObj.set("Code", -299); rspObj.set("Message", "未定义错误"); rspObj.stringify(rspStr, 2); strResopnseA = CW2A(CA2W(rspStr.str().c_str()), CP_UTF8); ostr << strResopnseA; } else { ostr << "-299,未定义错误"; } } } if (m_pMobsetHttpEx->m_bHttpLog) { //记录日志:客户端IP\tGET/POST\tHOST\tURL\tPOST Data std::string clientAddress = request.clientAddress().toString(); std::string mothod = request.getMethod(); //std::string URL = request.getURI(); std::string URL = path; if(query.length()>0 ) URL=URL+'?' + query; std::string host = request.get("HOST"); //std::string postdata; //StreamCopier::copyToString(request.stream(), postdata); /* CString strClientAddress = CA2W(clientAddress.c_str()); CString strMothod = CA2W(mothod.c_str()); CString strHost = CA2W(host.c_str()); CString strURL = CA2W(URL.c_str()); strURL.Replace(_T("\r"), _T(" ")); strURL.Replace(_T("\n"), _T(" ")); strURL.Replace(_T("\t"), _T(" ")); CString strPostData = CA2W(postdata.c_str()); if (strPostData.GetLength() > 1024) strPostData = strPostData.Left(1024); strPostData.Replace(_T("\r"), _T(" ")); strPostData.Replace(_T("\n"), _T(" ")); strPostData.Replace(_T("\t"), _T(" ")); */ CStringA strLog; //strLog.Format(_T("%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s"), dwReqCount, lRetCode, ::GetTickCount() - dwReqTime,strClientAddress, strMothod, strHost, strURL, strPostData); strLog.Format("%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s", dwReqCount, lRetCode, ::GetTickCount() - dwReqTime, clientAddress.c_str(), mothod.c_str(), host.c_str(), URL.c_str(), postdata.c_str()); this->m_pMobsetHttpEx->Http_LogA(strLog); } /* ostr << "\n" "\n" "POCO Form Server Sample\n" "\n" "\n" "\n" "

POCO Form Server Sample

\n" "

GET Form

\n" "
\n" "\n" "\n" "
\n" "

POST Form

\n" "
\n" "\n" "\n" "
\n" "

File Upload

\n" "
\n" " \n" "\n" "
\n"; ostr << "

Request

\n"; ostr << "Method: " << request.getMethod() << "
\n"; ostr << "URI: " << request.getURI() << "
\n"; NameValueCollection::ConstIterator it = request.begin(); NameValueCollection::ConstIterator end = request.end(); for (; it != end; ++it) { ostr << it->first << ": " << it->second << "
\n"; } ostr << "

"; if (!form.empty()) { ostr << "

Form

\n"; it = form.begin(); end = form.end(); for (; it != end; ++it) { ostr << it->first << ": " << it->second << "
\n"; } ostr << "

"; } if (!partHandler.name().empty()) { ostr << "

Upload

\n"; ostr << "Name: " << partHandler.name() << "
\n"; ostr << "File Name: " << partHandler.fileName() << "
\n"; ostr << "Type: " << partHandler.contentType() << "
\n"; ostr << "Size: " << partHandler.length() << "
\n"; ostr << "

"; } ostr << "\n"; */ } static CStringW ChangeHttpReqToW(std::string in, long lPage) { CStringW str; BOOL bUTF8 = false; switch (lPage) { case 1: //GBK编码 bUTF8 = false; break; case 2: //UTF8编码 bUTF8 = true; break; case 0: //自动编码 default: bUTF8 = IsTextUTF8((char*)in.c_str(), in.length()); break; } if (bUTF8) str= CA2W(in.c_str(), CP_UTF8); else str= CA2W(in.c_str()); return str; } static BOOL IsTextUTF8(char* str, long length) { DWORD nBytes = 0;//UFT8可用1-6个字节编码,ASCII用一个字节 UCHAR chr; BOOL bAllAscii = TRUE; //如果全部都是ASCII, 说明不是UTF-8 for (int i = 0; i= 0x80) { if (chr >= 0xFC && chr <= 0xFD) nBytes = 6; else if (chr >= 0xF8) nBytes = 5; else if (chr >= 0xF0) nBytes = 4; else if (chr >= 0xE0) nBytes = 3; else if (chr >= 0xC0) nBytes = 2; else return FALSE; nBytes--; } } else //多字节符的非首字节,应为 10xxxxxx { if ((chr & 0xC0) != 0x80) return FALSE; nBytes--; } } if (nBytes > 0) //违返规则 return FALSE; if (bAllAscii) //如果全部都是ASCII, 说明不是UTF-8 return FALSE; return TRUE; } CString Http_Sms_KYSms(HTTPServerRequest& request, HTTPServerResponse& response, MyHttpParamsParser & form, std::string & path, SmsHttpVer httpVer, SmsReqCharset reqCharset, long & lRetCode) { CString strResponse; try { if (m_pMobsetHttpEx && m_pMobsetHttpEx->m_pMobsetAPI) { MobsetApi::MobsetApiServiceEx *pMobsetAPI = new MobsetApi::MobsetApiServiceEx(); Copy_MobsetApiService(pMobsetAPI, m_pMobsetHttpEx->m_pMobsetAPI); MobsetApi::_ns1__Sms_USCOREGetBalance * pReq = new MobsetApi::_ns1__Sms_USCOREGetBalance; MobsetApi::_ns1__Sms_USCOREGetBalanceResponse *pResponse = new MobsetApi::_ns1__Sms_USCOREGetBalanceResponse; try { pReq->soap = NULL; pReq->LoginName = NULL; pReq->Password = NULL; pReq->TimeStamp = NULL; pResponse->ErrMsg = NULL; pReq->CorpID = _ttol(form.getAsStringW("CorpID", "0", reqCharset)); pReq->LoginName = SOAP_NEW(std::wstring); *pReq->LoginName = form.getAsStringW("LoginName", "", reqCharset); pReq->Password = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 *pReq->Password = form.getAsStringW("SecretKey", "", reqCharset); else *pReq->Password = form.getAsStringW("Passwd", "", reqCharset); pReq->TimeStamp = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_1) { *pReq->TimeStamp = _T("MOBSETHTTP1"); } else { *pReq->TimeStamp = form.getAsStringW("TimeStamp", "", reqCharset); } pReq->soap = new soap; //memset(pReq->soap, 0, sizeof(soap)); sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr()->sa_data; memcpy(&pReq->soap->ip, ((BYTE*)request.clientAddress().addr()->sa_data) + 2, 4); //4个字节的IP地址 pReq->soap->ip = htonl(pReq->soap->ip); pReq->soap->port = request.clientAddress().port(); pReq->soap->state = this->m_pMobsetHttpEx->m_bSSL; //是否HTTPS pReq->soap->version = (short)httpVer; //首易HTTP协议版本 pMobsetAPI->Sms_USCOREGetBalance(pReq, pResponse); //请求 lRetCode = pResponse->Balance; if (httpVer == SMS_HTTP_VER_1 || httpVer == SMS_HTTP_VER_2) { switch (pResponse->Balance) //返回值转换 { case -102: pResponse->Balance = -1; break; case -100: case -101: case -103: case -104: case -105: pResponse->Balance = -2; break; } strResponse.Format(_T("%d,%s"), pResponse->Balance, pResponse->ErrMsg->c_str()); //生成返回 //strResponse.Format(_T("%d"), pResponse->Balance); //生成返回 } else { std::ostringstream rspStr; Poco::JSON::Object rspObj(Poco::JSON_PRESERVE_KEY_ORDER); rspObj.set("Code", pResponse->Balance); rspObj.set("Message", (std::string)CW2A(pResponse->ErrMsg->c_str())); rspObj.stringify(rspStr, 2); strResponse = CA2W(rspStr.str().c_str()); } } catch (...) { } try { if (pReq) { if (pReq->soap) delete pReq->soap; if (pReq->LoginName) delete pReq->LoginName; if (pReq->Password) delete pReq->Password; if (pReq->TimeStamp) delete pReq->TimeStamp; delete pReq; } if (pResponse) { //if (pResponse->ErrMsg) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->ErrMsg); delete pResponse; } } catch (...) { } delete pMobsetAPI; } } catch (...) { } return strResponse; } CString Http_Sms_Status(HTTPServerRequest& request, HTTPServerResponse& response, MyHttpParamsParser & form, std::string & path, SmsHttpVer httpVer, SmsReqCharset reqCharset, long & lRetCode) { CString strResponse; try { if (m_pMobsetHttpEx && m_pMobsetHttpEx->m_pMobsetAPI) { MobsetApi::MobsetApiServiceEx *pMobsetAPI = new MobsetApi::MobsetApiServiceEx(); Copy_MobsetApiService(pMobsetAPI, m_pMobsetHttpEx->m_pMobsetAPI); MobsetApi::_ns1__Sms_USCOREGetBalance * pReq = new MobsetApi::_ns1__Sms_USCOREGetBalance; MobsetApi::_ns1__Sms_USCOREGetBalanceResponse *pResponse = new MobsetApi::_ns1__Sms_USCOREGetBalanceResponse; try { pReq->soap = NULL; pReq->LoginName = NULL; pReq->Password = NULL; pReq->TimeStamp = NULL; pResponse->ErrMsg = NULL; /* //HTTP版本 long lHTTPSDKVer = 1; if (Poco::icompare(path, "/SDK2/Sms_Status.asp") == 0) lHTTPSDKVer = 2; std::string strTemp = form.get("CorpID", ""); pReq->CorpID = atol(strTemp.c_str()); strTemp = form.get("LoginName", ""); pReq->LoginName = SOAP_NEW(std::wstring); *pReq->LoginName = ChangeHttpReqToW(strTemp, 1);//CA2W(strTemp.c_str(),CP_UTF8); strTemp = form.get("Passwd", ""); pReq->Password = SOAP_NEW(std::wstring); *pReq->Password = ChangeHttpReqToW(strTemp, 1);//CA2W(strTemp.c_str(),CP_UTF8); pReq->TimeStamp = SOAP_NEW(std::wstring); if (lHTTPSDKVer == 2) { strTemp = form.get("TimeStamp", ""); } else { strTemp = "MOBSETHTTP1"; } *pReq->TimeStamp = ChangeHttpReqToW(strTemp, 1);//CA2W(strTemp.c_str(),CP_UTF8); */ pReq->soap = new soap; //memset(pReq->soap, 0, sizeof(soap)); sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr()->sa_data; memcpy(&pReq->soap->ip, ((BYTE*)request.clientAddress().addr()->sa_data) + 2, 4); //4个字节的IP地址 pReq->soap->ip = htonl(pReq->soap->ip); pReq->soap->port = request.clientAddress().port(); pReq->soap->chunksize = _ttol(form.getAsStringW("SmsID", "0", reqCharset)); pReq->soap->state = this->m_pMobsetHttpEx->m_bSSL; //是否HTTPS pReq->soap->version = (short)httpVer; //首易HTTP协议版本 pMobsetAPI->Sms_USCOREGetStatus(pReq, pResponse); //请求 lRetCode = pResponse->Balance; //strResponse.Format(_T("%d,%s"), pResponse->Balance, pResponse->ErrMsg->c_str()); //生成返回 strResponse.Format(_T("%d"), pResponse->Balance); //生成返回 } catch (...) { } try { if (pReq) { if (pReq->soap) delete pReq->soap; if (pReq->LoginName) delete pReq->LoginName; if (pReq->Password) delete pReq->Password; if (pReq->TimeStamp) delete pReq->TimeStamp; delete pReq; } if (pResponse) { //if (pResponse->ErrMsg) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->ErrMsg); delete pResponse; } } catch (...) { } delete pMobsetAPI; } } catch (...) { } return strResponse; } CString Http_Sms_WxWork(HTTPServerRequest& request, HTTPServerResponse& response, MyHttpParamsParser & form, std::string & path, SmsHttpVer httpVer, SmsReqCharset reqCharset, long & lRetCode, std::string & postData) { CString strResponse; try { CFXSendDlg * pDlg = NULL; if (this->m_pMobsetHttpEx->m_pParam) { pDlg = (CFXSendDlg *)this->m_pMobsetHttpEx->m_pParam; } if (pDlg && m_pMobsetHttpEx && m_pMobsetHttpEx->m_pMobsetAPI) { MobsetApi::MobsetApiServiceEx *pMobsetAPI = new MobsetApi::MobsetApiServiceEx(); Copy_MobsetApiService(pMobsetAPI, m_pMobsetHttpEx->m_pMobsetAPI); MobsetApi::_ns1__Sms_USCOREGetBalance * pReq = new MobsetApi::_ns1__Sms_USCOREGetBalance; MobsetApi::_ns1__Sms_USCOREGetBalanceResponse *pResponse = new MobsetApi::_ns1__Sms_USCOREGetBalanceResponse; try { pReq->soap = NULL; pReq->LoginName = NULL; pReq->Password = NULL; pReq->TimeStamp = NULL; pResponse->ErrMsg = NULL; pReq->soap = new soap; //memset(pReq->soap, 0, sizeof(soap)); sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr()->sa_data; memcpy(&pReq->soap->ip, ((BYTE*)request.clientAddress().addr()->sa_data) + 2, 4); //4个字节的IP地址 pReq->soap->ip = htonl(pReq->soap->ip); pReq->soap->port = request.clientAddress().port(); std::string msgsignature = form.get("msg_signature", ""); std::string timestamp = form.get("timestamp", ""); std::string nonce = form.get("nonce", ""); std::string echostr = form.get("echostr", ""); std::string wxCorpID, wxToken, WxAESKey; wxCorpID = std::string(CW2A(pDlg->m_MCom_Head.szCmpp_CorpID)); wxToken = std::string(CW2A(pDlg->m_MCom_Head.szA7)); WxAESKey = std::string(CW2A(pDlg->m_MCom_Head.szA8)); WXBizMsgCrypt wxCrypt(wxToken, WxAESKey, wxCorpID); if (echostr.length() > 0) //这是设置URL的。 { std::string reechostr; wxCrypt.VerifyURL(msgsignature, timestamp, nonce, echostr, reechostr); strResponse = CString(CA2W(reechostr.c_str())); } else { strResponse = _T(""); std::string rexml; if (wxCrypt.DecryptMsg(msgsignature, timestamp, nonce, postData, rexml) == 0) { std::string FromUserName; std::string MsgType; std::string Content; wxCrypt.GetXmlField(rexml, "FromUserName", FromUserName); wxCrypt.GetXmlField(rexml, "MsgType", MsgType); wxCrypt.GetXmlField(rexml, "Content", Content); CString strMsgType = CA2W(MsgType.c_str(), CP_UTF8); CString strFromUser = CA2W(FromUserName.c_str(), CP_UTF8); CString strMsg = CA2W(Content.c_str(), CP_UTF8); if (strMsgType == CString(_T("text")) && strMsg.GetLength() > 0) { pReq->LoginName = SOAP_NEW(std::wstring); *pReq->LoginName = strFromUser; pReq->Password = SOAP_NEW(std::wstring); *pReq->Password = strMsg; pReq->soap->state = this->m_pMobsetHttpEx->m_bSSL; //是否HTTPS pReq->soap->version = (short)httpVer; //首易HTTP协议版本 m_pMobsetHttpEx->m_pMobsetAPI->Sms_USCOREWxWork(pReq, pResponse); //请求 strResponse = CString(pResponse->ErrMsg->c_str()); //m_pMobsetHttpEx->m_pMobsetAPI->Sms_USCOREWxWork(pReq, pResponse); //请求 //lRetCode = pResponse->Balance; //strResponse.Format(_T("%d"), pResponse->Balance); //生成返回 } } } } catch (...) { } try { if (pReq) { if (pReq->soap) delete pReq->soap; if (pReq->LoginName) delete pReq->LoginName; if (pReq->Password) delete pReq->Password; if (pReq->TimeStamp) delete pReq->TimeStamp; delete pReq; } if (pResponse) { //if (pResponse->ErrMsg) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->ErrMsg); delete pResponse; } } catch (...) { } delete pMobsetAPI; } } catch (...) { } return strResponse; } CString Http_Sms_Cancel(HTTPServerRequest& request, HTTPServerResponse& response, MyHttpParamsParser& form, std::string& path, SmsHttpVer httpVer, SmsReqCharset reqCharset, long& lRetCode) { CString strResponse; try { if (m_pMobsetHttpEx && m_pMobsetHttpEx->m_pMobsetAPI) { MobsetApi::MobsetApiServiceEx* pMobsetAPI = new MobsetApi::MobsetApiServiceEx(); Copy_MobsetApiService(pMobsetAPI, m_pMobsetHttpEx->m_pMobsetAPI); MobsetApi::_ns1__Sms_USCORECancel* pReq = new MobsetApi::_ns1__Sms_USCORECancel; MobsetApi::_ns1__Sms_USCORECancelResponse* pResponse = new MobsetApi::_ns1__Sms_USCORECancelResponse; try { pReq->soap = NULL; pReq->LoginName = NULL; pReq->Password = NULL; pReq->TimeStamp = NULL; pResponse->ErrMsg = NULL; pReq->CorpID = _ttol(form.getAsStringW("CorpID", "0", reqCharset)); pReq->LoginName = SOAP_NEW(std::wstring); *pReq->LoginName = form.getAsStringW("LoginName", "", reqCharset); pReq->Password = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 *pReq->Password = form.getAsStringW("SecretKey", "", reqCharset); else *pReq->Password = form.getAsStringW("Passwd", "", reqCharset); pReq->TimeStamp = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_1) { *pReq->TimeStamp = _T("MOBSETHTTP1"); } else { *pReq->TimeStamp = form.getAsStringW("TimeStamp", "", reqCharset); } CString strSmsID;; strSmsID = form.getAsStringW("SmsID", "", reqCharset); CStringArray strIDS; strSmsID.Replace(_T(";"), _T(",")); strSmsID.Replace(_T(";"), _T(",")); strSmsID.Replace(_T(","), _T(",")); strSmsID.Replace(_T("."), _T(",")); strSmsID.Replace(_T("。"), _T(",")); strSmsID.Replace(_T(":"), _T(",")); strSmsID.Replace(_T(":"), _T(",")); strSmsID.Replace(_T(" "), _T(",")); strSmsID.Replace(_T(" "), _T(",")); strSmsID.Replace(_T(";"), _T(",")); SplitString(strIDS, strSmsID, _T(",")); long lSmsIDCount = strIDS.GetSize(); pReq->SmsID = new LONG64[lSmsIDCount]; pReq->__sizeSmsID = lSmsIDCount; for (int i = 0; i < lSmsIDCount; i++) { pReq->SmsID[i] = _ttol(strIDS.GetAt(i)); } pReq->soap = new soap; //memset(pReq->soap, 0, sizeof(soap)); sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr()->sa_data; memcpy(&pReq->soap->ip, ((BYTE*)request.clientAddress().addr()->sa_data) + 2, 4); //4个字节的IP地址 pReq->soap->ip = htonl(pReq->soap->ip); pReq->soap->port = request.clientAddress().port(); //pReq->SmsID = _ttol(form.getAsStringW("SmsID", "0", reqCharset)); pReq->soap->state = this->m_pMobsetHttpEx->m_bSSL; //是否HTTPS pReq->soap->version = (short)httpVer; //首易HTTP协议版本 pMobsetAPI->Sms_USCORECancel(pReq, pResponse); //请求 lRetCode = pResponse->Result; if (httpVer == SMS_HTTP_VER_1 || httpVer == SMS_HTTP_VER_2) { //strResponse.Format(_T("%d,%s"), pResponse->Balance, pResponse->ErrMsg->c_str()); //生成返回 strResponse.Format(_T("%d"), pResponse->Result); //生成返回 } else { std::ostringstream rspStr; Poco::JSON::Object rspObj(Poco::JSON_PRESERVE_KEY_ORDER); rspObj.set("Code", pResponse->Result); rspObj.set("Message", (std::string)CW2A(pResponse->ErrMsg->c_str())); Poco::JSON::Array msgID; if (pResponse->CancelIDList) //取回复ID { for (int i = 0; i < pResponse->__sizeCancelIDList; i++) { if (pResponse->CancelIDList[i]) { Poco::JSON::Object rspMsgID(Poco::JSON_PRESERVE_KEY_ORDER); rspMsgID.set("SmsID", pResponse->CancelIDList[i]->SmsID); rspMsgID.set("Status", pResponse->CancelIDList[i]->Status); msgID.add(rspMsgID); } } if (msgID.size() > 0) rspObj.set("Details", msgID); } rspObj.stringify(rspStr, 2); strResponse = CA2W(rspStr.str().c_str()); } } catch (...) { } try { if (pReq) { if (pReq->soap) delete pReq->soap; if (pReq->LoginName) delete pReq->LoginName; if (pReq->Password) delete pReq->Password; if (pReq->TimeStamp) delete pReq->TimeStamp; if (pReq->SmsID) delete pReq->SmsID; delete pReq; } if (pResponse) { //if (pResponse->ErrMsg) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->ErrMsg); delete pResponse; } } catch (...) { } delete pMobsetAPI; } } catch (...) { } return strResponse; } CString Http_Sms_GetCM(HTTPServerRequest& request, HTTPServerResponse& response, MyHttpParamsParser & form, std::string & path, SmsHttpVer httpVer, SmsReqCharset reqCharset, long &lRetCode) { CString strResponse; try { if (m_pMobsetHttpEx && m_pMobsetHttpEx->m_pMobsetAPI) { MobsetApi::MobsetApiServiceEx *pMobsetAPI = new MobsetApi::MobsetApiServiceEx(); Copy_MobsetApiService(pMobsetAPI, m_pMobsetHttpEx->m_pMobsetAPI); MobsetApi::_ns1__Sms_USCOREGetSign * pReq = new MobsetApi::_ns1__Sms_USCOREGetSign; MobsetApi::_ns1__Sms_USCOREGetSignResponse *pResponse = new MobsetApi::_ns1__Sms_USCOREGetSignResponse; try { pReq->soap = NULL; pReq->LoginName = NULL; pReq->Password = NULL; pReq->TimeStamp = NULL; pResponse->ErrMsg = NULL; long lCharsetType = 0; switch (httpVer) { case SMS_HTTP_VER_1: case SMS_HTTP_VER_2: lCharsetType = 1; //GB2312 break; case SMS_HTTP_VER_3: lCharsetType = 2; //UTF-8 break; } pReq->CorpID = _ttol(form.getAsStringW("CorpID", "0", reqCharset)); pReq->LoginName = SOAP_NEW(std::wstring); *pReq->LoginName = form.getAsStringW("LoginName", "", reqCharset); pReq->Password = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 *pReq->Password = form.getAsStringW("SecretKey", "", reqCharset); else *pReq->Password = form.getAsStringW("Passwd", "", reqCharset); pReq->TimeStamp = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_1) { *pReq->TimeStamp = _T("MOBSETHTTP1"); } else { *pReq->TimeStamp = form.getAsStringW("TimeStamp", "", reqCharset); } pReq->soap = new soap; //memset(pReq->soap, 0, sizeof(soap)); sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr()->sa_data; memcpy(&pReq->soap->ip, ((BYTE*)request.clientAddress().addr()->sa_data) + 2, 4); //4个字节的IP地址 pReq->soap->ip = htonl(pReq->soap->ip); pReq->soap->port = request.clientAddress().port(); pReq->soap->state = this->m_pMobsetHttpEx->m_bSSL; //是否HTTPS pReq->soap->version = (short)httpVer; //首易HTTP协议版本 pMobsetAPI->Sms_USCOREGetSign(pReq, pResponse); //请求 lRetCode = pResponse->ErrCode; if (httpVer == SMS_HTTP_VER_1 || httpVer == SMS_HTTP_VER_2) { switch (pResponse->ErrCode) //返回值转换 { case 0: pResponse->ErrCode = 1; break; case -100: case -102: pResponse->ErrCode = -1; break; case -101: case -103: case -104: case -105: pResponse->ErrCode = -2; break; } if (pResponse->ErrCode == 1) strResponse.Format(_T("%d,【%s】"), pResponse->ErrCode, pResponse->Sign->c_str()); //生成返回 else strResponse.Format(_T("%d,%s"), pResponse->ErrCode, pResponse->ErrMsg->c_str()); //生成返回 //strResponse.Format(_T("%d"), pResponse->Balance); //生成返回 } else { std::ostringstream rspStr; Poco::JSON::Object rspObj(Poco::JSON_PRESERVE_KEY_ORDER); rspObj.set("Code", pResponse->ErrCode); rspObj.set("Message", (std::string)CW2A(pResponse->ErrMsg->c_str())); if (pResponse->Sign) rspObj.set("Sign", (std::string)CW2A(pResponse->Sign->c_str())); rspObj.stringify(rspStr, 2); strResponse = CA2W(rspStr.str().c_str()); } } catch (...) { } try { if (pReq) { if (pReq->soap) delete pReq->soap; if (pReq->LoginName) delete pReq->LoginName; if (pReq->Password) delete pReq->Password; if (pReq->TimeStamp) delete pReq->TimeStamp; delete pReq; } if (pResponse) { //if (pResponse->ErrMsg) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->ErrMsg); //if (pResponse->Sign) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->Sign); delete pResponse; } } catch (...) { } delete pMobsetAPI; } } catch (...) { } return strResponse; } CString Http_SignName_Apply(HTTPServerRequest& request, HTTPServerResponse& response, MyHttpParamsParser & form, std::string & path, SmsHttpVer httpVer, SmsReqCharset reqCharset,long & lRetCode, std::string & postData) { CString strResponse; try { if (m_pMobsetHttpEx && m_pMobsetHttpEx->m_pMobsetAPI) { MobsetApi::MobsetApiServiceEx *pMobsetAPI = new MobsetApi::MobsetApiServiceEx(); Copy_MobsetApiService(pMobsetAPI, m_pMobsetHttpEx->m_pMobsetAPI); MobsetApi::_ns1__SignName_USCOREApply * pReq = new MobsetApi::_ns1__SignName_USCOREApply; MobsetApi::_ns1__SignName_USCOREApplyResponse *pResponse = new MobsetApi::_ns1__SignName_USCOREApplyResponse; try { pReq->soap = NULL; pReq->LoginName = NULL; pReq->Password = NULL; pReq->TimeStamp = NULL; pReq->DefaultSignName = 1; pReq->SignNameType = 0; pReq->SignNameBelongTo = 0; pReq->SignName = NULL; pReq->Document1Type = 0; pReq->Document1FileName = NULL; pReq->Document1FileData = NULL; pReq->Document2Type = 0; pReq->Document2FileName = NULL; pReq->Document2FileData = NULL; pReq->Document3Type = 0; pReq->Document3FileName = NULL; pReq->Document3FileData = NULL; pReq->Remark = NULL; pResponse->ErrMsg = NULL; pReq->CorpID = _ttol(form.getAsStringW("CorpID", "0", reqCharset)); pReq->LoginName = SOAP_NEW(std::wstring); *pReq->LoginName = form.getAsStringW("LoginName", "", reqCharset); pReq->Password = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 *pReq->Password = form.getAsStringW("SecretKey", "", reqCharset); else *pReq->Password = form.getAsStringW("Passwd", "", reqCharset); pReq->TimeStamp = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_1) { *pReq->TimeStamp = _T("MOBSETHTTP1"); } else { *pReq->TimeStamp = form.getAsStringW("TimeStamp", "", reqCharset); } pReq->DefaultSignName = _ttol(form.getAsStringW("DefaultSignName", "1", reqCharset)); pReq->SignNameType = _ttol(form.getAsStringW("SignNameType", "0", reqCharset)); pReq->SignNameBelongTo = _ttol(form.getAsStringW("SignNameBelongTo", "0", reqCharset)); pReq->SignName = SOAP_NEW(std::wstring); *pReq->SignName = form.getAsStringW("SignName", "", reqCharset); pReq->Document1Type = _ttol(form.getAsStringW("Document1Type", "0", reqCharset)); pReq->Document1FileName = SOAP_NEW(std::wstring); *pReq->Document1FileName = form.getAsStringW("Document1FileName", "", reqCharset); //取三个文件中的最大值。 long lFileDataLength1 = form.getLength("Document1FileData"); long lFileDataLength2 = form.getLength("Document2FileData"); long lFileDataLength3 = form.getLength("Document3FileData"); long lFileDataLength = lFileDataLength1; if (lFileDataLength < lFileDataLength2) lFileDataLength = lFileDataLength2; if (lFileDataLength < lFileDataLength3) lFileDataLength = lFileDataLength3; BYTE * pFileData = new BYTE[lFileDataLength]; if (lFileDataLength1 > 0) { long lGetData = form.getAsBase64Decode("Document1FileData", pFileData, lFileDataLength); if (lGetData > 0) { pReq->Document1FileData = (MobsetApi::xsd__base64Binary*)SOAP_NEW(MobsetApi::xsd__base64Binary); pReq->Document1FileData->__size = lGetData; pReq->Document1FileData->__ptr = SOAP_NEW(BYTE[lGetData]); memcpy(pReq->Document1FileData->__ptr, pFileData, lGetData); } } pReq->Document2Type = _ttol(form.getAsStringW("Document2Type", "0", reqCharset)); pReq->Document2FileName = SOAP_NEW(std::wstring); *pReq->Document2FileName = form.getAsStringW("Document2FileName", "", reqCharset); if (lFileDataLength2 > 0) { long lGetData = form.getAsBase64Decode("Document2FileData", pFileData, lFileDataLength); if (lGetData > 0) { pReq->Document2FileData = (MobsetApi::xsd__base64Binary*)SOAP_NEW(MobsetApi::xsd__base64Binary); pReq->Document2FileData->__size = lGetData; pReq->Document2FileData->__ptr = SOAP_NEW(BYTE[lGetData]); memcpy(pReq->Document2FileData->__ptr, pFileData, lGetData); } } pReq->Document3Type = _ttol(form.getAsStringW("Document3Type", "0", reqCharset)); pReq->Document3FileName = SOAP_NEW(std::wstring); *pReq->Document3FileName = form.getAsStringW("Document3FileName", "", reqCharset); if (lFileDataLength3 > 0) { long lGetData = form.getAsBase64Decode("Document3FileData", pFileData, lFileDataLength); if (lGetData > 0) { pReq->Document3FileData = (MobsetApi::xsd__base64Binary*)SOAP_NEW(MobsetApi::xsd__base64Binary); pReq->Document3FileData->__size = lGetData; pReq->Document3FileData->__ptr = SOAP_NEW(BYTE[lGetData]); memcpy(pReq->Document3FileData->__ptr, pFileData, lGetData); } } if (pFileData) delete pFileData; pReq->Remark = SOAP_NEW(std::wstring); *pReq->Remark = form.getAsStringW("Remark", "", reqCharset); pReq->soap = new soap; //memset(pReq->soap, 0, sizeof(soap)); sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr()->sa_data; memcpy(&pReq->soap->ip, ((BYTE*)request.clientAddress().addr()->sa_data) + 2, 4); //4个字节的IP地址 pReq->soap->ip = htonl(pReq->soap->ip); pReq->soap->port = request.clientAddress().port(); pReq->soap->state = this->m_pMobsetHttpEx->m_bSSL; //是否HTTPS pReq->soap->version = (short)httpVer; //首易HTTP协议版本 pMobsetAPI->SignName_USCOREApply(pReq, pResponse); //请求 lRetCode = pResponse->SignNameID; std::ostringstream rspStr; Poco::JSON::Object rspObj(Poco::JSON_PRESERVE_KEY_ORDER); rspObj.set("Code", pResponse->SignNameID); rspObj.set("Message", (std::string)CW2A(pResponse->ErrMsg->c_str())); rspObj.stringify(rspStr, 2); strResponse = CA2W(rspStr.str().c_str()); } catch (...) { } try { if (pReq) { if (pReq->soap) delete pReq->soap; if (pReq->LoginName) delete pReq->LoginName; if (pReq->Password) delete pReq->Password; if (pReq->TimeStamp) delete pReq->TimeStamp; if (pReq->SignName) delete pReq->SignName; if (pReq->Document1FileName) delete pReq->Document1FileName; if (pReq->Document1FileData) { if (pReq->Document1FileData->__ptr) delete pReq->Document1FileData->__ptr; delete pReq->Document1FileData; } if (pReq->Document2FileName) delete pReq->Document2FileName; if (pReq->Document2FileData) { if (pReq->Document2FileData->__ptr) delete pReq->Document2FileData->__ptr; delete pReq->Document2FileData; } if (pReq->Document3FileName) delete pReq->Document3FileName; if (pReq->Document3FileData) { if (pReq->Document3FileData->__ptr) delete pReq->Document3FileData->__ptr; delete pReq->Document3FileData; } if (pReq->Remark) delete pReq->Remark; delete pReq; } if (pResponse) { //if (pResponse->ErrMsg) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->ErrMsg); //if (pResponse->Sign) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->Sign); delete pResponse; } } catch (...) { } delete pMobsetAPI; } } catch (...) { } return strResponse; } CString Http_SignName_Status(HTTPServerRequest& request, HTTPServerResponse& response, MyHttpParamsParser & form, std::string & path, SmsHttpVer httpVer, SmsReqCharset reqCharset, long &lRetCode) { CString strResponse; try { if (m_pMobsetHttpEx && m_pMobsetHttpEx->m_pMobsetAPI) { MobsetApi::MobsetApiServiceEx *pMobsetAPI = new MobsetApi::MobsetApiServiceEx(); Copy_MobsetApiService(pMobsetAPI, m_pMobsetHttpEx->m_pMobsetAPI); MobsetApi::_ns1__SignName_USCOREStatus * pReq = new MobsetApi::_ns1__SignName_USCOREStatus; MobsetApi::_ns1__SignName_USCOREStatusResponse *pResponse = new MobsetApi::_ns1__SignName_USCOREStatusResponse; try { pReq->soap = NULL; pReq->LoginName = NULL; pReq->Password = NULL; pReq->TimeStamp = NULL; pResponse->ErrMsg = NULL; pReq->CorpID = _ttol(form.getAsStringW("CorpID", "0", reqCharset)); pReq->LoginName = SOAP_NEW(std::wstring); *pReq->LoginName = form.getAsStringW("LoginName", "", reqCharset); pReq->Password = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 *pReq->Password = form.getAsStringW("SecretKey", "", reqCharset); else *pReq->Password = form.getAsStringW("Passwd", "", reqCharset); pReq->TimeStamp = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_1) { *pReq->TimeStamp = _T("MOBSETHTTP1"); } else { *pReq->TimeStamp = form.getAsStringW("TimeStamp", "", reqCharset); } pReq->SignNameID = _ttol(form.getAsStringW("SignNameID", "1", reqCharset)); pReq->soap = new soap; //memset(pReq->soap, 0, sizeof(soap)); sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr()->sa_data; memcpy(&pReq->soap->ip, ((BYTE*)request.clientAddress().addr()->sa_data) + 2, 4); //4个字节的IP地址 pReq->soap->ip = htonl(pReq->soap->ip); pReq->soap->port = request.clientAddress().port(); pReq->soap->state = this->m_pMobsetHttpEx->m_bSSL; //是否HTTPS pReq->soap->version = (short)httpVer; //首易HTTP协议版本 pMobsetAPI->SignName_USCOREStatus(pReq, pResponse); //请求 lRetCode = pResponse->Status; std::ostringstream rspStr; Poco::JSON::Object rspObj(Poco::JSON_PRESERVE_KEY_ORDER); rspObj.set("Code", pResponse->Status); rspObj.set("Message", (std::string)CW2A(pResponse->ErrMsg->c_str())); rspObj.stringify(rspStr, 2); strResponse = CA2W(rspStr.str().c_str()); } catch (...) { } try { if (pReq) { if (pReq->soap) delete pReq->soap; if (pReq->LoginName) delete pReq->LoginName; if (pReq->Password) delete pReq->Password; if (pReq->TimeStamp) delete pReq->TimeStamp; delete pReq; } if (pResponse) { //if (pResponse->ErrMsg) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->ErrMsg); //if (pResponse->Sign) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->Sign); delete pResponse; } } catch (...) { } delete pMobsetAPI; } } catch (...) { } return strResponse; } CString Http_Template_Add(HTTPServerRequest& request, HTTPServerResponse& response, MyHttpParamsParser & form, std::string & path, SmsHttpVer httpVer, SmsReqCharset reqCharset, long &lRetCode) { CString strResponse; try { if (m_pMobsetHttpEx && m_pMobsetHttpEx->m_pMobsetAPI) { MobsetApi::MobsetApiServiceEx *pMobsetAPI = new MobsetApi::MobsetApiServiceEx(); Copy_MobsetApiService(pMobsetAPI, m_pMobsetHttpEx->m_pMobsetAPI); MobsetApi::_ns1__Template_USCOREAdd * pReq = new MobsetApi::_ns1__Template_USCOREAdd; MobsetApi::_ns1__Template_USCOREAddResponse *pResponse = new MobsetApi::_ns1__Template_USCOREAddResponse; try { pReq->soap = NULL; pReq->LoginName = NULL; pReq->Password = NULL; pReq->TimeStamp = NULL; pResponse->ErrMsg = NULL; pReq->CorpID = _ttol(form.getAsStringW("CorpID", "0", reqCharset)); pReq->LoginName = SOAP_NEW(std::wstring); *pReq->LoginName = form.getAsStringW("LoginName", "", reqCharset); pReq->Password = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 *pReq->Password = form.getAsStringW("SecretKey", "", reqCharset); else *pReq->Password = form.getAsStringW("Passwd", "", reqCharset); pReq->TimeStamp = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_1) { *pReq->TimeStamp = _T("MOBSETHTTP1"); } else { *pReq->TimeStamp = form.getAsStringW("TimeStamp", "", reqCharset); } pReq->TemplateType = _ttol(form.getAsStringW("TemplateType", "0", reqCharset)); pReq->TemplateName = SOAP_NEW(std::wstring); *pReq->TemplateName = form.getAsStringW("TemplateName", "", reqCharset); pReq->TemplateContent = SOAP_NEW(std::wstring); *pReq->TemplateContent = form.getAsStringW("TemplateContent", "", reqCharset); pReq->Remark = SOAP_NEW(std::wstring); *pReq->Remark = form.getAsStringW("Remark", "", reqCharset); pReq->IsTemporary = _ttol(form.getAsStringW("IsTemporary", "0", reqCharset)); pReq->soap = new soap; //memset(pReq->soap, 0, sizeof(soap)); sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr()->sa_data; memcpy(&pReq->soap->ip, ((BYTE*)request.clientAddress().addr()->sa_data) + 2, 4); //4个字节的IP地址 pReq->soap->ip = htonl(pReq->soap->ip); pReq->soap->port = request.clientAddress().port(); pReq->soap->state = this->m_pMobsetHttpEx->m_bSSL; //是否HTTPS pReq->soap->version = (short)httpVer; //首易HTTP协议版本 pMobsetAPI->Template_USCOREAdd(pReq, pResponse); //请求 lRetCode = pResponse->TemplateID; std::ostringstream rspStr; Poco::JSON::Object rspObj(Poco::JSON_PRESERVE_KEY_ORDER); rspObj.set("Code", pResponse->TemplateID); rspObj.set("Message", (std::string)CW2A(pResponse->ErrMsg->c_str())); rspObj.stringify(rspStr, 2); strResponse = CA2W(rspStr.str().c_str()); } catch (...) { } try { if (pReq) { if (pReq->soap) delete pReq->soap; if (pReq->LoginName) delete pReq->LoginName; if (pReq->Password) delete pReq->Password; if (pReq->TimeStamp) delete pReq->TimeStamp; if (pReq->TemplateName) delete pReq->TemplateName; if (pReq->TemplateContent) delete pReq->TemplateContent; if (pReq->Remark) delete pReq->Remark; delete pReq; } if (pResponse) { //if (pResponse->ErrMsg) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->ErrMsg); //if (pResponse->Sign) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->Sign); delete pResponse; } } catch (...) { } delete pMobsetAPI; } } catch (...) { } return strResponse; } CString Http_Template_Modify(HTTPServerRequest& request, HTTPServerResponse& response, MyHttpParamsParser & form, std::string & path, SmsHttpVer httpVer, SmsReqCharset reqCharset, long &lRetCode) { CString strResponse; try { if (m_pMobsetHttpEx && m_pMobsetHttpEx->m_pMobsetAPI) { MobsetApi::MobsetApiServiceEx *pMobsetAPI = new MobsetApi::MobsetApiServiceEx(); Copy_MobsetApiService(pMobsetAPI, m_pMobsetHttpEx->m_pMobsetAPI); MobsetApi::_ns1__Template_USCOREModify * pReq = new MobsetApi::_ns1__Template_USCOREModify; MobsetApi::_ns1__Template_USCOREModifyResponse *pResponse = new MobsetApi::_ns1__Template_USCOREModifyResponse; try { pReq->soap = NULL; pReq->LoginName = NULL; pReq->Password = NULL; pReq->TimeStamp = NULL; pResponse->ErrMsg = NULL; pReq->CorpID = _ttol(form.getAsStringW("CorpID", "0", reqCharset)); pReq->LoginName = SOAP_NEW(std::wstring); *pReq->LoginName = form.getAsStringW("LoginName", "", reqCharset); pReq->Password = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 *pReq->Password = form.getAsStringW("SecretKey", "", reqCharset); else *pReq->Password = form.getAsStringW("Passwd", "", reqCharset); pReq->TimeStamp = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_1) { *pReq->TimeStamp = _T("MOBSETHTTP1"); } else { *pReq->TimeStamp = form.getAsStringW("TimeStamp", "", reqCharset); } pReq->TemplateID = _ttol(form.getAsStringW("TemplateID", "0", reqCharset)); pReq->TemplateType = _ttol(form.getAsStringW("TemplateType", "0", reqCharset)); pReq->TemplateName = SOAP_NEW(std::wstring); *pReq->TemplateName = form.getAsStringW("TemplateName", "", reqCharset); pReq->TemplateContent = SOAP_NEW(std::wstring); *pReq->TemplateContent = form.getAsStringW("TemplateContent", "", reqCharset); pReq->Remark = SOAP_NEW(std::wstring); *pReq->Remark = form.getAsStringW("Remark", "", reqCharset); pReq->IsTemporary = _ttol(form.getAsStringW("IsTemporary", "0", reqCharset)); pReq->soap = new soap; //memset(pReq->soap, 0, sizeof(soap)); sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr()->sa_data; memcpy(&pReq->soap->ip, ((BYTE*)request.clientAddress().addr()->sa_data) + 2, 4); //4个字节的IP地址 pReq->soap->ip = htonl(pReq->soap->ip); pReq->soap->port = request.clientAddress().port(); pReq->soap->state = this->m_pMobsetHttpEx->m_bSSL; //是否HTTPS pReq->soap->version = (short)httpVer; //首易HTTP协议版本 pMobsetAPI->Template_USCOREModify(pReq, pResponse); //请求 lRetCode = pResponse->ErrCode; std::ostringstream rspStr; Poco::JSON::Object rspObj(Poco::JSON_PRESERVE_KEY_ORDER); rspObj.set("Code", pResponse->ErrCode); rspObj.set("Message", (std::string)CW2A(pResponse->ErrMsg->c_str())); rspObj.stringify(rspStr, 2); strResponse = CA2W(rspStr.str().c_str()); } catch (...) { } try { if (pReq) { if (pReq->soap) delete pReq->soap; if (pReq->LoginName) delete pReq->LoginName; if (pReq->Password) delete pReq->Password; if (pReq->TimeStamp) delete pReq->TimeStamp; if (pReq->TemplateName) delete pReq->TemplateName; if (pReq->TemplateContent) delete pReq->TemplateContent; if (pReq->Remark) delete pReq->Remark; delete pReq; } if (pResponse) { //if (pResponse->ErrMsg) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->ErrMsg); //if (pResponse->Sign) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->Sign); delete pResponse; } } catch (...) { } delete pMobsetAPI; } } catch (...) { } return strResponse; } CString Http_Template_Del(HTTPServerRequest& request, HTTPServerResponse& response, MyHttpParamsParser & form, std::string & path, SmsHttpVer httpVer, SmsReqCharset reqCharset, long &lRetCode) { CString strResponse; try { if (m_pMobsetHttpEx && m_pMobsetHttpEx->m_pMobsetAPI) { MobsetApi::MobsetApiServiceEx *pMobsetAPI = new MobsetApi::MobsetApiServiceEx(); Copy_MobsetApiService(pMobsetAPI, m_pMobsetHttpEx->m_pMobsetAPI); MobsetApi::_ns1__Template_USCOREDel * pReq = new MobsetApi::_ns1__Template_USCOREDel; MobsetApi::_ns1__Template_USCOREDelResponse *pResponse = new MobsetApi::_ns1__Template_USCOREDelResponse; try { pReq->soap = NULL; pReq->LoginName = NULL; pReq->Password = NULL; pReq->TimeStamp = NULL; pResponse->ErrMsg = NULL; pReq->CorpID = _ttol(form.getAsStringW("CorpID", "0", reqCharset)); pReq->LoginName = SOAP_NEW(std::wstring); *pReq->LoginName = form.getAsStringW("LoginName", "", reqCharset); pReq->Password = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 *pReq->Password = form.getAsStringW("SecretKey", "", reqCharset); else *pReq->Password = form.getAsStringW("Passwd", "", reqCharset); pReq->TimeStamp = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_1) { *pReq->TimeStamp = _T("MOBSETHTTP1"); } else { *pReq->TimeStamp = form.getAsStringW("TimeStamp", "", reqCharset); } pReq->TemplateID = _ttol(form.getAsStringW("TemplateID", "0", reqCharset)); pReq->soap = new soap; //memset(pReq->soap, 0, sizeof(soap)); sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr()->sa_data; memcpy(&pReq->soap->ip, ((BYTE*)request.clientAddress().addr()->sa_data) + 2, 4); //4个字节的IP地址 pReq->soap->ip = htonl(pReq->soap->ip); pReq->soap->port = request.clientAddress().port(); pReq->soap->state = this->m_pMobsetHttpEx->m_bSSL; //是否HTTPS pReq->soap->version = (short)httpVer; //首易HTTP协议版本 pMobsetAPI->Template_USCOREDel(pReq, pResponse); //请求 lRetCode = pResponse->ErrCode; std::ostringstream rspStr; Poco::JSON::Object rspObj(Poco::JSON_PRESERVE_KEY_ORDER); rspObj.set("Code", pResponse->ErrCode); rspObj.set("Message", (std::string)CW2A(pResponse->ErrMsg->c_str())); rspObj.stringify(rspStr, 2); strResponse = CA2W(rspStr.str().c_str()); } catch (...) { } try { if (pReq) { if (pReq->soap) delete pReq->soap; if (pReq->LoginName) delete pReq->LoginName; if (pReq->Password) delete pReq->Password; if (pReq->TimeStamp) delete pReq->TimeStamp; delete pReq; } if (pResponse) { //if (pResponse->ErrMsg) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->ErrMsg); //if (pResponse->Sign) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->Sign); delete pResponse; } } catch (...) { } delete pMobsetAPI; } } catch (...) { } return strResponse; } CString Http_Template_Query(HTTPServerRequest& request, HTTPServerResponse& response, MyHttpParamsParser & form, std::string & path, SmsHttpVer httpVer, SmsReqCharset reqCharset, long &lRetCode) { CString strResponse; try { if (m_pMobsetHttpEx && m_pMobsetHttpEx->m_pMobsetAPI) { MobsetApi::MobsetApiServiceEx *pMobsetAPI = new MobsetApi::MobsetApiServiceEx(); Copy_MobsetApiService(pMobsetAPI, m_pMobsetHttpEx->m_pMobsetAPI); MobsetApi::_ns1__Template_USCOREQuery * pReq = new MobsetApi::_ns1__Template_USCOREQuery; MobsetApi::_ns1__Template_USCOREQueryResponse *pResponse = new MobsetApi::_ns1__Template_USCOREQueryResponse; try { pReq->soap = NULL; pReq->LoginName = NULL; pReq->Password = NULL; pReq->TimeStamp = NULL; pResponse->ErrMsg = NULL; pReq->CorpID = _ttol(form.getAsStringW("CorpID", "0", reqCharset)); pReq->LoginName = SOAP_NEW(std::wstring); *pReq->LoginName = form.getAsStringW("LoginName", "", reqCharset); pReq->Password = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 *pReq->Password = form.getAsStringW("SecretKey", "", reqCharset); else *pReq->Password = form.getAsStringW("Passwd", "", reqCharset); pReq->TimeStamp = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_1) { *pReq->TimeStamp = _T("MOBSETHTTP1"); } else { *pReq->TimeStamp = form.getAsStringW("TimeStamp", "", reqCharset); } pReq->TemplateID = _ttol(form.getAsStringW("TemplateID", "0", reqCharset)); pReq->soap = new soap; //memset(pReq->soap, 0, sizeof(soap)); sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr()->sa_data; memcpy(&pReq->soap->ip, ((BYTE*)request.clientAddress().addr()->sa_data) + 2, 4); //4个字节的IP地址 pReq->soap->ip = htonl(pReq->soap->ip); pReq->soap->port = request.clientAddress().port(); pReq->soap->state = this->m_pMobsetHttpEx->m_bSSL; //是否HTTPS pReq->soap->version = (short)httpVer; //首易HTTP协议版本 pMobsetAPI->Template_USCOREQuery(pReq, pResponse); //请求 lRetCode = pResponse->Count; std::ostringstream rspStr; Poco::JSON::Object rspObj(Poco::JSON_PRESERVE_KEY_ORDER); rspObj.set("Code", pResponse->Count); rspObj.set("Message", (std::string)CW2A(pResponse->ErrMsg->c_str())); if (pResponse->Count > 0 && pResponse->TemplateGroup) { Poco::JSON::Object rspTemplate(Poco::JSON_PRESERVE_KEY_ORDER); rspTemplate.set("TemplateID", pResponse->TemplateGroup->TemplateID); rspTemplate.set("Status", pResponse->TemplateGroup->Status); rspTemplate.set("TemplateType", pResponse->TemplateGroup->TemplateType); rspTemplate.set("TemplateName", (std::string)CW2A(pResponse->TemplateGroup->TemplateName->c_str())); rspTemplate.set("TemplateContent", (std::string)CW2A(pResponse->TemplateGroup->TemplateContent->c_str())); rspTemplate.set("Remark", (std::string)CW2A(pResponse->TemplateGroup->Remark->c_str())); rspTemplate.set("AuditOpinion", (std::string)CW2A(pResponse->TemplateGroup->AuditOpinion->c_str())); rspTemplate.set("IsTemporary", pResponse->TemplateGroup->IsTemporary); rspTemplate.set("CreateTime", (std::string)CW2A(pResponse->TemplateGroup->CreateTime->c_str())); rspObj.set("Template", rspTemplate); } rspObj.stringify(rspStr, 2); strResponse = CA2W(rspStr.str().c_str()); } catch (...) { } try { if (pReq) { if (pReq->soap) delete pReq->soap; if (pReq->LoginName) delete pReq->LoginName; if (pReq->Password) delete pReq->Password; if (pReq->TimeStamp) delete pReq->TimeStamp; delete pReq; } if (pResponse) { //if (pResponse->ErrMsg) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->ErrMsg); //if (pResponse->Sign) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->Sign); delete pResponse; } } catch (...) { } delete pMobsetAPI; } } catch (...) { } return strResponse; } CString Http_Template_List(HTTPServerRequest& request, HTTPServerResponse& response, MyHttpParamsParser & form, std::string & path, SmsHttpVer httpVer, SmsReqCharset reqCharset, long &lRetCode) { CString strResponse; try { if (m_pMobsetHttpEx && m_pMobsetHttpEx->m_pMobsetAPI) { MobsetApi::MobsetApiServiceEx *pMobsetAPI = new MobsetApi::MobsetApiServiceEx(); Copy_MobsetApiService(pMobsetAPI, m_pMobsetHttpEx->m_pMobsetAPI); MobsetApi::_ns1__Template_USCOREList * pReq = new MobsetApi::_ns1__Template_USCOREList; MobsetApi::_ns1__Template_USCOREListResponse *pResponse = new MobsetApi::_ns1__Template_USCOREListResponse; try { pReq->soap = NULL; pReq->LoginName = NULL; pReq->Password = NULL; pReq->TimeStamp = NULL; pResponse->ErrMsg = NULL; pReq->CorpID = _ttol(form.getAsStringW("CorpID", "0", reqCharset)); pReq->LoginName = SOAP_NEW(std::wstring); *pReq->LoginName = form.getAsStringW("LoginName", "", reqCharset); pReq->Password = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 *pReq->Password = form.getAsStringW("SecretKey", "", reqCharset); else *pReq->Password = form.getAsStringW("Passwd", "", reqCharset); pReq->TimeStamp = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_1) { *pReq->TimeStamp = _T("MOBSETHTTP1"); } else { *pReq->TimeStamp = form.getAsStringW("TimeStamp", "", reqCharset); } pReq->soap = new soap; //memset(pReq->soap, 0, sizeof(soap)); sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr()->sa_data; memcpy(&pReq->soap->ip, ((BYTE*)request.clientAddress().addr()->sa_data) + 2, 4); //4个字节的IP地址 pReq->soap->ip = htonl(pReq->soap->ip); pReq->soap->port = request.clientAddress().port(); pReq->soap->state = this->m_pMobsetHttpEx->m_bSSL; //是否HTTPS pReq->soap->version = (short)httpVer; //首易HTTP协议版本 pMobsetAPI->Template_USCOREList(pReq, pResponse); //请求 lRetCode = pResponse->Count; std::ostringstream rspStr; Poco::JSON::Object rspObj(Poco::JSON_PRESERVE_KEY_ORDER); rspObj.set("Code", pResponse->Count); rspObj.set("Message", (std::string)CW2A(pResponse->ErrMsg->c_str())); if (pResponse->Count > 0 && pResponse->TemplateList) { Poco::JSON::Array rspTemplateList; for (int i=0; i< pResponse->TemplateList->__sizeTemplateGroup;i++) { if (pResponse->TemplateList->TemplateGroup[i]) { Poco::JSON::Object rspTemplate(Poco::JSON_PRESERVE_KEY_ORDER); rspTemplate.set("TemplateID", pResponse->TemplateList->TemplateGroup[i]->TemplateID); rspTemplate.set("Status", pResponse->TemplateList->TemplateGroup[i]->Status); rspTemplate.set("TemplateType", pResponse->TemplateList->TemplateGroup[i]->TemplateType); rspTemplate.set("TemplateName", (std::string)CW2A(pResponse->TemplateList->TemplateGroup[i]->TemplateName->c_str())); rspTemplate.set("TemplateContent", (std::string)CW2A(pResponse->TemplateList->TemplateGroup[i]->TemplateContent->c_str())); rspTemplate.set("Remark", (std::string)CW2A(pResponse->TemplateList->TemplateGroup[i]->Remark->c_str())); rspTemplate.set("AuditOpinion", (std::string)CW2A(pResponse->TemplateList->TemplateGroup[i]->AuditOpinion->c_str())); rspTemplate.set("IsTemporary", pResponse->TemplateList->TemplateGroup[i]->IsTemporary); rspTemplate.set("CreateTime", (std::string)CW2A(pResponse->TemplateList->TemplateGroup[i]->CreateTime->c_str())); rspTemplateList.add(rspTemplate); } } if (rspTemplateList.size() > 0) rspObj.set("TemplateList", rspTemplateList); } rspObj.stringify(rspStr, 2); strResponse = CA2W(rspStr.str().c_str()); } catch (...) { } try { if (pReq) { if (pReq->soap) delete pReq->soap; if (pReq->LoginName) delete pReq->LoginName; if (pReq->Password) delete pReq->Password; if (pReq->TimeStamp) delete pReq->TimeStamp; delete pReq; } if (pResponse) { //if (pResponse->ErrMsg) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->ErrMsg); //if (pResponse->Sign) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->Sign); delete pResponse; } } catch (...) { } delete pMobsetAPI; } } catch (...) { } return strResponse; } CString Http_Template_SendSms(HTTPServerRequest& request, HTTPServerResponse& response, MyHttpParamsParser & form, std::string & path, SmsHttpVer httpVer, SmsReqCharset reqCharset, long &lRetCode) { CString strResponse; try { long lMobileCount = 0; long lParamCount = 0; if (m_pMobsetHttpEx && m_pMobsetHttpEx->m_pMobsetAPI) { MobsetApi::MobsetApiServiceEx *pMobsetAPI = new MobsetApi::MobsetApiServiceEx(); Copy_MobsetApiService(pMobsetAPI, m_pMobsetHttpEx->m_pMobsetAPI); MobsetApi::_ns1__Template_USCORESendSms * pReq = new MobsetApi::_ns1__Template_USCORESendSms; MobsetApi::_ns1__Template_USCORESendSmsResponse *pResponse = new MobsetApi::_ns1__Template_USCORESendSmsResponse; try { pReq->soap = NULL; pReq->LoginName = NULL; pReq->Password = NULL; pReq->TimeStamp = NULL; pResponse->ErrMsg = NULL; pReq->CorpID = _ttol(form.getAsStringW("CorpID", "0", reqCharset)); pReq->LoginName = SOAP_NEW(std::wstring); *pReq->LoginName = form.getAsStringW("LoginName", "", reqCharset); pReq->Password = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 *pReq->Password = form.getAsStringW("SecretKey", "", reqCharset); else *pReq->Password = form.getAsStringW("Passwd", "", reqCharset); pReq->TimeStamp = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_1) { *pReq->TimeStamp = _T("MOBSETHTTP1"); } else { *pReq->TimeStamp = form.getAsStringW("TimeStamp", "", reqCharset); } pReq->TemplateID = _ttol(form.getAsStringW("TemplateID", "0", reqCharset)); CString strMobiles; strMobiles = form.getAsStringW("Mobiles", "", reqCharset); CStringArray Mobiles; strMobiles.Replace(_T(";"), _T(",")); strMobiles.Replace(_T(";"), _T(",")); strMobiles.Replace(_T(","), _T(",")); strMobiles.Replace(_T("."), _T(",")); strMobiles.Replace(_T("。"), _T(",")); strMobiles.Replace(_T(":"), _T(",")); strMobiles.Replace(_T(":"), _T(",")); strMobiles.Replace(_T(" "), _T(",")); strMobiles.Replace(_T(" "), _T(",")); strMobiles.Replace(_T(";"), _T(",")); SplitString(Mobiles, strMobiles, _T(",")); lMobileCount = Mobiles.GetSize(); pReq->MobileList = new MobsetApi::ns1__ArrayOfMobileList; pReq->MobileList->__sizeMobileListGroup = lMobileCount; pReq->MobileList->MobileListGroup = (MobsetApi::ns1__MobileListGroup **)new BYTE[lMobileCount * sizeof(MobsetApi::ns1__MobileListGroup)]; for (int i = 0; i < lMobileCount; i++) { pReq->MobileList->MobileListGroup[i] = new MobsetApi::ns1__MobileListGroup; pReq->MobileList->MobileListGroup[i]->Mobile = SOAP_NEW(std::wstring); *pReq->MobileList->MobileListGroup[i]->Mobile = Mobiles.GetAt(i); } pReq->AddNum = SOAP_NEW(std::wstring); *pReq->AddNum = form.getAsStringW("AddNum", "", reqCharset); pReq->Timer = SOAP_NEW(std::wstring); *pReq->Timer = form.getAsStringW("Timer", "", reqCharset); //取参数,Param1-9 CStringArray Params; for (int i = 0; i < 30; i++) { CString strTemp; CStringA strTempA; strTempA.Format("Param%d", i + 1); strTemp = form.getAsStringW(strTempA.GetBuffer(), "", reqCharset); Params.Add(strTemp); } lParamCount = Params.GetSize(); pReq->ParamList = new MobsetApi::ns1__ArrayOfParamList; pReq->ParamList->__sizeParamListGroup = lParamCount; pReq->ParamList->ParamListGroup = (MobsetApi::ns1__ParamListGroup **)new BYTE[lParamCount * sizeof(MobsetApi::ns1__ParamListGroup)]; for (int i = 0; i < lParamCount; i++) { pReq->ParamList->ParamListGroup[i] = new MobsetApi::ns1__ParamListGroup; pReq->ParamList->ParamListGroup[i]->Param = SOAP_NEW(std::wstring); *pReq->ParamList->ParamListGroup[i]->Param = Params.GetAt(i); } pReq->soap = new soap; //memset(pReq->soap, 0, sizeof(soap)); sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr()->sa_data; memcpy(&pReq->soap->ip, ((BYTE*)request.clientAddress().addr()->sa_data) + 2, 4); //4个字节的IP地址 pReq->soap->ip = htonl(pReq->soap->ip); pReq->soap->port = request.clientAddress().port(); pReq->soap->state = this->m_pMobsetHttpEx->m_bSSL; //是否HTTPS pReq->soap->version = (short)httpVer; //首易HTTP协议版本 pMobsetAPI->Template_USCORESendSms(pReq, pResponse); //请求 lRetCode = pResponse->Count; std::ostringstream rspStr; Poco::JSON::Object rspObj(Poco::JSON_PRESERVE_KEY_ORDER); rspObj.set("Code", pResponse->Count); rspObj.set("Message", (std::string)CW2A(pResponse->ErrMsg->c_str())); Poco::JSON::Array msgID; if (pResponse->SmsIDList) //取回复ID { for (int i = 0; i < pResponse->SmsIDList->__sizeSmsIDGroup; i++) { if (pResponse->SmsIDList->SmsIDGroup && pResponse->SmsIDList->SmsIDGroup[i]) { Poco::JSON::Object rspMsgID(Poco::JSON_PRESERVE_KEY_ORDER); rspMsgID.set("PhoneNumber", (std::string)CW2A(pResponse->SmsIDList->SmsIDGroup[i]->Mobile->c_str())); rspMsgID.set("SmsId", pResponse->SmsIDList->SmsIDGroup[i]->SmsID); msgID.add(rspMsgID); } } if (msgID.size() > 0) rspObj.set("SmsIdList", msgID); } rspObj.stringify(rspStr, 2); strResponse = CA2W(rspStr.str().c_str()); } catch (...) { } try { if (pReq) { if (pReq->soap) delete pReq->soap; if (pReq->LoginName) delete pReq->LoginName; if (pReq->Password) delete pReq->Password; if (pReq->TimeStamp) delete pReq->TimeStamp; if (pReq->AddNum) delete pReq->AddNum; if (pReq->Timer) delete pReq->Timer; if (pReq->MobileList && pReq->MobileList->MobileListGroup) { for (int i = 0; i < lMobileCount; i++) { if (pReq->MobileList->MobileListGroup[i]) { if (pReq->MobileList->MobileListGroup[i]->Mobile) delete pReq->MobileList->MobileListGroup[i]->Mobile; delete pReq->MobileList->MobileListGroup[i]; } } delete pReq->MobileList->MobileListGroup; } if (pReq->MobileList) delete pReq->MobileList; if (pReq->ParamList && pReq->ParamList->ParamListGroup) { for (int i = 0; i < lParamCount; i++) { if (pReq->ParamList->ParamListGroup[i]) { if (pReq->ParamList->ParamListGroup[i]->Param) delete pReq->ParamList->ParamListGroup[i]->Param; delete pReq->ParamList->ParamListGroup[i]; } } delete pReq->ParamList->ParamListGroup; } if (pReq->ParamList) delete pReq->ParamList; delete pReq; } if (pResponse) { //if (pResponse->ErrMsg) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->ErrMsg); //if (pResponse->Sign) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->Sign); delete pResponse; } } catch (...) { } delete pMobsetAPI; } } catch (...) { } return strResponse; } void Copy_MobsetApiService(MobsetApi::MobsetApiServiceEx * pNew, MobsetApi::MobsetApiServiceEx * pSrc) { //pNew->destroy(); //笨办法,因为copy会复制一份soap,原来的soap资源需要先释放 //soap_copy_context(pNew, pSrc); //复制部分参数 pNew->m_pParam = pSrc->m_pParam; _tcscpy(pNew->m_strSQL_IP, pSrc->m_strSQL_IP); _tcscpy(pNew->m_strSQL_User, pSrc->m_strSQL_User); _tcscpy(pNew->m_strSQL_Passwd, pSrc->m_strSQL_Passwd); _tcscpy(pNew->m_strSQL_DB, pSrc->m_strSQL_DB); _tcscpy(pNew->m_strSQL_Provider, pSrc->m_strSQL_Provider); pNew->m_pSQL = pSrc->m_pSQL; pNew->m_lSQLCount = pSrc->m_lSQLCount; pNew->m_Critical = pSrc->m_Critical; pNew->m_pReq = pSrc->m_pReq; pNew->m_lReqCount = pSrc->m_lReqCount; pNew->m_lReqIndex = pSrc->m_lReqIndex; pNew->m_pReqIndex = &pSrc->m_lReqIndex; pNew->m_lReqAllCount = pSrc->m_lReqAllCount; pNew->m_pReqAllCount = &pSrc->m_lReqAllCount; pNew->m_Critical_Req = pSrc->m_Critical_Req; pNew->m_bErrLog = pSrc->m_bErrLog; pNew->m_lMaxIDReq = pSrc->m_lMaxIDReq; pNew->m_lMaxIPReq = pSrc->m_lMaxIPReq; pNew->m_pReqlog = pSrc->m_pReqlog; pNew->m_bHTTP = pSrc->m_bHTTP; pNew->m_loggerError = pSrc->m_loggerError; pNew->m_loggerInfo = pSrc->m_loggerInfo; pNew->m_bCopy = true; //特殊,标识是复制的类 } CString Http_Sms_Send(HTTPServerRequest& request, HTTPServerResponse& response, MyHttpParamsParser & form, std::string & path, SmsHttpVer httpVer, SmsReqCharset reqCharset, long & lRetCode) { CString strResponse; try { long lMobileCount = 0; if (m_pMobsetHttpEx && m_pMobsetHttpEx->m_pMobsetAPI) { MobsetApi::MobsetApiServiceEx *pMobsetAPI = new MobsetApi::MobsetApiServiceEx(); Copy_MobsetApiService(pMobsetAPI, m_pMobsetHttpEx->m_pMobsetAPI); MobsetApi::_ns1__Sms_USCORESend * pReq = new MobsetApi::_ns1__Sms_USCORESend; MobsetApi::_ns1__Sms_USCORESendResponse *pResponse = new MobsetApi::_ns1__Sms_USCORESendResponse; try { pReq->soap = NULL; pReq->LoginName = NULL; pReq->Password = NULL; pReq->TimeStamp = NULL; pReq->MobileList = NULL; pReq->AddNum = NULL; pReq->Timer = NULL; pReq->Content = NULL; pReq->MobileList = NULL; pResponse->ErrMsg = NULL; BOOL bXML = false; long lJson = 0; pReq->CorpID = _ttol(form.getAsStringW("CorpID", "0", reqCharset)); pReq->LoginName = SOAP_NEW(std::wstring); *pReq->LoginName = form.getAsStringW("LoginName", "", reqCharset); pReq->Password = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 *pReq->Password = form.getAsStringW("SecretKey", "", reqCharset); else *pReq->Password = form.getAsStringW("Passwd", "", reqCharset); pReq->TimeStamp = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_1) { *pReq->TimeStamp = _T("MOBSETHTTP1"); } else { *pReq->TimeStamp = form.getAsStringW("TimeStamp", "", reqCharset); } if (httpVer == SMS_HTTP_VER_1 || httpVer == SMS_HTTP_VER_2) { bXML = _ttol(form.getAsStringW("XML", "0", reqCharset)); lJson = _ttol(form.getAsStringW("Json", "0", reqCharset)); if (lJson > 0) bXML = 0; //CStringW strCharset = form.getAsStringW("Charset", "", reqCharset); //if (strCharset.CompareNoCase(_T("UTF-8")) == 0) //{ // reqCharset = SMS_REQCHARSET_UTF8; //} std::string strRetCharset = "GB2312"; if (reqCharset == SMS_REQCHARSET_UTF8) strRetCharset = "utf-8"; std::string strRetType = "text/html"; if (bXML) strRetType = "text/xml"; if (lJson>0) strRetType = "application/json"; if (bXML || lJson>0 || reqCharset != SMS_REQCHARSET_GBK) { MediaType mType(strRetType); mType.setParameter("Charset", strRetCharset); response.setContentType(mType); } } CString strChangeTD; //更改通道 if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 { strChangeTD = form.getAsStringW("ChangeTD", "", reqCharset); } CString strMobiles; if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 strMobiles = form.getAsStringW("PhoneNumbers", "", reqCharset); else strMobiles = form.getAsStringW("send_no", "", reqCharset); CStringArray Mobiles; strMobiles.Replace(_T(";"), _T(",")); strMobiles.Replace(_T(";"), _T(",")); strMobiles.Replace(_T(","), _T(",")); strMobiles.Replace(_T("."), _T(",")); strMobiles.Replace(_T("。"), _T(",")); strMobiles.Replace(_T(":"), _T(",")); strMobiles.Replace(_T(":"), _T(",")); strMobiles.Replace(_T(" "), _T(",")); strMobiles.Replace(_T(" "), _T(",")); strMobiles.Replace(_T(";"), _T(",")); SplitString(Mobiles, strMobiles, _T(",")); /* //拆分号码成数组 strTemp = Poco::replace(strTemp, ";", ","); strTemp = Poco::replace(strTemp, ";", ","); strTemp = Poco::replace(strTemp, ",", ","); strTemp = Poco::replace(strTemp, ".", ","); strTemp = Poco::replace(strTemp, "。", ","); strTemp = Poco::replace(strTemp, ":", ","); strTemp = Poco::replace(strTemp, ":", ","); strTemp = Poco::replace(strTemp, " ", ","); strTemp = Poco::replace(strTemp, " ", ","); StringTokenizer mobiles(strTemp, "," , Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM); lMobileCount = mobiles.count(); */ lMobileCount = Mobiles.GetSize(); pReq->MobileList = new MobsetApi::ns1__ArrayOfMobileList; pReq->MobileList->__sizeMobileListGroup = lMobileCount; //MobsetApi::ns1__MobileListGroup * pMobileGroup = new MobsetApi::ns1__MobileListGroup[lMobileCount]; //pReq->MobileList->MobileListGroup = new MobsetApi::ns1__MobileListGroup*; pReq->MobileList->MobileListGroup = (MobsetApi::ns1__MobileListGroup **)new BYTE[lMobileCount * sizeof(MobsetApi::ns1__MobileListGroup)]; for (int i = 0; i < lMobileCount; i++) { pReq->MobileList->MobileListGroup[i] = new MobsetApi::ns1__MobileListGroup; pReq->MobileList->MobileListGroup[i]->Mobile = SOAP_NEW(std::wstring); *pReq->MobileList->MobileListGroup[i]->Mobile = Mobiles.GetAt(i); } pReq->Content = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 *pReq->Content = form.getAsStringW("Content", "", reqCharset); else *pReq->Content = form.getAsStringW("msg", "", reqCharset); pReq->AddNum = SOAP_NEW(std::wstring); *pReq->AddNum = form.getAsStringW("AddNum", "", reqCharset); pReq->Timer = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 *pReq->Timer = form.getAsStringW("TimerSend", "", reqCharset); else *pReq->Timer = form.getAsStringW("Timer", "", reqCharset); pReq->LongSms = _ttol(form.getAsStringW("LongSms", "1", reqCharset)); long bRetMsg = _ttol(form.getAsStringW("RetMsg", "0", reqCharset)); pReq->soap = new soap; //memset(pReq->soap, 0, sizeof(soap)); sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr()->sa_data; memcpy(&pReq->soap->ip, ((BYTE*)request.clientAddress().addr()->sa_data) + 2, 4); //4个字节的IP地址 pReq->soap->ip = htonl(pReq->soap->ip); pReq->soap->port = request.clientAddress().port(); pReq->soap->state = this->m_pMobsetHttpEx->m_bSSL; //是否HTTPS pReq->soap->version = (short)httpVer; //首易HTTP协议版本 BOOL bChangeTD = false; memset(pReq->soap->tmpbuf, 0, sizeof(pReq->soap->tmpbuf)); if (httpVer == SMS_HTTP_VER_3 && strChangeTD.GetLength()>=7 && strChangeTD.GetLength()<=10 && strChangeTD.GetAt(0)=='T' && strChangeTD.GetAt(1) == 'D' && strChangeTD.GetAt(2) == 'C' ) //HTTP3,参数不同 { strcpy(pReq->soap->tmpbuf, CW2A(strChangeTD)); bChangeTD = true; } //m_pMobsetHttpEx->m_pMobsetAPI->Sms_USCORESend(pReq, pResponse); //请求 pMobsetAPI->Sms_USCORESend(pReq, pResponse); //请求 lRetCode = pResponse->Count; if (httpVer == SMS_HTTP_VER_1 || httpVer == SMS_HTTP_VER_2) { switch (pResponse->Count) //返回值转换 { case -100: case -102: pResponse->Count = -1; break; case -101: case -103: case -104: case -105: pResponse->Count = -2; break; case -112: pResponse->Count = -3; break; case -128: pResponse->Count = -4; break; case -129: case -130: pResponse->Count = -5; break; case -123: case -125: pResponse->Count = -8; break; } CString strID; if (pResponse->SmsIDList) //取回复ID { for (int i = 0; i < pResponse->SmsIDList->__sizeSmsIDGroup; i++) { if (pResponse->SmsIDList->SmsIDGroup && pResponse->SmsIDList->SmsIDGroup[i]) { if (pResponse->SmsIDList->SmsIDGroup[i]->SmsID > 0) { if (strID.GetLength() <= 0) { strID.Format(_T("%d"), pResponse->SmsIDList->SmsIDGroup[i]->SmsID); } else { CString strID2; strID2.Format(_T(",%d"), pResponse->SmsIDList->SmsIDGroup[i]->SmsID); strID = strID + strID2; } } } } } if (pResponse->Count >= 0) strResponse.Format(_T("%d,%s"), pResponse->Count, strID); //生成返回 else strResponse.Format(_T("%d,%s"), pResponse->Count, pResponse->ErrMsg->c_str()); //生成返回 //strResponse.Format(_T("%d"), pResponse->Count); //生成返回 if (bRetMsg) { CString strRet2 = _T("\n"); CString strResponse2; if (pResponse->Count >= 0) strResponse2.Format(strRet2, _T("短信发送成功"), strResponse); else strResponse2.Format(strRet2, _T("短信发送失败"), strResponse); strResponse = strResponse2; } if (bXML) { CString strTmpl = _T("\r\n") _T("\r\n") _T(" %d\r\n") _T(" %s\r\n") _T(" %s\r\n") _T(""); strResponse.Format(strTmpl, pResponse->Count, strID, pResponse->ErrMsg->c_str()); } if (lJson>0) { std::ostringstream rspStr; Poco::JSON::Object rspObj(Poco::JSON_PRESERVE_KEY_ORDER); if (pResponse->Count >= 1) { rspObj.set("Code", 1); if (lJson==2) rspObj.set("Count", pResponse->Count); //发送数量 } else { rspObj.set("Code", pResponse->Count); } if (lJson == 2) { rspObj.set("Message", (std::string)CW2A(pResponse->ErrMsg->c_str())); Poco::JSON::Array msgID; if (pResponse->SmsIDList) //取回复ID { for (int i = 0; i < pResponse->SmsIDList->__sizeSmsIDGroup; i++) { if (pResponse->SmsIDList->SmsIDGroup && pResponse->SmsIDList->SmsIDGroup[i]) { Poco::JSON::Object rspMsgID(Poco::JSON_PRESERVE_KEY_ORDER); //CStringA strMobileA = CW2A(pResponse->SmsIDList->SmsIDGroup[i]->Mobile->c_str()); if (bChangeTD) //如果是转换通道,增加多一个源号码返回 { CString strSrcMobile = pResponse->SmsIDList->SmsIDGroup[i]->Mobile->c_str(); CStringArray strMobiles; SplitString(strMobiles, strSrcMobile, _T(",")); if (strMobiles.GetSize() > 1) { strSrcMobile = strMobiles.GetAt(1); rspMsgID.set("SrcNumber", (std::string)CW2A(strSrcMobile)); strSrcMobile = strMobiles.GetAt(0); } rspMsgID.set("PhoneNumber", (std::string)CW2A(strSrcMobile)); } else { rspMsgID.set("PhoneNumber", (std::string)CW2A(pResponse->SmsIDList->SmsIDGroup[i]->Mobile->c_str())); } rspMsgID.set("SmsId", pResponse->SmsIDList->SmsIDGroup[i]->SmsID); msgID.add(rspMsgID); } } if (msgID.size() > 0) rspObj.set("SmsIdList", msgID); } } rspObj.stringify(rspStr, 2); strResponse = CA2W(rspStr.str().c_str()); } } if (httpVer == SMS_HTTP_VER_3) { std::ostringstream rspStr; Poco::JSON::Object rspObj(Poco::JSON_PRESERVE_KEY_ORDER); rspObj.set("Code", pResponse->Count); rspObj.set("Message", (std::string)CW2A(pResponse->ErrMsg->c_str())); Poco::JSON::Array msgID; if (pResponse->SmsIDList) //取回复ID { for (int i = 0; i < pResponse->SmsIDList->__sizeSmsIDGroup; i++) { if (pResponse->SmsIDList->SmsIDGroup && pResponse->SmsIDList->SmsIDGroup[i]) { Poco::JSON::Object rspMsgID(Poco::JSON_PRESERVE_KEY_ORDER); //CStringA strMobileA = CW2A(pResponse->SmsIDList->SmsIDGroup[i]->Mobile->c_str()); if (bChangeTD) //如果是转换通道,增加多一个源号码返回 { CString strSrcMobile = pResponse->SmsIDList->SmsIDGroup[i]->Mobile->c_str(); CStringArray strMobiles; SplitString(strMobiles, strSrcMobile, _T(",")); if (strMobiles.GetSize() > 1) { strSrcMobile = strMobiles.GetAt(1); rspMsgID.set("SrcNumber", (std::string)CW2A(strSrcMobile)); strSrcMobile = strMobiles.GetAt(0); } rspMsgID.set("PhoneNumber", (std::string)CW2A(strSrcMobile)); } else { rspMsgID.set("PhoneNumber", (std::string)CW2A(pResponse->SmsIDList->SmsIDGroup[i]->Mobile->c_str())); } rspMsgID.set("SmsId", pResponse->SmsIDList->SmsIDGroup[i]->SmsID); msgID.add(rspMsgID); } } if (msgID.size()>0) rspObj.set("SmsIdList", msgID); } rspObj.stringify(rspStr, 2); strResponse = CA2W(rspStr.str().c_str()); } } catch (...) { } try { if (pReq) { if (pReq->soap) delete pReq->soap; if (pReq->LoginName) delete pReq->LoginName; if (pReq->Password) delete pReq->Password; if (pReq->TimeStamp) delete pReq->TimeStamp; if (pReq->Content) delete pReq->Content; if (pReq->AddNum) delete pReq->AddNum; if (pReq->Timer) delete pReq->Timer; if (pReq->MobileList && pReq->MobileList->MobileListGroup) { for (int i = 0; i < lMobileCount; i++) { if (pReq->MobileList->MobileListGroup[i]) { if (pReq->MobileList->MobileListGroup[i]->Mobile) delete pReq->MobileList->MobileListGroup[i]->Mobile; delete pReq->MobileList->MobileListGroup[i]; } } delete pReq->MobileList->MobileListGroup; } if (pReq->MobileList) delete pReq->MobileList; delete pReq; } if (pResponse) { /* if (pResponse->ErrMsg) soap_delete_std__wstring(pMobsetAPI, pResponse->ErrMsg); if (pResponse->SmsIDList && pResponse->SmsIDList->SmsIDGroup) { for (int i = 0; i < pResponse->SmsIDList->__sizeSmsIDGroup; i++) { if (pResponse->SmsIDList->SmsIDGroup[i]) { if (pResponse->SmsIDList->SmsIDGroup[i]->Mobile) soap_delete_std__wstring(pMobsetAPI, pResponse->SmsIDList->SmsIDGroup[i]->Mobile); soap_delete_ns1__SmsIDGroup(pMobsetAPI, pResponse->SmsIDList->SmsIDGroup[i]); } } soap_delete(pMobsetAPI, pResponse->SmsIDList->SmsIDGroup); } if (pResponse->SmsIDList) soap_delete_ns1__ArrayOfSmsIDList(pMobsetAPI, pResponse->SmsIDList); */ delete pResponse; } } catch (...) { } delete pMobsetAPI; } } catch (...) { } return strResponse; } CString Http_Sms_Recv(HTTPServerRequest& request, HTTPServerResponse& response, MyHttpParamsParser & form, std::string & path, SmsHttpVer httpVer, SmsReqCharset reqCharset, long & lRetCode) { CString strResponse; try { if (m_pMobsetHttpEx && m_pMobsetHttpEx->m_pMobsetAPI) { MobsetApi::MobsetApiServiceEx *pMobsetAPI = new MobsetApi::MobsetApiServiceEx(); Copy_MobsetApiService(pMobsetAPI, m_pMobsetHttpEx->m_pMobsetAPI); MobsetApi::_ns1__Sms_USCOREGetRecv * pReq = new MobsetApi::_ns1__Sms_USCOREGetRecv; MobsetApi::_ns1__Sms_USCOREGetRecvResponse *pResponse = new MobsetApi::_ns1__Sms_USCOREGetRecvResponse; try { pReq->soap = NULL; pReq->LoginName = NULL; pReq->Password = NULL; pReq->TimeStamp = NULL; pResponse->ErrMsg = NULL; BOOL bXML = false; long lMaxReturn = 10; pReq->CorpID = _ttol(form.getAsStringW("CorpID", "0", reqCharset)); pReq->LoginName = SOAP_NEW(std::wstring); *pReq->LoginName = form.getAsStringW("LoginName", "", reqCharset); pReq->Password = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 *pReq->Password = form.getAsStringW("SecretKey", "", reqCharset); else *pReq->Password = form.getAsStringW("Passwd", "", reqCharset); pReq->TimeStamp = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_1) { *pReq->TimeStamp = _T("MOBSETHTTP1"); } else { *pReq->TimeStamp = form.getAsStringW("TimeStamp", "", reqCharset); } if (httpVer == SMS_HTTP_VER_1 || httpVer == SMS_HTTP_VER_2) { bXML = _ttol(form.getAsStringW("XML", "0", reqCharset)); if (bXML) //返回为XML { MediaType mType("text/xml"); mType.setParameter("Charset", "GB2312"); response.setContentType(mType); } } lMaxReturn = _ttol(form.getAsStringW("MaxReturn", "10", reqCharset)); if (lMaxReturn > 1000000 || lMaxReturn <= 0) lMaxReturn = 10; pReq->soap = new soap; sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr()->sa_data; memcpy(&pReq->soap->ip, ((BYTE*)request.clientAddress().addr()->sa_data) + 2, 4); //4个字节的IP地址 pReq->soap->ip = htonl(pReq->soap->ip); pReq->soap->port = request.clientAddress().port(); pReq->soap->state = this->m_pMobsetHttpEx->m_bSSL; //是否HTTPS pReq->soap->version = (short)httpVer; //首易HTTP协议版本 pReq->soap->count = lMaxReturn; //特殊传输返回记录数参数 pMobsetAPI->Sms_USCOREGetRecv(pReq, pResponse); //请求 lRetCode = pResponse->Count; if (httpVer == SMS_HTTP_VER_1 || httpVer == SMS_HTTP_VER_2) { switch (pResponse->Count) //返回值转换 { case -100: case -102: pResponse->Count = -1; break; case -101: case -103: case -104: case -105: pResponse->Count = -2; break; } if (pResponse->Count >= 0) { if (bXML) { CString strTmpl = _T("\r\n") _T("\r\n") _T(" OK\r\n%s") _T(""); CString strTmpl2 = _T(" \r\n") _T(" %s\r\n") _T(" %s\r\n") _T(" %s\r\n") _T(" %s\r\n") _T(" %s\r\n") _T(" \r\n"); CString strSubXML; for (int i = 0; pResponse->SmsRecvList && i < pResponse->SmsRecvList->__sizeSmsRecvGroup; i++) { CString strMsg = pResponse->SmsRecvList->SmsRecvGroup[i]->Content->c_str(); strMsg.Replace(_T("<"), _T("<")); strMsg.Replace(_T(">"), _T(">")); strMsg.Replace(_T("&"), _T("&")); strMsg.Replace(_T("'"), _T("'")); strMsg.Replace(_T("\""), _T(""")); CString strTime = pResponse->SmsRecvList->SmsRecvGroup[i]->RecvTime->c_str(); //strTime.Replace(_T("-"), _T("/")); CString strSubXML2; strSubXML2.Format(strTmpl2, pResponse->SmsRecvList->SmsRecvGroup[i]->Mobile->c_str(), pResponse->SmsRecvList->SmsRecvGroup[i]->RecvNum->c_str(), strTime, strMsg, pResponse->SmsRecvList->SmsRecvGroup[i]->AddNum->c_str()); strSubXML += strSubXML2; } strResponse.Format(strTmpl, strSubXML); //生成返回 } else { long lCount = 0; CString strSubMsg; for (int i = 0; pResponse->SmsRecvList && i < pResponse->SmsRecvList->__sizeSmsRecvGroup; i++) { CString strMsg = pResponse->SmsRecvList->SmsRecvGroup[i]->Content->c_str(); strMsg.Replace(_T("\r"), _T(" ")); strMsg.Replace(_T("\n"), _T(" "));; strMsg.Replace(_T(","), _T(",")); CString strTime = pResponse->SmsRecvList->SmsRecvGroup[i]->RecvTime->c_str(); strTime.Replace(_T("-"), _T("/")); CString strTemp2; strTemp2.Format(_T("%s,%s,%s,%s\r\n\r\n"), pResponse->SmsRecvList->SmsRecvGroup[i]->Mobile->c_str(), pResponse->SmsRecvList->SmsRecvGroup[i]->RecvNum->c_str(), strTime, strMsg); strResponse += strTemp2; strSubMsg += strTemp2; lCount++; } strResponse.Format(_T("%d\r\n%s"), lCount, strSubMsg); //生成返回 } } else { if (bXML) { CString strTmpl; strTmpl = _T("\r\n") _T("\r\n") _T(" %s\r\n") _T(""); strResponse.Format(strTmpl, pResponse->ErrMsg->c_str()); //生成返回 } else { strResponse.Format(_T("%d,%s"), pResponse->Count, pResponse->ErrMsg->c_str()); //生成返回 } } } if (httpVer == SMS_HTTP_VER_3) { std::ostringstream rspStr; Poco::JSON::Object rspObj(Poco::JSON_PRESERVE_KEY_ORDER); rspObj.set("Code", pResponse->Count); rspObj.set("Message", (std::string)CW2A(pResponse->ErrMsg->c_str())); Poco::JSON::Array msgRecv; if (pResponse->SmsRecvList) //取回复ID { for (int i = 0; i < pResponse->SmsRecvList->__sizeSmsRecvGroup; i++) { if (pResponse->SmsRecvList->SmsRecvGroup && pResponse->SmsRecvList->SmsRecvGroup[i]) { Poco::JSON::Object rspMsgRecv(Poco::JSON_PRESERVE_KEY_ORDER); //CStringA strMobileA = CW2A(pResponse->SmsIDList->SmsIDGroup[i]->Mobile->c_str()); rspMsgRecv.set("PhoneNumber", (std::string)CW2A(pResponse->SmsRecvList->SmsRecvGroup[i]->Mobile->c_str())); rspMsgRecv.set("RecvNumber", (std::string)CW2A(pResponse->SmsRecvList->SmsRecvGroup[i]->RecvNum->c_str())); rspMsgRecv.set("AddNum", (std::string)CW2A(pResponse->SmsRecvList->SmsRecvGroup[i]->AddNum->c_str())); rspMsgRecv.set("RecvTime", (std::string)CW2A(pResponse->SmsRecvList->SmsRecvGroup[i]->RecvTime->c_str())); rspMsgRecv.set("Content", (std::string)CW2A(pResponse->SmsRecvList->SmsRecvGroup[i]->Content->c_str())); //rspMsgRecv.set("Content", "陆江"); msgRecv.add(rspMsgRecv); } } if (msgRecv.size() > 0) { rspObj.set("Details", msgRecv); } } rspObj.stringify(rspStr, 2); strResponse = CA2W(rspStr.str().c_str()); } /* if (pResponse->Count >= 0) { if (bXML) { CString strTemp3, strTemp4, strTemp5; strTemp2 = _T("\r\n") _T("\r\n") _T(" OK\r\n%s\r\n") _T(""); strTemp3 = _T(" \r\n") _T(" %s\r\n") _T(" %s\r\n") _T(" %s\r\n") _T(" %s\r\n") _T(" %s\r\n") _T(" \r\n"); for (int i = 0; i < pResponse->SmsRecvList->__sizeSmsRecvGroup; i++) { CString strMsg = pResponse->SmsRecvList->SmsRecvGroup[i]->Content->c_str(); strMsg.Replace(_T("<"), _T("<")); strMsg.Replace(_T(">"), _T(">")); strMsg.Replace(_T("&"), _T("&")); strMsg.Replace(_T("'"), _T("'")); strMsg.Replace(_T("\""), _T(""")); CString strTime = pResponse->SmsRecvList->SmsRecvGroup[i]->RecvTime->c_str(); strTemp4.Format(strTemp3, pResponse->SmsRecvList->SmsRecvGroup[i]->Mobile, pResponse->SmsRecvList->SmsRecvGroup[i]->RecvNum, strTime, strMsg ); strTemp5 += strTemp4; } strResponse.Format(strTemp2, strTemp5); } else { CString strTemp2; strResponse.Format(_T("%d\r\n"), pResponse->Count); //生成返回 for (int i = 0; i < pResponse->SmsRecvList->__sizeSmsRecvGroup; i++) { CString strMsg = pResponse->SmsRecvList->SmsRecvGroup[i]->Content->c_str(); strMsg.Replace(_T("\r"), _T(" ")); strMsg.Replace(_T("\n"), _T(" "));; strMsg.Replace(_T(","), _T(",")); CString strTime = pResponse->SmsRecvList->SmsRecvGroup[i]->RecvTime->c_str(); strTemp2.Format(_T("%s,%s,%s,%s\r\n\r\n"), pResponse->SmsRecvList->SmsRecvGroup[i]->Mobile, pResponse->SmsRecvList->SmsRecvGroup[i]->RecvNum, strTime, strMsg); strResponse += strTemp2; } } } else { CString strTemp2; if (bXML) { strTemp2 = _T("\r\n") _T("\r\n") _T(" %s\r\n") _T(""); strResponse.Format(strTemp2, pResponse->ErrMsg->c_str()); //生成返回 } else { strResponse.Format(_T("%d,%s"), pResponse->Count, pResponse->ErrMsg->c_str()); //生成返回 } } */ } catch (...) { } try { if (pReq) { if (pReq->soap) delete pReq->soap; if (pReq->LoginName) delete pReq->LoginName; if (pReq->Password) delete pReq->Password; if (pReq->TimeStamp) delete pReq->TimeStamp; delete pReq; } if (pResponse) { /* if (pResponse->ErrMsg) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->ErrMsg); if (pResponse->SmsRecvList && pResponse->SmsRecvList->SmsRecvGroup) { for (int i = 0; i < pResponse->SmsRecvList->__sizeSmsRecvGroup; i++) { if (pResponse->SmsRecvList->SmsRecvGroup[i]) { if (pResponse->SmsRecvList->SmsRecvGroup[i]->Mobile) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->SmsRecvList->SmsRecvGroup[i]->Mobile); if (pResponse->SmsRecvList->SmsRecvGroup[i]->RecvNum) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->SmsRecvList->SmsRecvGroup[i]->RecvNum); if (pResponse->SmsRecvList->SmsRecvGroup[i]->AddNum) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->SmsRecvList->SmsRecvGroup[i]->AddNum); if (pResponse->SmsRecvList->SmsRecvGroup[i]->Content) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->SmsRecvList->SmsRecvGroup[i]->Content); if (pResponse->SmsRecvList->SmsRecvGroup[i]->RecvTime) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->SmsRecvList->SmsRecvGroup[i]->RecvTime); soap_delete_ns1__SmsRecvGroup(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->SmsRecvList->SmsRecvGroup[i]); } } soap_delete(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->SmsRecvList->SmsRecvGroup); } if (pResponse->SmsRecvList) soap_delete_ns1__ArrayOfSmsRecvList(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->SmsRecvList); */ delete pResponse; } } catch (...) { } delete pMobsetAPI; } } catch (...) { } return strResponse; } CString Http_Sms_Report(HTTPServerRequest& request, HTTPServerResponse& response, MyHttpParamsParser & form, std::string & path, SmsHttpVer httpVer, SmsReqCharset reqCharset, long & lRetCode) { CString strResponse; try { if (m_pMobsetHttpEx && m_pMobsetHttpEx->m_pMobsetAPI) { MobsetApi::_ns1__Sms_USCOREGetReport * pReq = new MobsetApi::_ns1__Sms_USCOREGetReport; MobsetApi::_ns1__Sms_USCOREGetReportResponse *pResponse = new MobsetApi::_ns1__Sms_USCOREGetReportResponse; try { pReq->soap = NULL; pReq->LoginName = NULL; pReq->Password = NULL; pReq->TimeStamp = NULL; pResponse->ErrMsg = NULL; long lMaxReturn = 50; pReq->CorpID = _ttol(form.getAsStringW("CorpID", "0", reqCharset)); pReq->LoginName = SOAP_NEW(std::wstring); *pReq->LoginName = form.getAsStringW("LoginName", "", reqCharset); pReq->Password = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_3) //HTTP3,参数不同 *pReq->Password = form.getAsStringW("SecretKey", "", reqCharset); else *pReq->Password = form.getAsStringW("Passwd", "", reqCharset); pReq->TimeStamp = SOAP_NEW(std::wstring); if (httpVer == SMS_HTTP_VER_1) { *pReq->TimeStamp = _T("MOBSETHTTP1"); } else { *pReq->TimeStamp = form.getAsStringW("TimeStamp", "", reqCharset); } lMaxReturn = _ttol(form.getAsStringW("MaxReturn", "50", reqCharset)); if (lMaxReturn > 1000000 || lMaxReturn <= 0) lMaxReturn = 50; pReq->soap = new soap; sockaddr_in* pSin = (sockaddr_in*)request.clientAddress().addr()->sa_data; memcpy(&pReq->soap->ip, ((BYTE*)request.clientAddress().addr()->sa_data) + 2, 4); //4个字节的IP地址 pReq->soap->ip = htonl(pReq->soap->ip); pReq->soap->port = request.clientAddress().port(); pReq->soap->state = this->m_pMobsetHttpEx->m_bSSL; //是否HTTPS pReq->soap->version = (short)httpVer; //首易HTTP协议版本 pReq->soap->count = lMaxReturn; //特殊传输返回记录数参数 MobsetApi::MobsetApiServiceEx *pMobsetAPI = new MobsetApi::MobsetApiServiceEx(); Copy_MobsetApiService(pMobsetAPI, m_pMobsetHttpEx->m_pMobsetAPI); pMobsetAPI->Sms_USCOREGetReport(pReq, pResponse); //请求 lRetCode = pResponse->Count; if (httpVer == SMS_HTTP_VER_3) { std::ostringstream rspStr; Poco::JSON::Object rspObj(Poco::JSON_PRESERVE_KEY_ORDER); rspObj.set("Code", pResponse->Count); rspObj.set("Message", (std::string)CW2A(pResponse->ErrMsg->c_str())); Poco::JSON::Array msgReport; if (pResponse->SmsReportList) //取回复ID { for (int i = 0; i < pResponse->SmsReportList->__sizeSmsReportGroup; i++) { if (pResponse->SmsReportList->SmsReportGroup && pResponse->SmsReportList->SmsReportGroup[i]) { Poco::JSON::Object rspMsgReport(Poco::JSON_PRESERVE_KEY_ORDER); //CStringA strMobileA = CW2A(pResponse->SmsIDList->SmsIDGroup[i]->Mobile->c_str()); rspMsgReport.set("SmsId", pResponse->SmsReportList->SmsReportGroup[i]->SmsID ); rspMsgReport.set("Status", pResponse->SmsReportList->SmsReportGroup[i]->Status); rspMsgReport.set("ReportTime", (std::string)CW2A(pResponse->SmsReportList->SmsReportGroup[i]->ReportTime->c_str())); rspMsgReport.set("ExStatus", (std::string)CW2A(pResponse->SmsReportList->SmsReportGroup[i]->ExStatus->c_str())); msgReport.add(rspMsgReport); } } if (msgReport.size()>0) rspObj.set("Details", msgReport); } rspObj.stringify(rspStr, 2); strResponse = CA2W(rspStr.str().c_str()); } delete pMobsetAPI; } catch (...) { } try { if (pReq) { if (pReq->soap) delete pReq->soap; if (pReq->LoginName) delete pReq->LoginName; if (pReq->Password) delete pReq->Password; if (pReq->TimeStamp) delete pReq->TimeStamp; delete pReq; } if (pResponse) { /* if (pResponse->ErrMsg) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->ErrMsg); if (pResponse->SmsReportList && pResponse->SmsReportList->SmsReportGroup) { for (int i = 0; i < pResponse->SmsReportList->__sizeSmsReportGroup; i++) { if (pResponse->SmsReportList->SmsReportGroup[i]) { if (pResponse->SmsReportList->SmsReportGroup[i]->ReportTime) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->SmsReportList->SmsReportGroup[i]->ReportTime); if (pResponse->SmsReportList->SmsReportGroup[i]->ExStatus) soap_delete_std__wstring(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->SmsReportList->SmsReportGroup[i]->ExStatus); soap_delete(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->SmsReportList->SmsReportGroup[i]); } } soap_delete(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->SmsReportList->SmsReportGroup); } if (pResponse->SmsReportList) soap_delete_ns1__ArrayOfSmsReportList(m_pMobsetHttpEx->m_pMobsetAPI, pResponse->SmsReportList); */ delete pResponse; } } catch (...) { } } } catch (...) { } return strResponse; } }; class FormRequestHandlerFactory : public HTTPRequestHandlerFactory { public: MobsetHttpEx * m_pMobsetHttpEx; public: FormRequestHandlerFactory(MobsetHttpEx * pHttpEx) { m_pMobsetHttpEx = pHttpEx; } HTTPRequestHandler* createRequestHandler(const HTTPServerRequest& request) { return new FormRequestHandler(m_pMobsetHttpEx); } }; HTTPFormServer::HTTPFormServer() : _helpRequested(false) { m_pMobsetHttpEx = NULL; m_psvs = NULL; m_psrv = NULL; m_lErrCode = 0; } HTTPFormServer::~HTTPFormServer() { if (m_psvs) { delete m_psvs; m_psvs = NULL; } } void HTTPFormServer::SetMainHttpEx(MobsetHttpEx * pHttpEx) { m_pMobsetHttpEx = pHttpEx; } void HTTPFormServer::initialize(Application& self) { loadConfiguration(); // load default configuration files, if present ServerApplication::initialize(self); } void HTTPFormServer::uninitialize() { ServerApplication::uninitialize(); } void HTTPFormServer::defineOptions(OptionSet& options) { ServerApplication::defineOptions(options); options.addOption( Option("help", "h", "display help information on command line arguments") .required(false) .repeatable(false)); } void HTTPFormServer::handleOption(const std::string& name, const std::string& value) { ServerApplication::handleOption(name, value); if (name == "help") _helpRequested = true; } void HTTPFormServer::displayHelp() { HelpFormatter helpFormatter(options()); helpFormatter.setCommand(commandName()); helpFormatter.setUsage("OPTIONS"); helpFormatter.setHeader("A web server that shows how to work with HTML forms."); helpFormatter.format(std::cout); } int HTTPFormServer::main(const std::vector& args) { if (_helpRequested) { displayHelp(); } else { try { if (m_pMobsetHttpEx->m_bHttpLog) { try { logger_Setup(); CString strLog; strLog.Format(_T("Http Server 启动,IP:%s Port:%d SSL:%d..."), m_pMobsetHttpEx->m_strIP, m_pMobsetHttpEx->m_lPort, m_pMobsetHttpEx->m_bSSL); m_pMobsetHttpEx->Http_Log(strLog); } catch (...) { m_pMobsetHttpEx->m_bHttpLog = false; } } //绑定地址与端口 unsigned short port = m_pMobsetHttpEx->m_lPort; if (m_pMobsetHttpEx->m_strIP.GetLength() > 0) { char szIP[64] = { 0 }; strcpy(szIP, CW2A(m_pMobsetHttpEx->m_strIP)); SocketAddress address(szIP, port); m_psvs = new ServerSocket(address); } else { m_psvs = new ServerSocket(port); } const int maxQueued = 3000; const int maxThreads = 128; //ThreadPool::defaultPool().addCapacity(maxThreads); HTTPServerParams* pParams = new HTTPServerParams; pParams->setMaxQueued(maxQueued); pParams->setMaxThreads(maxThreads); pParams->setKeepAlive(false); //m_pFactory = new FormRequestHandlerFactory(m_pYouduHttpEx); m_psrv = new HTTPServer(new FormRequestHandlerFactory(m_pMobsetHttpEx), *m_psvs, pParams); m_psrv->start(); //long labc = m_psrv->maxThreads(); return Application::EXIT_OK; } //catch (std::exception abc) catch (Poco::Exception abc) { m_lErrCode = abc.code(); if (m_lErrCode == 0) m_lErrCode = -1; return m_lErrCode; } } return Application::EXIT_OK; } long HTTPFormServer::Web_WaitForRequest(void) { if (m_psrv) { //m_psrv->start(); waitForTerminationRequest(); //m_psrv->stopAll(true); m_psrv->stop(); m_psrv->stopAll(true); delete m_psrv; m_psrv = NULL; } return 0; } HTTPFormServerSSL::HTTPFormServerSSL() : _helpRequested(false) { m_pMobsetHttpEx = NULL; m_psvs = NULL; m_psrv = NULL; m_lErrCode = 0; Poco::Net::initializeSSL(); } HTTPFormServerSSL::~HTTPFormServerSSL() { if (m_psvs) { delete m_psvs; m_psvs = NULL; } Poco::Net::uninitializeSSL(); } void HTTPFormServerSSL::SetMainHttpEx(MobsetHttpEx * pHttpEx) { m_pMobsetHttpEx = pHttpEx; } void HTTPFormServerSSL::initialize(Application& self) { //loadConfiguration(); // load default configuration files, if present ServerApplication::initialize(self); } void HTTPFormServerSSL::uninitialize() { ServerApplication::uninitialize(); } void HTTPFormServerSSL::defineOptions(OptionSet& options) { ServerApplication::defineOptions(options); /* options.addOption( Option("help", "h", "display help information on command line arguments") .required(false) .repeatable(false)); */ } void HTTPFormServerSSL::handleOption(const std::string& name, const std::string& value) { ServerApplication::handleOption(name, value); if (name == "help") _helpRequested = true; } void HTTPFormServerSSL::displayHelp() { HelpFormatter helpFormatter(options()); helpFormatter.setCommand(commandName()); helpFormatter.setUsage("OPTIONS"); helpFormatter.setHeader("A web server that shows how to work with HTML forms."); helpFormatter.format(std::cout); } int HTTPFormServerSSL::main(const std::vector& args) { if (_helpRequested) { displayHelp(); } else { try { if (m_pMobsetHttpEx->m_bHttpLog) { try { logger_Setup(); CString strLog; strLog.Format(_T("Http Server 启动,IP:%s Port:%d SSL:%d..."), m_pMobsetHttpEx->m_strIP, m_pMobsetHttpEx->m_lPort, m_pMobsetHttpEx->m_bSSL); m_pMobsetHttpEx->Http_Log(strLog); } catch (...) { m_pMobsetHttpEx->m_bHttpLog = false; } } unsigned short portssl = m_pMobsetHttpEx->m_lPort; std::string sKey(m_pMobsetHttpEx->m_privateKeyFile); std::string sCert(m_pMobsetHttpEx->m_certificateFile); std::string sLocal(m_pMobsetHttpEx->m_caLocation); //有两种方式的ssl实现。 //1.OpenSSL 将MobsetHttp\poco\Net_ssl里面的文件拷到\Net文件夹下。 //2.WinSSL 将MobsetHttp\poco\Net_sslwin里面的文件拷到\Net文件夹下。 //绑定地址与端口,HTTPS //OpenSSL 使用这个 //Poco::SharedPtr ptrHandler = new Poco::Net::AcceptCertificateHandler(false); Context::Ptr pContext = new Poco::Net::Context( Poco::Net::Context::SERVER_USE, sKey, sCert, sLocal, Poco::Net::Context::VERIFY_NONE, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); pContext->enableSessionCache(true, "mobsetHttp"); pContext->setSessionTimeout(10); pContext->setSessionCacheSize(256*1024); //如果经常断,放大这个缓冲区有作用 pContext->disableStatelessSessionResumption(); //SSLManager::instance().initializeClient(0, ptrHandler, pContext); /* //winSSL 使用这个 Context::Ptr pContext = new Poco::Net::Context( Poco::Net::Context::SERVER_USE, sKey, Poco::Net::Context::VERIFY_NONE, Poco::Net::Context::OPT_LOAD_CERT_FROM_FILE, sCert); */ /* Context::Ptr pContext = new Poco::Net::Context( Poco::Net::Context::SERVER_USE, "", "", "", Poco::Net::Context::VERIFY_NONE, 9, true, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); */ //Context::Ptr pContext = NULL; if (m_pMobsetHttpEx->m_strIP.GetLength() > 0) { char szIP[64] = { 0 }; strcpy(szIP, CW2A(m_pMobsetHttpEx->m_strIP)); SocketAddress address(szIP, portssl); m_psvs = new SecureServerSocket(address, 128, pContext); } else { m_psvs = new SecureServerSocket(portssl, 128, pContext); } const int maxQueued = 2000; const int maxThreads = 64; //ThreadPool::defaultPool().addCapacity(maxThreads); HTTPServerParams* pParams = new HTTPServerParams; pParams->setMaxQueued(maxQueued); pParams->setMaxThreads(maxThreads); pParams->setKeepAlive(false); //m_pFactory = new FormRequestHandlerFactory(m_pYouduHttpEx); m_psrv = new HTTPServer(new FormRequestHandlerFactory(m_pMobsetHttpEx), *m_psvs, pParams); m_psrv->start(); //delete pContext; return Application::EXIT_OK; } //catch (std::exception abc) catch (Poco::Exception abc) { m_lErrCode = abc.code(); if (m_lErrCode == 0) m_lErrCode = -1; return m_lErrCode; } } return Application::EXIT_OK; } long HTTPFormServerSSL::Web_WaitForRequest(void) { if (m_psrv) { //m_psrv->start(); waitForTerminationRequest(); //m_psrv->stopAll(true); m_psrv->stop(); m_psrv->stopAll(true); delete m_psrv; m_psrv = NULL; } return 0; } MobsetHttpEx::MobsetHttpEx(void) { m_pParam = NULL; m_hThread = INVALID_HANDLE_VALUE; m_hThreadSSL = INVALID_HANDLE_VALUE; m_bStart = false; m_pSQL = NULL; m_Critical = NULL; m_lSQLCount = 10; m_bCopy = false; m_lPort = 0; m_HttpApp = NULL; m_HttpAppSSL = NULL; m_pMobsetAPI = NULL; m_bHttpLog = false; m_dwReqCount = 0; } MobsetHttpEx::~MobsetHttpEx(void) { Web_Exit(); } MobsetHttpEx::MobsetHttpEx(const struct soap &_soap) { } void MobsetHttpEx::Http_Log(CString strLog) { if (m_bHttpLog) { try { /* Logger& logger = Logger::get("HTTPLog"); // inherits root channel CStringA strLogA = CW2A(strLog); logger.information(strLogA.GetBuffer()); */ this->m_pMobsetAPI->Info_Log(strLog); } catch (...) { //int abc; } } } void MobsetHttpEx::Http_LogA(CStringA strLog) { if (m_bHttpLog) { try { /* Logger& logger = Logger::get("HTTPLog"); // inherits root channel CStringA strLogA = CW2A(strLog); logger.information(strLogA.GetBuffer()); */ this->m_pMobsetAPI->Info_LogA(strLog); } catch (...) { //int abc; } } } long MobsetHttpEx::Web_Init(TCHAR * strIP, long lPort, BOOL bSSL, TCHAR * privateKeyFile, TCHAR * certificateFile, TCHAR * caLocation, long lSQLConnect, long lMaxIDReq, long lMaxIPReq) { AutoCoInitializeEx AutoCoInit; //自动初始化与结束Com环境 if (this->m_pParam) { CFXSendDlg * pDlg = (CFXSendDlg *)this->m_pParam; if (pDlg->m_MCom_Head.bLogEx) { m_bHttpLog = true; /* TCHAR * buf = new TCHAR[256]; pDlg->GetCurrentPath(buf); CString strOutputBasePath = buf; delete buf; if (strOutputBasePath.GetLength() > 0) { strOutputBasePath = strOutputBasePath + CString(_T("\\")) + CString(_T("HTTPLog")); ::CreateDirectory(strOutputBasePath, NULL); //有理没理,创建了再说 } */ } } Web_Exit(); //不管什么情况,先停止再说。 //启动短信服务 m_pMobsetAPI = new MobsetApi::MobsetApiServiceEx; m_pMobsetAPI->m_bHTTP = true; //是HTTP的中转服务 m_pMobsetAPI->SetSQLParam(this->m_pParam, m_strSQL_IP, m_strSQL_User, m_strSQL_Passwd, m_strSQL_DB, m_strSQL_Provider); m_pMobsetAPI->Web_Init(_T(""), 0, lSQLConnect, lMaxIDReq, lMaxIPReq); if (strIP && _tcslen(strIP) > 8) { m_strIP = strIP; } m_lPort = (unsigned short)lPort; m_bSSL = bSSL; m_privateKeyFile = CW2A(privateKeyFile); m_certificateFile = CW2A(certificateFile); m_caLocation = CW2A(caLocation); if (m_HttpApp) { m_HttpApp->release(); m_HttpApp = NULL; } if (m_HttpAppSSL) { m_HttpAppSSL->release(); m_HttpAppSSL = NULL; } long lErrCode = 0; if (m_bSSL) //启动SSL { m_HttpAppSSL = new HTTPFormServerSSL; m_HttpAppSSL->SetMainHttpEx(this); int argc = 1; char * argv[] = { "mobsetSSL" }; int iRet = m_HttpAppSSL->run(argc, &argv[0]); lErrCode = m_HttpAppSSL->m_lErrCode; if (iRet == 0 && lErrCode == 0) { DWORD ID = 0; m_bStart = true; m_hThreadSSL = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Process_AcceptT_SSL, (LPVOID)this, 0, &ID); } } else { m_HttpApp = new HTTPFormServer; m_HttpApp->SetMainHttpEx(this); int argc = 1; char * argv[] = { "mobset" }; int iRet = m_HttpApp->run(argc, &argv[0]); lErrCode = m_HttpApp->m_lErrCode; if (iRet == 0 && lErrCode == 0) { DWORD ID = 0; m_bStart = true; m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Process_AcceptT, (LPVOID)this, 0, &ID); } } if (lErrCode != 0) m_bStart = false; CString strLog; strLog.Format(_T("Http Server 启动完成,Code:%d"), lErrCode); Http_Log(strLog); return lErrCode; } long MobsetHttpEx::GetBankSQLCount(CString & strMsg) { if (!m_pMobsetAPI) return -1; long lBankSql = m_pMobsetAPI->GetBankSQLCount(strMsg); CString strAllReq; strAllReq.Format(_T("/%d"), m_dwReqCount); strMsg = strMsg + strAllReq; return lBankSql; } UINT MobsetHttpEx::Process_AcceptT(LPVOID sParam) { MobsetHttpEx * pCtcc = (MobsetHttpEx *)sParam; if (pCtcc && pCtcc->m_bStart && pCtcc->m_HttpApp) { pCtcc->m_HttpApp->Web_WaitForRequest(); } return 0; return 0; } UINT MobsetHttpEx::Process_AcceptT_SSL(LPVOID sParam) { MobsetHttpEx * pCtcc = (MobsetHttpEx *)sParam; if (pCtcc && pCtcc->m_bStart && pCtcc->m_HttpAppSSL) { pCtcc->m_HttpAppSSL->Web_WaitForRequest(); } return 0; return 0; } DWORD WINAPI MobsetHttpEx::Process_Req(LPVOID lpParam) { /* AutoCoInitializeEx AutoCoInit; //自动初始化与结束Com环境 MobsetHttpEx * pCtcc = (MobsetHttpEx *)lpParam; TCHAR szIpAddr[32]={0}; _stprintf(szIpAddr, _T("%d.%d.%d.%d"), ((pCtcc->ip)>>24)&0xFF,((pCtcc->ip)>>16)&0xFF,((pCtcc->ip)>>8)&0xFF,(pCtcc->ip)&0xFF); pCtcc->serve(); //处理数据 //pCtcc->destroy(); soap_destroy(pCtcc); soap_end(pCtcc); soap_done(pCtcc); //soap_free(pCtcc); //删除 delete pCtcc; */ return 0; } SQL_Pool * MobsetHttpEx::GetBankSQL() { if (!m_pSQL) return NULL; for (int j = 0; j < 10; j++) { EnterCriticalSection(m_Critical); for (int i = 0; i < m_lSQLCount; i++) { if (!m_pSQL[i].bUse && m_pSQL[i].lRandID == 0 && m_pSQL[i].adoConnection.isOK()) { m_pSQL[i].bUse = true; m_pSQL[i].lRandID = rand(); m_pSQL[i].dwBeginUse = GetTickCount(); //if ( !m_pSQL[i].spDoc ) // m_pSQL[i].spDoc.CoCreateInstance(__uuidof(DOMDocument40)); if (ConnectSQLServer(&m_pSQL[i])) //连接数据库 { LeaveCriticalSection(m_Critical); return &m_pSQL[i]; } } } LeaveCriticalSection(m_Critical); Sleep(500); } return NULL; } BOOL MobsetHttpEx::ConnectSQLServer(SQL_Pool *pSql) { if (!pSql) return false; //if ( !pSql->spDoc ) //{ // pSql->spDoc.CoCreateInstance(__uuidof(DOMDocument40)); //} if (pSql->adoConnection.IsOpen()) { return true; } for (int i = 0; i < 3; i++) //重试3次,看能否连上数据库 { BOOL b = pSql->adoConnection.ConnectSQLServer2(m_strSQL_IP, m_strSQL_DB, m_strSQL_User, m_strSQL_Passwd, m_strSQL_Provider); if (b) { pSql->adoConnection.SetCommandTimeout(120); //设置连接超时时间 pSql->adoConnection.SetCursorLocation(adUseClient); //设置为本地游标类型 return true; } Sleep(2000); } return false; } void MobsetHttpEx::SetSQLParam(LPVOID pParam, CString strIP, CString strUser, CString strPasswd, CString strDB, CString strProvider) { m_pParam = pParam; //_tcscpy(m_strSQL_Provider, strProvider); _tcscpy(m_strSQL_IP, strIP); _tcscpy(m_strSQL_User, strUser); _tcscpy(m_strSQL_Passwd, strPasswd); _tcscpy(m_strSQL_DB, strDB); _tcscpy(m_strSQL_Provider, strProvider); } long MobsetHttpEx::Web_Exit() { if (m_bCopy) //如果只是复制的,不用释放资源。 return true; m_bStart = false; if (m_HttpApp) { m_HttpApp->terminate(); } if (m_hThread != INVALID_HANDLE_VALUE) { WaitForSingleObject(m_hThread, 10000); //等待10秒 m_hThread = INVALID_HANDLE_VALUE; } if (m_HttpApp) { m_HttpApp->release(); //delete m_HttpApp; m_HttpApp = NULL; } if (m_HttpAppSSL) { m_HttpAppSSL->terminate(); } if (m_hThreadSSL != INVALID_HANDLE_VALUE) { WaitForSingleObject(m_hThreadSSL, 10000); //等待10秒 m_hThreadSSL = INVALID_HANDLE_VALUE; } if (m_HttpAppSSL) { m_HttpAppSSL->release(); //delete m_HttpAppSSL; m_HttpAppSSL = NULL; } /* if (m_pSQL) { EnterCriticalSection(m_Critical); for (int i = 0; i < m_lSQLCount; i++) { m_pSQL[i].adoConnection.Close(); //if ( m_pSQL[i].spDoc ) //{ // m_pSQL[i].spDoc.Release(); // m_pSQL[i].spDoc = NULL; //} } delete[]m_pSQL; m_pSQL = NULL; LeaveCriticalSection(m_Critical); } if (m_Critical) { DeleteCriticalSection(m_Critical); delete m_Critical; m_Critical = NULL; } */ if (m_pMobsetAPI) { m_pMobsetAPI->Web_Exit(); delete m_pMobsetAPI; m_pMobsetAPI = NULL; } return true; } void MobsetHttpEx::GetCurrentPath(TCHAR *pPath) { try { ::GetModuleFileName(NULL, pPath, 512); int j = lstrlen(pPath); for (; j > 0; j--) { if (pPath[j] == '\\') break; } pPath[j + 1] = 0; } catch (...) { } } MyHttpParamsParser::MyHttpParamsParser() { m_pUrl = NULL; m_pPostData = NULL; } long MyHttpParamsParser::Parser1(std::string * pData, long lType) { if (!pData) return 0; long lNumber = 0; long lLen = pData->size(); BOOL bParserParam = true; BOOL bUrlDecode = false; BOOL bParserBegin = false; std::string paramName; long lBegin = 0; long lEnd = 0; for (int i = 0; i < lLen; i++) { //if (lType == 0 && lLen<20 && (!bParserBegin && pData->at(i) == '?') ) //分析url时如果遇到?号,表示参数开始,所有内容重新来过 if (lType == 1 && i < 80 && (!bParserBegin && pData->at(i) == '?')) //分析url时如果前20个字符遇到?号,表示参数开始,所有内容重新来过 { bParserBegin = true; paramName = ""; bParserParam = true; lBegin = 0; lEnd = 0; bUrlDecode = false; //默认不需要url解码 continue; } BOOL bEndChar = false; if (pData->at(i) == '=') //此时代表参数与值的分隔 { if (bParserParam) { bParserParam = false; //遇到=号,下一个就是值了。 lBegin = i + 1; continue; } else { bEndChar = true; } } if (pData->at(i) == '&') //此时代表下一个参数的开始 { bEndChar = true; } if (bEndChar) { if (!bParserParam && lEnd >= lBegin) { HttpParams param; param.name = paramName; param.in = lType; param.begin = lBegin; param.end = lEnd; param.urlDecode = bUrlDecode; m_HttpParams.push_back(param); lNumber++; } //遇到&号,下一个就是新的参数了。 paramName = ""; bParserParam = true; lBegin = 0; lEnd = 0; bUrlDecode = false; //默认不需要url解码 continue; } if (bParserParam) { paramName = paramName + pData->at(i); } else { if (pData->at(i) == '%' || pData->at(i) == '+') //有此符号表示url解码 //if (pData->at(i) == '%') //有此符号表示url解码 { bUrlDecode = true; //默认不需要url解码 } lEnd = i; } } if (!bParserParam && i > 0 && i >= lBegin) { HttpParams param; param.name = paramName; param.in = lType; param.begin = lBegin; param.end = i-1; param.urlDecode = bUrlDecode; m_HttpParams.push_back(param); lNumber++; } return lNumber; } long MyHttpParamsParser::Parser(std::string * pUrl, std::string * pPostData) { m_HttpParams.clear(); Parser1(pUrl, 0); //先分析url Parser1(pPostData, 1); //再分析postData m_pUrl = pUrl; m_pPostData = pPostData; return m_HttpParams.size(); } std::string MyHttpParamsParser::get(std::string paramName, std::string default) { std::string sReturn = default; std::string paramNameU1 = paramName; transform(paramNameU1.begin(), paramNameU1.end(), paramNameU1.begin(), ::toupper); long lSize = m_HttpParams.size(); for (int i = 0; i < lSize; i++) { std::string paramNameU2 = m_HttpParams[i].name; transform(paramNameU2.begin(), paramNameU2.end(), paramNameU2.begin(), ::toupper); if (paramNameU1.compare(paramNameU2)==0) { std::string * pData = m_pUrl; if (m_HttpParams[i].in == 1) pData = m_pPostData; if (pData) { long lLen = pData->size(); if (m_HttpParams[i].end <= lLen && m_HttpParams[i].end >= m_HttpParams[i].begin) { sReturn = pData->substr(m_HttpParams[i].begin, (m_HttpParams[i].end - m_HttpParams[i].begin)+1); if (m_HttpParams[i].urlDecode) { return URLDecode(sReturn); } else { return sReturn; } break; } } } } return sReturn; } CStringW MyHttpParamsParser::getAsStringW(std::string paramName, std::string default, long lCharsetType) { CStringW str; std::string sReturn; std::string sGet = get(paramName, default); if (sGet.size() > 0) { return FormRequestHandler::ChangeHttpReqToW(sGet, lCharsetType); } return str; } long MyHttpParamsParser::getLength(std::string paramName) { std::string paramNameU1 = paramName; transform(paramNameU1.begin(), paramNameU1.end(), paramNameU1.begin(), ::toupper); long lSize = m_HttpParams.size(); for (int i = 0; i < lSize; i++) { std::string paramNameU2 = m_HttpParams[i].name; transform(paramNameU2.begin(), paramNameU2.end(), paramNameU2.begin(), ::toupper); if (paramNameU1.compare(paramNameU2) == 0) { std::string * pData = m_pUrl; if (m_HttpParams[i].in == 1) pData = m_pPostData; if (pData) { long lLen = pData->size(); if (m_HttpParams[i].end <= lLen && m_HttpParams[i].end >= m_HttpParams[i].begin) { return (m_HttpParams[i].end - m_HttpParams[i].begin) + 1; break; } } } } return 0; } long MyHttpParamsParser::getAsBase64Decode(std::string paramName, void * pData, long lMaxLen) { long lLen = 0; std::string sReturn; std::string sGet = get(paramName, ""); if (sGet.size() > 0) { CBase64Coding base64coding; CByteArray ba; if (base64coding.Decode(CStringA(sGet.c_str()), ba)) { if (ba.GetSize() <= lMaxLen) { lLen = ba.GetSize(); memcpy(pData, ba.GetData(), lLen); } } } return lLen; } std::string MyHttpParamsParser::URLDecode(std::string& sIn) { std::string result; long lLen = sIn.size(); int hex = 0; for (int i = 0; i < lLen; ++i) { char c = sIn.at(i); char c1 = 0; char c2 = 0; switch (c) { case '+': result += ' '; break; case '%': if (i + 2 < lLen) { c1 = sIn.at(i + 1); c2 = sIn.at(i + 2); } if (isxdigit(c1) && isxdigit(c2)) { //std::string hexStr = sIn.Mid(i + 1, 2); //hex = strtol(hexStr.c_str(), 0, 16); hex = fromHex(c1) * 16 + fromHex(c2); result += char(hex); i += 2; /* //字母和数字[0-9a-zA-Z]、一些特殊符号[$-_.+!*'(),] 、以及某些保留字[$&+,/:;=?@] //可以不经过编码直接用于URL if (!((hex >= 48 && hex <= 57) || //0-9 (hex >=97 && hex <= 122) || //a-z (hex >=65 && hex <= 90) || //A-Z //一些特殊符号及保留字[$-_.+!*'(),] [$&+,/:;=?@] hex == 0x21 || hex == 0x24 || hex == 0x26 || hex == 0x27 || hex == 0x28 || hex == 0x29 || hex == 0x2a || hex == 0x2b|| hex == 0x2c || hex == 0x2d || hex == 0x2e || hex == 0x2f || hex == 0x3A || hex == 0x3B|| hex == 0x3D || hex == 0x3f || hex == 0x40 || hex == 0x5f )) { result += char(hex); i += 2; } else result += '%'; */ } else { result += '%'; } break; default: result += char(c); break; } } return result; /* CStringA sOut; long lLen = sIn.GetLength(); for( int ix = 0; ix < lLen; ix++ ) { TCHAR ch = 0; if(sIn[ix]=='%') { ch = (fromHex(sIn[ix+1])<<4); ch |= fromHex(sIn[ix+2]); ix += 2; } else if(sIn[ix] == '+') { ch = ' '; } else { ch = sIn[ix]; } sOut += (TCHAR)ch; } return sOut; */ } BYTE MyHttpParamsParser::fromHex(const BYTE &x) { if (isdigit(x)) { return x - '0'; } else if (x >= 'A' && x <= 'F') { return x - 'A' + 10; } else if (x >= 'a' && x <= 'f') return x - 'a' + 10; return 0; } };