void Collector::PollData() { ACE_SOCK_Stream peer; ACE_SOCK_Connector connector; try { if(TryToConnect(connector,peer)) { std::ostringstream oss; oss << "poll data form cluster: " << data_source_.name; LOG4CXX_INFO(log_,oss.str()); char buf[T_SIZE] = "request"; if((peer.send(buf,sizeof(buf)))<=0) throw "KSN POLLER COLLECTOR SEND REQUEST ERROR!!"; char* ch = new char[T_SIZE](); if((peer.recv(ch,T_SIZE)<=0)) throw "KSN POLLER COLLECTOR RECV ERROR!!"; msg_ = new ACE_Message_Block(ch,sizeof(*ch)); sender_->putq(msg_); } else { std::ostringstream oss; oss << "Can not poll data form " + data_source_.name; LOG4CXX_WARN(log_,oss.str()); } } catch(const char* ch) { LOG4CXX_ERROR(log_,ch); } }
bool CUrlClient::ProcessHttpDownResponse(const CStringAArray& astrHeaders) { if (reqfile == NULL) throw CString(_T("Failed to process received HTTP data block - No 'reqfile' attached")); if (astrHeaders.GetCount() == 0) throw CString(_T("Unexpected HTTP response - No headers available")); const CStringA& rstrHdr = astrHeaders.GetAt(0); UINT uHttpMajVer, uHttpMinVer, uHttpStatusCode; if (sscanf(rstrHdr, "HTTP/%u.%u %u", &uHttpMajVer, &uHttpMinVer, &uHttpStatusCode) != 3){ CString strError; strError.Format(_T("Unexpected HTTP response: \"%hs\""), rstrHdr); throw strError; } if (uHttpMajVer != 1 || (uHttpMinVer != 0 && uHttpMinVer != 1)){ CString strError; strError.Format(_T("Unexpected HTTP version: \"%hs\""), rstrHdr); throw strError; } bool bExpectData = uHttpStatusCode == HTTP_STATUS_OK || uHttpStatusCode == HTTP_STATUS_PARTIAL_CONTENT; bool bRedirection = uHttpStatusCode == HTTP_STATUS_MOVED || uHttpStatusCode == HTTP_STATUS_REDIRECT; if (!bExpectData && !bRedirection){ CString strError; strError.Format(_T("Unexpected HTTP status code \"%u\""), uHttpStatusCode); throw strError; } bool bNewLocation = false; bool bValidContentRange = false; for (int i = 1; i < astrHeaders.GetCount(); i++) { const CStringA& rstrHdr = astrHeaders.GetAt(i); if (bExpectData && strnicmp(rstrHdr, "Content-Length:", 15) == 0) { UINT uContentLength = atoi((LPCSTR)rstrHdr + 15); if (uContentLength != m_uReqEnd - m_uReqStart + 1){ if (uContentLength != reqfile->GetFileSize()){ // tolerate this case only CString strError; strError.Format(_T("Unexpected HTTP header field \"%hs\""), rstrHdr); throw strError; } TRACE("+++ Unexpected HTTP header field \"%s\"\n", rstrHdr); } } else if (bExpectData && strnicmp(rstrHdr, "Content-Range:", 14) == 0) { DWORD dwStart = 0, dwEnd = 0, dwLen = 0; if (sscanf((LPCSTR)rstrHdr + 14," bytes %u - %u / %u", &dwStart, &dwEnd, &dwLen) != 3){ CString strError; strError.Format(_T("Unexpected HTTP header field \"%hs\""), rstrHdr); throw strError; } if (dwStart != m_uReqStart || dwEnd != m_uReqEnd || dwLen != reqfile->GetFileSize()){ CString strError; strError.Format(_T("Unexpected HTTP header field \"%hs\""), rstrHdr); throw strError; } bValidContentRange = true; } else if (strnicmp(rstrHdr, "Server:", 7) == 0) { if (m_strClientSoftware.IsEmpty()) m_strClientSoftware = rstrHdr.Mid(7).Trim(); } else if (bRedirection && strnicmp(rstrHdr, "Location:", 9) == 0) { CString strLocation(rstrHdr.Mid(9).Trim()); if (!SetUrl(strLocation)){ CString strError; strError.Format(_T("Failed to process HTTP redirection URL \"%s\""), strLocation); throw strError; } bNewLocation = true; } } if (bNewLocation) { m_iRedirected++; if (m_iRedirected >= 3) throw CString(_T("Max. HTTP redirection count exceeded")); // the tricky part socket->Safe_Delete(); // mark our parent object for getting deleted! if (!TryToConnect(true)) // replace our parent object with a new one throw CString(_T("Failed to connect to redirected URL")); return false; // tell our old parent object (which was marked as to get deleted // and which is no longer attached to us) to disconnect. } if (!bValidContentRange){ if (thePrefs.GetDebugClientTCPLevel() <= 0) DebugHttpHeaders(astrHeaders); CString strError; strError.Format(_T("Unexpected HTTP response - No valid HTTP content range found")); throw strError; } SetDownloadState(DS_DOWNLOADING); return true; }