コード例 #1
0
ファイル: fetch.cpp プロジェクト: BackupTheBerlios/sim-im-svn
void FetchThread::close()
{
    if (hReq){
        _InternetCloseHandle(hReq);
        hReq = NULL;
    }
    if (hCon){
        _InternetCloseHandle(hCon);
        hCon = NULL;
    }
}
コード例 #2
0
ファイル: fetch.cpp プロジェクト: BackupTheBerlios/sim-im-svn
FetchManager::~FetchManager()
{
#ifdef WIN32
    if (hInet)
        _InternetCloseHandle(hInet);
#endif
    getContacts()->removePacketType(HTTPPacket);
    delete m_done;
}
コード例 #3
0
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);
}
コード例 #4
0
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);
}