Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   C++ и cURL как распокавать ответ пожатый deflate ? (https://forum.antichat.xyz/showthread.php?t=168610)

Akum 06.01.2010 01:25

C++ и cURL как распокавать ответ пожатый deflate ?
 
Здраствуйте!
Отправляю GET запрос на сервер так:

Код:

#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

ЕгоАкк 06.01.2010 08:17

>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, "");
в этом случае курл будет сам с ними управляться.

Akum 06.01.2010 14:03

Цитата:

Сообщение от ЕгоАкк
>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, "");
в этом случае курл будет сам с ними управляться.
Да не усмотрел :mad: А куки мне нужны я их в следующий запрос передаю :)

ЕгоАкк 06.01.2010 14:22

Цитата:

Сообщение от Akum
Да сам распаковывает спасибо!

Да не усмотрел :mad: А куки мне нужны я их в следующий запрос передаю :)

Ты что, на каждый запрос новый курл создаёшь? Вообще нужно создавать один и его использовать на все запросы, в нём будут храниться и куки и всё прочее.

Akum 06.01.2010 15:03

Цитата:

Сообщение от ЕгоАкк
Ты что, на каждый запрос новый курл создаёшь? Вообще нужно создавать один и его использовать на все запросы, в нём будут храниться и куки и всё прочее.

Я побывал с одним мне постоянно ошибку сегментации выдавало :mad:
Там же надо все опции сбрасывать и ставить по новому я использовал
Код:

curl_easy_reset()
вот после этого и вываливается ошибка!

ЕгоАкк 06.01.2010 15:35

Цитата:

Сообщение от Akum
Я побывал с одним мне постоянно ошибку сегментации выдавало :mad:
Там же надо все опции сбрасывать и ставить по новому я использовал
Код:

curl_easy_reset()
вот после этого и вываливается ошибка!

Не нужно опции сбрасывать, достаточно просто делать новый curl_easy_setopt того что нужно поменять в запросе. Переключение между гет и пост запросом: CURLOPT_HTTPGET и CURLOPT_POST

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

Akum 06.01.2010 16:10

Не могли бы вы привести пример как скачать файл через libcurl ?

Akum 06.01.2010 17:44

Цитата:

Сообщение от Akum
Не могли бы вы привести пример как скачать файл через libcurl ?

Спасибо разобрался! :D


Время: 22:00