Ένας διαμεσολαβητής μπορεί να ανακτήσει HTML με επιτυχία και παρόλα αυτά να καταστρέψει μια εικόνα κατά την αντιγραφή της σε buffer της C++. Πριν αλλάξετε το πρωτόκολλο του διαμεσολαβητή, ελέγξτε την επιστροφή κλήσης λήψης και το αντικείμενο που περνάτε ως περιβάλλον της.

CURLOPT_WRITEDATA παρέχει δείκτη στην επιστροφή κλήσης εγγραφής. Χωρίς προσαρμοσμένη επιστροφή κλήσης, ο προεπιλεγμένος συγγραφέας του libcurl περιμένει ένα FILE *. Μια διεύθυνση όπως &response, όπου το response είναι std::string, έχει νόημα μόνο όταν η επιστροφή κλήσης σας μετατρέπει αυτό το περιβάλλον πίσω στον προβλεπόμενο τύπο.

static size_t receive(char* data, size_t size,
                      size_t count, void* context) {
    const size_t bytes = size * count;
    auto* body = static_cast<std::string*>(context);
    try {
        body->append(data, bytes);
    } catch (...) {
        return 0;
    }
    return bytes;
}

Καταχωρίστε και τα δύο μέρη στη λαβή που χρησιμοποιείται για τη μεταφορά:

std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);

Η κλήση append χρησιμοποιεί τον αριθμό byte που παραδόθηκε. Τα δεδομένα της επιστροφής κλήσης δεν τερματίζονται με μηδέν και μια εικόνα μπορεί να περιέχει μηδενικά byte· η μέτρηση με strlen θα έχανε μέρος του σώματος. Μια απάντηση μπορεί επίσης να φτάσει μέσα από πολλές κλήσεις διαφορετικού μεγέθους.

Η επιστροφή του αριθμού byte που καταναλώθηκε δέχεται το τμήμα. Η επιστροφή διαφορετικού αριθμού ακυρώνει τη μεταφορά με σφάλμα εγγραφής. Ο φρουρός εξαιρέσεων εμποδίζει μια αποτυχία δέσμευσης να διαφύγει από το όριο της επιστροφής κλήσης C· ο καλών πρέπει ακόμη να ελέγξει το αποτέλεσμα της μεταφοράς πριν θεωρήσει το response πλήρες αρχείο.

Κρατήστε το string ζωντανό μέχρι να ολοκληρωθεί η μεταφορά. Αν μια ασύγχρονη εγγραφή υποδοχής προωθήσει στη συνέχεια το περιεχόμενό του, κρατήστε αυτά τα byte ζωντανά μέχρι να ολοκληρωθεί και εκείνη η εγγραφή. Για μεγάλες απαντήσεις, μια περιορισμένη διάταξη ροής είναι προτιμότερη από τη συσσώρευση ολόκληρου του σώματος.

Σχετικά άρθρα