프록시는 HTML을 성공적으로 가져오면서도 이미지를 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 호출은 전달된 바이트 수를 사용합니다. 콜백 데이터는 널 종료되지 않으며 이미지에는 0 바이트가 포함될 수 있습니다. strlen으로 측정하면 본문의 일부를 잃습니다. 응답은 크기가 다른 여러 콜백 호출을 통해 도착할 수도 있습니다.

사용한 바이트 수를 반환하면 해당 청크가 승인됩니다. 다른 수를 반환하면 쓰기 오류로 전송이 중단됩니다. 예외 가드는 할당 실패가 C 콜백 경계를 넘어 빠져나가지 않게 합니다. 호출자는 response를 완전한 파일로 취급하기 전에 여전히 전송 결과를 확인해야 합니다.

전송이 끝날 때까지 문자열을 살려 두세요. 비동기 소켓 쓰기가 그 내용을 전달하면 그 쓰기도 끝날 때까지 해당 바이트를 살려 두세요. 큰 응답의 경우 본문 전체를 쌓는 것보다 제한된 스트리밍 구성이 더 낫습니다.

관련 글