የሁለትዮሽ libcurl ምላሾችን ወደ C++ std::string መቀበል
std::string ን እንደ callback context ያስተላልፉ እና ሁለትዮሽ ውሂብን በ libcurl ሲቀበሉ ግልጽ የባይት ቆጠራዎችን ያክሉ።
ፕሮክሲ ኤችቲኤምኤልን በተሳካ ሁኔታ ማምጣት ይችላል እና ምስልን ወደ 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 ውሂብ በዜሮ አይጨርስም፣ ምስልም ዜሮ ባይቶችን ሊይዝ ይችላል፤ በ strlen መለካት የአካሉን ክፍል ያጣል። ምላሽ በተለያየ መጠን በብዙ callback ጥሪዎች ሊመጣም ይችላል።
የተበላውን የባይት ቆጠራ መመለስ ቁራጩን ይቀበላል። የተለየ ቆጠራ መመለስ ዝውውሩን በጽሑፍ ስህተት ያቋርጣል። የልዩ ሁኔታ ጠባቂ የማስታወሻ ውድቀት ከ C callback ወሰን እንዳይወጣ ይጠብቃል፤ ተጠሪው ምላሹን እንደ ሙሉ ፋይል ከመቁጠሩ በፊት የዝውውሩን ውጤት ማረጋገጥ አለበት።
ሕብረቁምፊው ዝውውሩ እስኪጠናቀቅ ድረስ ሕያው ይሁን። ያልተመሳሰለ የሶኬት ጽሑፍ ይዘቱን ካስተላለፈ እነዚያ ባይቶች ጽሑፉም እስኪጠናቀቅ ድረስ ሕያው ይሁኑ። ለትልቅ ምላሾች አጠቃላይ አካሉን ከማከማቸት ይልቅ የተገደበ የመልቀቂያ አደረጃጀት ይመረጣል።