libcurl का बाइनरी प्रतिक्रियाहरू C++ std::string मा प्राप्त गर्नुहोस्
callback context को रूपमा std::string पठाउनुहोस् र libcurl सँग बाइनरी डेटा प्राप्त गर्दा स्पष्ट बाइट गणना थप्नुहोस्।
प्रोक्सीले HTML सफलतापूर्वक ल्याउन सक्छ र त्यसपछि पनि C++ बफरमा प्रतिलिपि गर्दा छवि बिगार्न सक्छ। प्रोक्सी प्रोटोकल परिवर्तन गर्नु अघि, रिसिभ callback र यसको context को रूपमा पठाइएको वस्तु जाँच्नुहोस्।
CURLOPT_WRITEDATA राइट callback मा सूचक प्रदान गर्दछ। अनुकूलन callback बिना, libcurl को पूर्वनिर्धारित लेखकले FILE * अपेक्षा गर्दछ। &response जस्तो ठेगाना, जहाँ response std::string हो, तब मात्र अर्थपूर्ण हुन्छ जब तपाईंको callback ले त्यो context लाई इच्छित प्रकारमा फर्काउँछ।
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 कलले दिइएको बाइट गणना प्रयोग गर्दछ। callback डेटा null-terminated हुँदैन र छविमा शून्य बाइटहरू हुन सक्छन्; strlen ले नाप्दा शरीरको केही भाग गुमाउनेछ। प्रतिक्रिया विभिन्न आकारका धेरै callback कलहरू मार्फत पनि आउन सक्छ।
उपभोग गरिएको बाइट गणना फर्काउँदा टुक्रा स्वीकारिन्छ। फरक गणना फर्काउँदा लेखन त्रुटिसँग स्थानान्तरण रद्द हुन्छ। अपवाद रक्षकले आवंटन असफलतालाई C callback सीमाबाट बाहिर जानबाट रोक्छ; कलरले response लाई पूर्ण फाइल मान्नु अघि स्थानान्तरण परिणाम जाँच्नुपर्छ।
स्थानान्तरण समाप्त नहुँदासम्म स्ट्रिङलाई जीवित राख्नुहोस्। यदि अतुल्यकालिक सकेट लेखनले त्यसपछि यसको सामग्री अगाडि पठाउँछ भने, त्यो लेखन पनि पूरा नहुँदासम्म ती बाइटहरूलाई जीवित राख्नुहोस्। ठूला प्रतिक्रियाहरूका लागि, सम्पूर्ण शरीर जम्मा गर्नुभन्दा सीमित स्ट्रिमिङ व्यवस्था राम्रो हुन्छ।