Một proxy có thể lấy HTML thành công mà vẫn làm hỏng ảnh khi sao chép nó vào bộ đệm C++. Trước khi thay đổi giao thức proxy, hãy kiểm tra callback nhận và đối tượng được truyền làm ngữ cảnh của nó.

CURLOPT_WRITEDATA cung cấp con trỏ tới callback ghi. Không có callback tùy chỉnh, trình ghi mặc định của libcurl mong đợi một FILE *. Một địa chỉ như &response, trong đó response là một std::string, chỉ có nghĩa khi callback của bạn chuyển ngữ cảnh đó trở lại kiểu dự định.

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;
}

Đăng ký cả hai phần trên handle đơn giản được dùng cho việc truyền:

std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);

Lời gọi append sử dụng số byte được cung cấp. Dữ liệu callback không được kết thúc bằng null và ảnh có thể chứa byte không; đo nó bằng strlen sẽ làm mất một phần thân. Một phản hồi cũng có thể đến qua nhiều lời gọi callback có kích thước khác nhau.

Trả lại số byte đã dùng sẽ chấp nhận đoạn đó. Trả lại số khác sẽ hủy bỏ việc truyền với lỗi ghi. Bộ bảo vệ ngoại lệ ngăn lỗi cấp phát bộ nhớ thoát ra qua ranh giới callback C; người gọi vẫn phải kiểm tra kết quả truyền trước khi coi response là tệp hoàn chỉnh.

Giữ chuỗi còn sống cho đến khi quá trình truyền kết thúc. Nếu một thao tác ghi socket không đồng bộ sau đó chuyển tiếp nội dung của nó, hãy giữ những byte đó còn sống cho đến khi thao tác ghi đó cũng hoàn tất. Với các phản hồi lớn, một bố cục truyền trực tuyến có giới hạn tốt hơn việc tích lũy toàn bộ thân.

Bài viết liên quan