PDA

Просмотр полной версии : C++ и cURL как распокавать ответ пожатый deflate ?


Akum
06.01.2010, 01:25
Здраствуйте!
Отправляю 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
Да сам распаковывает спасибо!

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

Akum
06.01.2010, 15:03
Ты что, на каждый запрос новый курл создаёшь? Вообще нужно создавать один и его использовать на все запросы, в нём будут храниться и куки и всё прочее.
Я побывал с одним мне постоянно ошибку сегментации выдавало :mad:
Там же надо все опции сбрасывать и ставить по новому я использовал curl_easy_reset() вот после этого и вываливается ошибка!

ЕгоАкк
06.01.2010, 15:35
Я побывал с одним мне постоянно ошибку сегментации выдавало :mad:
Там же надо все опции сбрасывать и ставить по новому я использовал curl_easy_reset() вот после этого и вываливается ошибка!
Не нужно опции сбрасывать, достаточно просто делать новый curl_easy_setopt того что нужно поменять в запросе. Переключение между гет и пост запросом: CURLOPT_HTTPGET и CURLOPT_POST

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

Akum
06.01.2010, 16:10
Не могли бы вы привести пример как скачать файл через libcurl ?

Akum
06.01.2010, 17:44
Не могли бы вы привести пример как скачать файл через libcurl ?
Спасибо разобрался! :D