[C++] Bestand binnenhalen met curl - dubbele line endings?

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • ikt
  • Registratie: Juli 2008
  • Laatst online: 13:53
Hoi.

Ik probeer een json bestand binnen te hengelen in een C++ programma met curl, maar bij het downloaden zijn de line endings van "\r\n" naar "\r\r\n" veranderd.

Wanneer ik dit handmatig via dezelfde URL binnenhaal met standalone curl of een browser, zijn de line endings wel netjes "\r\n".

Ik heb werkelijk waar geen idee waardoor dit wordt veroorzaakt. Zo moeilijk is het binnenhalen van 1 rotbestand toch niet?

Links: Gedownload met de code.
Rechts: Gedownload met standalone curl.

Afbeeldingslocatie: https://tweakers.net/i/-A6Cw5PfWo-Vr4klCuGdpTJjkdY=/800x/filters:strip_exif()/f/image/xu0sncXvnlQQpphw6KOM1EJJ.png?f=fotoalbum_large

Code:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <curl/curl.h>

#include <fstream>
#include <string>
#include <cstdio>

#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "GDI32.LIB")
#pragma comment(lib, "ADVAPI32.LIB")
#pragma comment(lib, "CRYPT32.LIB")
#pragma comment(lib, "USER32.LIB")
#pragma comment(lib, "Wldap32.Lib")
#pragma comment(lib, "Normaliz.lib")

std::size_t WriteCallback(char* data, size_t size, size_t nmemb, std::string* writerData) {
    if (writerData == NULL)
        return 0;
    writerData->append(data, size * nmemb);
    return size * nmemb;
}

std::string GetRemoteText(const std::string& url) {
    CURL* curl = curl_easy_init();

    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

        long httpCode(0);
        std::string httpData;

        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &httpData);

        curl_easy_perform(curl);
        curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpCode);
        curl_easy_cleanup(curl);

        if (httpCode == 200) {
            printf("[Flags] Successfully got json file\n");
            return httpData;
        }
        else {
            printf("[Flags] Failed to get json file, HTTP: {}\n", httpCode);
        }
    }

    return {};
}

int main() {
    std::string output = GetRemoteText("https://raw.githubusercontent.com/E66666666/GTAVHandlingInfo/master/flags.json");

    std::ofstream out("flags.json");
    out << output;
    out.close();
}


curl lib gebouwd met deze settings:
code:
1
2
3
4
5
6
7
curl 7.63.0
Windows\VC15
Build platform: v142
SDK: 10.0 (Latest)
LIB Release - DLL Windows SSPI - DLL WinIDN
64-bit
Properties/C++/Code Generation/Runtime Library: Multi-threaded (/MT)


Iemand een idee hoe dit in hemelsnaam gebeurt en kan worden opgelost?

Beste antwoord (via ikt op 15-05-2021 23:29)


  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Ik ben absoluut geen C++ kenner, maar waarschijnlijk maakt je output stream er een windows textfile van. Die zet \n om naar \r\n, vandaar dan de dubbele \r
Heb je een mogelijkheid om hem als binary te laten schrijven?
Ik gok zoiets afgaande op een willekeurige zoekactie
ofstream myFile ("data.json", ios::out | ios::binary);

Of CURLOPT_TRANSFERTEXT (ftp ASCII file transfer) ook met http(s) werkt, weet ik niet. Anders zou je dat kunnen proberen

500 "The server made a boo boo"

Alle reacties


Acties:
  • +1 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
En speel eens met CURLOPT_TRANSFERTEXT?
https://curl.se/libcurl/c/CURLOPT_TRANSFERTEXT.html

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Acties:
  • 0 Henk 'm!

  • ikt
  • Registratie: Juli 2008
  • Laatst online: 13:53
Helaas, dat is 'm niet.

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Ik ben absoluut geen C++ kenner, maar waarschijnlijk maakt je output stream er een windows textfile van. Die zet \n om naar \r\n, vandaar dan de dubbele \r
Heb je een mogelijkheid om hem als binary te laten schrijven?
Ik gok zoiets afgaande op een willekeurige zoekactie
ofstream myFile ("data.json", ios::out | ios::binary);

Of CURLOPT_TRANSFERTEXT (ftp ASCII file transfer) ook met http(s) werkt, weet ik niet. Anders zou je dat kunnen proberen

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • ikt
  • Registratie: Juli 2008
  • Laatst online: 13:53
Woah, super bedankt! Dat blijkt het inderdaad te zijn.

Nooit gedacht dat fstream zulke fratsen uithaalt, maar daar zijn uiteraard die flags voor.