ଏକ ପ୍ରକ୍ସି 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 କୁ ସମ୍ପୂର୍ଣ୍ଣ ଫାଇଲ୍ ଭାବରେ ଗ୍ରହଣ କରିବା ପୂର୍ବରୁ ସ୍ଥାନାନ୍ତର ଫଳାଫଳ ଯାଞ୍ଚ କରିବା ଉଚିତ।

ସ୍ଥାନାନ୍ତର ସମାପ୍ତ ନହେବା ପର୍ଯ୍ୟନ୍ତ ଷ୍ଟ୍ରିଙ୍ଗକୁ ଜୀବିତ ରଖନ୍ତୁ। ଯଦି ଏକ ଅସିଙ୍କ୍ରୋନସ୍ ସକେଟ୍ ଲେଖା ପରେ ଏହାର ବିଷୟବସ୍ତୁ ଆଗକୁ ପଠାଏ, ସେହି ଲେଖା ମଧ୍ୟ ସମ୍ପୂର୍ଣ୍ଣ ନହେବା ପର୍ଯ୍ୟନ୍ତ ସେହି ବାଇଟ୍ଗୁଡ଼ିକୁ ଜୀବିତ ରଖନ୍ତୁ। ବଡ଼ ପ୍ରତିକ୍ରିୟା ପାଇଁ, ସମଗ୍ର ଶରୀରକୁ ସଂଗ୍ରହ କରିବା ଅପେକ୍ଷା ସୀମିତ ଷ୍ଟ୍ରିମିଂ ବ୍ୟବସ୍ଥା ଭଲ।

ସମ୍ପର୍କିତ ପ୍ରବନ୍ଧ