http请求

sdz1219 2015-10-23 04:11:12
int CommonUtil::HttpSendRequest(wstring wstrURL,
wstring wstrVerb,
LPVOID lpOptional,
DWORD dwOptionalLength,
string &strResult){
strResult="";
DWORD dwSize = 0;
DWORD dwFlags = 0;
std::wstring strServer;
std::wstring strObject;
INTERNET_PORT nPort;
INT nScheme;
BOOL bHttps = FALSE;
BOOL bResult = FALSE;

HINTERNET hSession(NULL);
HINTERNET hConnect(NULL);
HINTERNET hRequest(NULL);

wstring strHeaders=L"Content-Type: application/x-www-form-urlencoded\r\nAccept: */*\r\nAccept-Encoding: gzip, deflate\r\n";

if (!ParseUrl(wstrURL.c_str(), strServer, nPort, strObject, nScheme)) {
strResult=ReadErrorMsg("解析URL错误", 0);
return CONST_SYSTEM_ERROR;
}

// 打开会话
//LOG_INFO("打开会话...");
hSession = InternetOpenW(
L"Mozilla/4.0 (compatible; MSIE 5.22)",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0
);
if (NULL == hSession) {
strResult=ReadErrorMsg("InternetOpen失败", GetLastError());
return CONST_SYSTEM_ERROR;
}

// 打开连接
//LOG_INFO("打开连接...");
hConnect = InternetConnectW(hSession,
strServer.c_str(),
nPort,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
0,
NULL
);
if (NULL == hConnect ) {
strResult=ReadErrorMsg("InternetConnect失败", GetLastError());
return CONST_SYSTEM_ERROR;
}
// 设置请求标志
//LOG_INFO("设置请求标志...");
dwFlags = INTERNET_FLAG_RELOAD;
if (INTERNET_SCHEME_HTTPS == nScheme) {
dwFlags |= INTERNET_FLAG_SECURE;
dwFlags |= INTERNET_FLAG_IGNORE_CERT_CN_INVALID;
dwFlags |= INTERNET_FLAG_IGNORE_CERT_DATE_INVALID;
}

//if (!bAutoRedirect) {
dwFlags |= INTERNET_FLAG_NO_AUTO_REDIRECT;
//}


// 打开请求
//LOG_INFO("打开请求...");
hRequest = HttpOpenRequestW(hConnect,
wstrVerb.c_str(),
strObject.c_str(),
NULL,
NULL,
NULL,
dwFlags,
/*(DWORD_PTR)this*/
NULL
);
if (NULL == hRequest) {
strResult=ReadErrorMsg("HttpOpenRequest失败", GetLastError());
return CONST_SYSTEM_ERROR;
}
/*if (!strCookie.empty()) {
strHeaders += L"Cookie: ";
strHeaders += strCookie;
strHeaders += L"\r\n";
}*/

LPCWSTR lpszHeaders = strHeaders.empty( ) ? NULL : strHeaders.c_str();
/*LPVOID lpOptional = strOptional.empty( ) ? NULL : (LPVOID)strOptional.c_str();*/

//LOG_INFO("设置超时...");
DWORD dwTimeout = AppConfig::GetInstance()->GetTimeout();
// 设置标志
InternetSetOption(hRequest,
INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT,
&dwTimeout,
sizeof(DWORD)
);
if (INTERNET_SCHEME_HTTPS == nScheme) {
DWORD dwBuffLen = sizeof(dwFlags);
InternetQueryOption(hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);
dwFlags |= SECURITY_FLAG_IGNORE_REVOCATION;
dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
InternetSetOption(hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, sizeof(dwFlags)) ;
}
//LOG_INFO("发送请求...");
bResult = HttpSendRequestW( hRequest,
lpszHeaders,
strHeaders.length(),
lpOptional,
dwOptionalLength
);

if (!bResult) {
if (ERROR_INTERNET_TIMEOUT == GetLastError()) {
//dwStatusCode = HTTP_STATUS_REQUEST_TIMEOUT;
strResult = "Request timeout!";

}else{
strResult=ReadErrorMsg("HttpSendRequestW失败", GetLastError());
}
return CONST_SYSTEM_ERROR;
}

//LOG_INFO("读取结果...");
if (bResult) {
//OnReadCookie(hRequest);
//OnReadStatusCode(hRequest);
DWORD dwSize = 0;


/****************ReadStatusCode***********************/

DWORD dwStatusCode = 0;
dwSize = sizeof( DWORD );
if ( !HttpQueryInfo( hRequest,
HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
&dwStatusCode,
&dwSize,
NULL
) ){
strResult = "读取状态失败";
return CONST_SYSTEM_ERROR;
}

if(HTTP_STATUS_OK!=dwStatusCode){
char sz[24] = { 0 };
sprintf_s( sz, 24, "%d", dwStatusCode );
strResult = "StatusCode:"+string(sz);
return CONST_SYSTEM_ERROR;
}
/****************ReadStatusCode***********************/


/****************ReadData***********************/
LPSTR lpszData =0;
DWORD dwDownloaded = 0;
dwSize=0;


while ( InternetQueryDataAvailable( hRequest, &dwSize, 0, 0 ) ) {
if ( dwSize == 0 ) {
break;
}
lpszData = new CHAR[ dwSize+1 ];
if( InternetReadFile( hRequest,
(LPVOID)lpszData,
dwSize,
&dwDownloaded )
) {
strResult += std::string( (char*) lpszData, dwDownloaded );
}
delete[] lpszData;
if ( dwDownloaded == 0 ) {
break;
}
}
//EndRequest();
strResult=CommonUtil::Utf8ToGBK(strResult);
/****************ReadData***********************/
return CONST_NOT_ERROR;
}
else {
//LOG_ERROR("HttpSendRequest失败", GetLastError());
//EndRequest();
}

return CONST_SYSTEM_ERROR;
}
...全文
84 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
mxway 2015-10-23
  • 打赏
  • 举报
回复
你的问题是什么呢?
(1).测试案例(Testcase)通过Client Lib的接口向Selenium Server发送Http请求,要求和Selenium Server建立连接。 为什么要通过发送Http请求控制Selenium Server而不采用其他方式呢?从上文可以看出,Selenium Server是一个独立的中间服务器(确切地说是代理服务器),它可以架设在其他机器上!所以测试案例通过发送HTTP请求去控制Selenium Server是很正常的。 (2).Selenium Server的Launcher启动浏览器,把Selenium Core加载入浏览器页面当中,并把浏览器的代理设置为Selenium Server的Http Proxy。 (3).测试案例通过Client Lib的接口向Selenium Server发送Http请求,Selenium Server对请求进行解析,然后通过Http Proxy发送JS命令通知Selenium Core执行操作浏览器的动作。 (4).Selenium Core接收到指令后,执行操作。 (5).浏览器收到新的页面请求信息(因为在(4)中,Selenium Core的操作可能引发新的页面请求),于是发送Http请求,请求新的Web页面。 由于Selenium Server在启动浏览器时做了手脚,所以Selenium Server会接收到所有由它启动的浏览器发送的请求。 (6).Selenium Server接收到浏览器的发送的Http请求后,自己重组Http请求,获取对应的Web页面。 (7).Selenium Server的Http Proxy把接收的Web页面返回给浏览器。 因为浏览器存在同源策略,所以Selenium RC中的Selenium Server需要以这种代理模式运行。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧