• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Biblioteka CURL C++, pobieranie plików z Github

Object Storage Arubacloud
0 głosów
134 wizyt
pytanie zadane 11 maja 2023 w C i C++ przez piotr_domanski Bywalec (2,080 p.)

Witam,

Mam następujący problem. Piszę taki system pluginów a także sklep z dodatkami do mojego programu. Na Githubie stworzyłem repozytorium z jakimiś bibliotekami.

Link: Github

Mam kod w C++, chce pobrać plik libmysql.lib. Po wklejeniu URL z kodu do przeglądarki plik się pobiera, więc URL jest poprawny.

#include <curl/curl.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

size_t write_data(void* ptr, size_t size, size_t nmemb, FILE* stream)
{
    size_t written = fwrite(ptr, size, nmemb, stream);
    return written;
}

int main()
{
    CURL* curl;
    FILE* fp;
    CURLcode res;
    string url = "https://github.com/CTSoftwareOriginal/filesMathTool/raw/main/libmysql.dll";
    string outfilename = "libmysql.dll";
    curl = curl_easy_init();
    if (curl)
    {
        fp = fopen(outfilename.c_str(), "wb");
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        res = curl_easy_perform(curl);
        if(res != CURLE_OK) // Sprawdzamy, czy wystąpił błąd
        {
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); // Wyświetlamy informacje o błędzie
        }
        curl_easy_cleanup(curl);
        fclose(fp);
    }
    return 0;
}

I teraz jest komunikat z konsoli:

curl_easy_perform() failed: SSL peer certificate or SSH remote key was not OK

Dobra, wyłączyłem certyfikacje:

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); // wyłączamy weryfikację certyfikatu serwera SSL/TLS

I teraz nie czepia się:  

Process returned 0 (0x0)   execution time : 0.561 s
Press any key to continue.

 

Ale plik pobrany waży 0B i jest pusty:

Plik po pobraniu po wklejeniu linku:  https://github.com/CTSoftwareOriginal/filesMathTool/raw/main/libmysql.dll    do przeglądarki:

 

Co jest nie tak. Czy ktoś może doradzić. Próbowałem generować token API z GitHuba ale nie zadziałało. Może coś źle robię?. Jak ktoś się zna na tym to proszę o pomoc.

Z góry dzięki  :)

 

1 odpowiedź

0 głosów
odpowiedź 11 maja 2023 przez adrian17 Ekspert (344,860 p.)

Nie mam pojęcia czemu masz problem z certyfikatami (ja nie mam), ale ogólnie: spójrz na zwracany kod odpowiedzi.

long http_code = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
std::cout << http_code << "\n";

Dostaniesz 302 - przekierowanie.

Powiedz curlowi żeby podążał za przekierowaniami (CURLOPT_FOLLOWLOCATION) i powinno zadziałać.

BTW, rozważ też użycie jakiejś bardziej wysokopoziomowej biblioteki zamiast bezpośrednio curla. Z https://github.com/libcpr/cpr to byłoby po prostu `cpr::Download(of, cpr::Url{"https://jakis_url"});`

komentarz 11 maja 2023 przez piotr_domanski Bywalec (2,080 p.)
dzięki za bibliotekę. Sprawdzałeś czy plik nie jest pusty? Bo mi też pokazuje że plik jest tylko że jest pusty.
komentarz 11 maja 2023 przez adrian17 Ekspert (344,860 p.)
U mnie ma 1.5MB.
komentarz 11 maja 2023 przez piotr_domanski Bywalec (2,080 p.)

a to z tym kodem co ja wysłałem

O z tym działa:

#include <curl/curl.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

size_t write_data(void* ptr, size_t size, size_t nmemb, FILE* stream)
{
    size_t written = fwrite(ptr, size, nmemb, stream);
    return written;
}

int main()
{
    CURL* curl;
    FILE* fp;
    CURLcode res;
    string url = "https://github.com/CTSoftwareOriginal/filesMathTool/raw/main/libmysql.dll";
    string outfilename = "libmysql.dll";
    curl = curl_easy_init();
    if (curl)
    {
        fp = fopen(outfilename.c_str(), "wb");
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); // wyłączamy weryfikację certyfikatu serwera SSL/TLS

        res = curl_easy_perform(curl);
        if(res != CURLE_OK) // Sprawdzamy, czy wystąpił błąd
        {
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); // Wyświetlamy informacje o błędzie
        }
        curl_easy_cleanup(curl);
        fclose(fp);
    }
    return 0;
}

 

komentarz 12 maja 2023 przez piotr_domanski Bywalec (2,080 p.)
Mi dalej nie działa z tym podążaniem

Podobne pytania

0 głosów
0 odpowiedzi 217 wizyt
pytanie zadane 4 maja 2023 w C i C++ przez mark162 Początkujący (410 p.)
0 głosów
1 odpowiedź 469 wizyt
pytanie zadane 17 lutego 2018 w C i C++ przez Cyprianx10 Nowicjusz (140 p.)
0 głosów
1 odpowiedź 585 wizyt
pytanie zadane 8 lutego 2018 w Systemy operacyjne, programy przez mix091 Nowicjusz (210 p.)

92,573 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...