C++ и cURL как распокавать ответ пожатый deflate ?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Akum, 6 Jan 2010.

  1. Akum

    Akum New Member

    Joined:
    5 Jan 2010
    Messages:
    34
    Likes Received:
    1
    Reputations:
    0
    Здраствуйте!
    Отправляю GET запрос на сервер так:

    Code:
    #include <iostream>
    #include <string.h>
    #include <curl/curl.h>
    
    using namespace std;
    
    static int writer(char *data, size_t size, size_t nmemb,std::string *buffer)
    {
        int result = 0;
        if (buffer != NULL)
        {
            buffer->append(data, size * nmemb);
            result = size * nmemb;
        }
        return result;
    }
    
    int main(int argc, char* argv[])
    {
        //  cout<<(*argv)<<endl;
        string patch_to_programm = *argv;
        patch_to_programm = patch_to_programm + "/";
    
        string urls = "http://depositfiles.com/files/dq94choda";
        string uagent = "User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.43 Safari/532.5";
        string reffer ="Referer: http://vkontakte.ru/away.php?to=http%3A%2F%2Fdepositfiles.com%2Ffiles%2Fdq94choda";
    
        CURL *curl1;
        CURLcode result;
    
        string buffer;
    
        curl_global_init(CURL_GLOBAL_ALL);
    
        cout << "Заход на сайт... " << urls << endl;
    
        curl_slist *slist1=NULL;
    
        slist1 = curl_slist_append(slist1, uagent.c_str());
        slist1 = curl_slist_append(slist1, reffer.c_str());
        slist1 = curl_slist_append(slist1, "Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
        slist1 = curl_slist_append(slist1, "Accept-Encoding: gzip,deflate");
        slist1 = curl_slist_append(slist1, "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
        slist1 = curl_slist_append(slist1, "Accept-Charset: UTF-8,*;q=0.5");
    
        curl1 = curl_easy_init();
        curl_easy_setopt(curl1, CURLOPT_URL, urls.c_str());
        curl_easy_setopt(curl1, CURLOPT_HEADER, 0);
        curl_easy_setopt(curl1, CURLOPT_FOLLOWLOCATION, 1);
        curl_easy_setopt(curl1, CURLOPT_COOKIEJAR, (patch_to_programm +"cookiefile.1").c_str());
        curl_easy_setopt(curl1, CURLOPT_COOKIEFILE,(patch_to_programm +"cookiefile.1").c_str());
        curl_easy_setopt(curl1, CURLOPT_HTTPHEADER, slist1);
        curl_easy_setopt(curl1, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl1, CURLOPT_WRITEDATA, &buffer);
    
        result = curl_easy_perform(curl1);
    
        cout<<buffer<<endl;
    
        return 0;
    }
    Возникает 2 вопроса:
    1)Как перевести ответ в читабельные вид (в норм кодировку)?
    2)И почему не создается файл с кукисами в папке с программой?
    Заранее огромное спасибо!

    OS ubuntu 9.10 x64 codebloks
     
  2. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    >1)Как перевести ответ в читабельные вид (в норм кодировку)?

    Вместо:
    curl_slist_append(slist1, "Accept-Encoding: gzip,deflate");
    попробуй:
    curl_easy_setopt(curl, CURLOPT_ENCODING, "gzip,deflate");
    если curl собран с zlib, то он сам будет распаковывать ответ.

    >2)И почему не создается файл с кукисами в папке с программой?

    потому в argv[0] содержится имя исполняемого файла, в результате путь получается: "aaa.exe/cookiefile.1"

    Если тебе реально НЕ нужно хранить куки в файле, то лучше использовать:
    curl_easy_setopt(curl, CURLOPT_COOKIELIST, "");
    в этом случае курл будет сам с ними управляться.
     
    2 people like this.
  3. Akum

    Akum New Member

    Joined:
    5 Jan 2010
    Messages:
    34
    Likes Received:
    1
    Reputations:
    0
    Да сам распаковывает спасибо!
    Да не усмотрел :mad: А куки мне нужны я их в следующий запрос передаю :)
     
  4. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    Ты что, на каждый запрос новый курл создаёшь? Вообще нужно создавать один и его использовать на все запросы, в нём будут храниться и куки и всё прочее.
     
  5. Akum

    Akum New Member

    Joined:
    5 Jan 2010
    Messages:
    34
    Likes Received:
    1
    Reputations:
    0
    Я побывал с одним мне постоянно ошибку сегментации выдавало :mad:
    Там же надо все опции сбрасывать и ставить по новому я использовал
    Code:
    curl_easy_reset()
    вот после этого и вываливается ошибка!
     
  6. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    Не нужно опции сбрасывать, достаточно просто делать новый curl_easy_setopt того что нужно поменять в запросе. Переключение между гет и пост запросом: CURLOPT_HTTPGET и CURLOPT_POST

    Что касается сегфолта, то это ты сам что то покоцал.
     
  7. Akum

    Akum New Member

    Joined:
    5 Jan 2010
    Messages:
    34
    Likes Received:
    1
    Reputations:
    0
    Не могли бы вы привести пример как скачать файл через libcurl ?
     
  8. Akum

    Akum New Member

    Joined:
    5 Jan 2010
    Messages:
    34
    Likes Received:
    1
    Reputations:
    0
    Спасибо разобрался! :D