void FetchThread::close() { if (hReq){ _InternetCloseHandle(hReq); hReq = NULL; } if (hCon){ _InternetCloseHandle(hCon); hCon = NULL; } }
FetchManager::~FetchManager() { #ifdef WIN32 if (hInet) _InternetCloseHandle(hInet); #endif getContacts()->removePacketType(HTTPPacket); delete m_done; }
FetchManager::~FetchManager() { #ifdef WIN32 if (hInet){ _InternetCloseHandle(hInet); return; } #endif for (list<FetchClient*>::iterator it = m_clients.begin(); it != m_clients.end(); it = m_clients.begin()) delete *it; getContacts()->removePacketType(HTTPPacket); }
void FetchThread::run() { string headers; DWORD flags = INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_NO_UI | INTERNET_FLAG_NO_AUTH; if (!m_client->m_bRedirect) flags |= INTERNET_FLAG_NO_AUTO_REDIRECT; for (HEADERS_MAP::iterator it = m_client->m_hOut.begin(); it != m_client->m_hOut.end(); ++it){ if (!headers.empty()) headers += "\r\n"; string h = (*it).first.c_str(); headers += h; headers += ": "; headers += (*it).second.c_str(); } log(L_DEBUG, "URL: %s", m_client->m_uri.c_str()); URL_COMPONENTSA url; memset(&url, 0, sizeof(url)); url.dwStructSize = sizeof(url); char host[256]; url.lpszHostName = host; url.dwHostNameLength = sizeof(host); char user[256]; url.lpszUserName = user; url.dwUserNameLength = sizeof(user); char pass[256]; url.lpszPassword = pass; url.dwPasswordLength = sizeof(pass); char urlPath[1024]; url.lpszUrlPath = urlPath; url.dwUrlPathLength = sizeof(urlPath); char extra[1024]; url.lpszExtraInfo = extra; url.dwExtraInfoLength = sizeof(extra); if (!_InternetCrackUrl(m_client->m_uri.c_str(), 0, ICU_DECODE, &url)){ m_client->m_errCode = GetLastError(); m_client->m_err = "InternetCrackUrl"; FetchManager::manager->remove(m_client); return; } if (url.nScheme == INTERNET_SCHEME_HTTPS){ flags |= INTERNET_FLAG_SECURE; }else if (url.nScheme != INTERNET_SCHEME_HTTP){ m_client->m_errCode = GetLastError(); m_client->m_err = "Unsupported scheme"; FetchManager::manager->remove(m_client); return; } HINTERNET hCon = _InternetConnect(hInet, url.lpszHostName, url.nPort, url.lpszUserName, url.lpszPassword, INTERNET_SERVICE_HTTP, 0, 0); if (hCon == NULL){ m_client->m_errCode = GetLastError(); m_client->m_err = "InternetConnect error"; FetchManager::manager->remove(m_client); return; } const char *verb = "GET"; char *post_data = NULL; DWORD post_size = 0; if (m_client->m_post){ verb = "POST"; post_data = m_client->m_post->data(); post_size = m_client->m_post->size(); } string uri = url.lpszUrlPath; if (url.lpszExtraInfo) uri += url.lpszExtraInfo; HINTERNET hReq = _HttpOpenRequest(hCon, verb, uri.c_str(), NULL, NULL, NULL, flags, 0); if (hReq == NULL){ m_client->m_errCode = GetLastError(); m_client->m_err = "HttpOpenRequest error"; _InternetCloseHandle(hCon); FetchManager::manager->remove(m_client); return; } if (!_HttpSendRequest(hReq, headers.c_str(), headers.length(), post_data, post_size)){ m_client->m_errCode = GetLastError(); m_client->m_err = "HttpSendRequest"; _InternetCloseHandle(hReq); _InternetCloseHandle(hCon); FetchManager::manager->remove(m_client); return; } DWORD size = 0; DWORD err = 0; _HttpQueryInfo(hReq, HTTP_QUERY_RAW_HEADERS_CRLF, NULL, &size, 0); err = GetLastError(); if (err != ERROR_INSUFFICIENT_BUFFER ){ m_client->m_errCode = GetLastError(); m_client->m_err = "HttpQueryInfo"; _InternetCloseHandle(hReq); _InternetCloseHandle(hCon); FetchManager::manager->remove(m_client); return; } Buffer in_headers; in_headers.init(size); if (!_HttpQueryInfo(hReq, HTTP_QUERY_RAW_HEADERS_CRLF, in_headers.data(), &size, 0)){ m_client->m_errCode = GetLastError(); m_client->m_err = "HttpQueryInfo"; _InternetCloseHandle(hReq); _InternetCloseHandle(hCon); FetchManager::manager->remove(m_client); return; } in_headers.setWritePos(size); string line; bool bFirst = true; for (; in_headers.readPos() < in_headers.writePos(); ){ if (!in_headers.scan("\r\n", line)){ line = ""; unsigned size = in_headers.writePos() - in_headers.readPos(); line.append(size, '\x00'); in_headers.unpack((char*)line.c_str(), size); } if (bFirst){ bFirst = false; getToken(line, ' '); m_client->m_code = atol(line.c_str()); continue; } m_client->m_hIn += line; m_client->m_hIn += '\x00'; } if (bFirst){ m_client->m_errCode = 0; m_client->m_err = "Bas answer"; _InternetCloseHandle(hReq); _InternetCloseHandle(hCon); FetchManager::manager->remove(m_client); return; } for (;;){ DWORD readn; char buff[4096]; if (!_InternetReadFile(hReq, buff, sizeof(buff), &readn)){ m_client->m_errCode = GetLastError(); m_client->m_err = "InternetReadFile"; _InternetCloseHandle(hReq); _InternetCloseHandle(hCon); FetchManager::manager->remove(m_client); return; } if (readn == 0) break; m_client->m_res.pack(buff, readn); } _InternetCloseHandle(hReq); _InternetCloseHandle(hCon); FetchManager::manager->remove(m_client); }