ବଡି ପ୍ରିଫିକ୍ସ ପରେ PHP cURL ସ୍ଥାନାନ୍ତରଣ ବନ୍ଦ କରନ୍ତୁ
ରାଇଟ୍ କଲବ୍ୟାକ୍ରେ ସୀମିତ ପ୍ରିଫିକ୍ସ ରଖନ୍ତୁ ଏବଂ ସେହି କଲବ୍ୟାକ୍ ଜାଣିଶୁଣି କରୁଥିବା ରାଇଟ୍ ତ୍ରୁଟିକୁ ହିଁ ଚିହ୍ନଟ କରନ୍ତୁ।
cURL ରାଇଟ୍ କଲବ୍ୟାକ୍ ସୀମିତ ବଡି ପ୍ରିଫିକ୍ସ ରଖିପାରେ ଏବଂ ସେହି ସୀମା ପୂର୍ଣ୍ଣ ହେବା ମାତ୍ରେ ସ୍ଥାନାନ୍ତରଣ ବନ୍ଦ କରିପାରେ। ସେହି ଜାଣିଶୁଣି ବନ୍ଦକୁ ଅନ୍ୟ ଏକ ରାଇଟ୍ ବିଫଳତାରୁ ଅଲଗା କରିବାକୁ ନିଜର ଫ୍ଲାଗ୍ ବ୍ୟବହାର କରନ୍ତୁ।
ଯାହାର ଲକ୍ଷ୍ୟ URL ପୂର୍ବରୁ କନଫିଗର ହୋଇସାରିଛି ଏପରି ନୂଆ ହ୍ୟାଣ୍ଡେଲ ପାଇଁ:
$limit = 32768;
$prefix = '';
$limitReached = false;
curl_setopt_array($ch, [
CURLOPT_PROXY => 'socks5h://proxy.example.net:1080',
CURLOPT_HEADER => false,
CURLOPT_WRITEFUNCTION => function ($handle, $chunk)
use (&$prefix, &$limitReached, $limit) {
$remaining = $limit - strlen($prefix);
$prefix .= substr($chunk, 0, $remaining);
if (strlen($prefix) >= $limit) {
$limitReached = true;
return 0;
}
return strlen($chunk);
},
]);
$result = curl_exec($ch);
$error = curl_errno($ch);
$expectedStop = $limitReached && $error === CURLE_WRITE_ERROR;
if ($result === false && !$expectedStop) {
throw new RuntimeException(curl_error($ch), $error);
}
ପ୍ରକ୍ସି URLର socks5h ସ୍କିମ୍ ପ୍ରକ୍ସିକୁ ଲକ୍ଷ୍ୟ ହୋଷ୍ଟନାମ ସମାଧାନ କରିବାକୁ କହେ। ଦେଖାଯାଇଥିବା ନୂଆ ହ୍ୟାଣ୍ଡେଲରେ ଅନୁମତିପ୍ରାପ୍ତ ସାର୍ବଜନୀନ ଲକ୍ଷ୍ୟ ପରୀକ୍ଷା ପାଇଁ SOCKS5 ପ୍ରକ୍ସି ତାଲିକାରୁ ଖାତା ନଥିବା ଏଣ୍ଟ୍ରି ସେହି endpoint ଯୋଗାଇପାରେ। TLS ସାର୍ଟିଫିକେଟ୍ ଯାଞ୍ଚ ଏହାର ସାଧାରଣ ସେଟିଂ ରଖେ।
ଖାଲି ନଥିବା ଚଙ୍କ ପାଇଁ ଶୂନ୍ୟ ଫେରାଇବା libcurlକୁ କୁହେ ଯେ କଲବ୍ୟାକ୍ ଦିଆଯାଇଥିବା ଡାଟା ଗ୍ରହଣ କରିନାହିଁ। ଏହା CURLE_WRITE_ERROR ସହିତ ବନ୍ଦ ହୁଏ। ଏଠାରେ ସେହି ତ୍ରୁଟି ଏବଂ କଲବ୍ୟାକ୍ର limitReached ଫ୍ଲାଗ୍ର ସଂଯୋଗକୁ ହିଁ ଆଶାକରାଯାଉଥିବା ଭାବେ ଗଣନା କରାଯାଏ।
ସୀମାଠାରୁ ଛୋଟ ପ୍ରତିକ୍ରିୟା ସାଧାରଣଭାବେ ଶେଷ ହୁଏ। ସୀମାରେ କିମ୍ବା ତା ଉପରେ prefix ଅଧିକତମ 32 KiB ରଖେ, ଶେଷ କଲବ୍ୟାକ୍ ବଡ଼ ଚଙ୍କ ପାଇଲେ ମଧ୍ୟ। ଚଙ୍କର ଆକାର ବଦଳେ; ମାଗାଯାଇଥିବା ବଫର୍ ଆକାର ସ୍ଥିର ଦୈର୍ଘ୍ୟର କଲର ପ୍ରତିଶ୍ରୁତି ନୁହେଁ।
ଏହା ରଖାଯାଇଥିବା ବଡିକୁ ସୀମିତ କରେ, ସଂଯୋଗରେ ପୂର୍ବରୁ ବଫର୍ ହୋଇଥିବା କିମ୍ବା ସ୍ଥାନାନ୍ତରିତ ପ୍ରତ୍ୟେକ ବାଇଟ୍କୁ ନୁହେଁ। ପ୍ରିଫିକ୍ସ ବହୁ-ବାଇଟ୍ ଅକ୍ଷର, JSON ମୂଲ୍ୟ କିମ୍ବା HTML ଉପାଦାନ ଭିତରେ ଶେଷ ହୋଇପାରେ, ତେଣୁ ଏହା ସମ୍ପୂର୍ଣ୍ଣ ପାର୍ସ ଯୋଗ୍ୟ ଦଲିଲ ବୋଲି ଭାବନ୍ତୁ ନାହିଁ।