Увеличить ASIO HTTPS POST запрос многопоточный
Я пытаюсь получить поддержку ASIO библиотеки для отправки сообщения, но через некоторое время запрос не поступает на сервер.
Я получаю ошибку context: unable to load ssl2 md5 routines
Следующий код выполняется параллельно в многопоточном приложении для отправки запроса HTTPS:
HTTPSClient::HTTPSClient(URL url) :
url(url),
multipartBoundary(""),
multipartCount(0),
contentSize(0),
ctx(io_service, boost::asio::ssl::context::sslv23_client),
ssocket(io_service, ctx)
{
requestStream = NULL;
bodyStream = NULL;
}
void HTTPSClient::Init(std::string methodType) {
//ctx.set_default_verify_paths();
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(url.host, url.type);
boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
boost::asio::connect(ssocket.lowest_layer(), endpoint_iterator);
ssocket.handshake(boost::asio::ssl::stream_base::client);
requestStream = new std::ostream(&request);
bodyStream = new std::ostringstream();
*requestStream << methodType << " " << url.urlPath << " HTTP/1.1\r\n";
*requestStream << "Host: " << url.host << "\r\n";
*requestStream << "Accept: */*\r\n";
*requestStream << "Connection: close\r\n";
}
void HTTPSClient::AddContent(std::string data) {
*bodyStream << "\r\n" << data;
}
void HTTPSClient::SentRequest() {
boost::asio::write(ssocket, request);
}
std::string HTTPSClient::GetResponse() {
std::string responseStr("");
boost::asio::read_until(ssocket, response, "\r\n");
std::istream response_stream(&response);
std::string http_version;
response_stream >> http_version;
response_stream >> status_code;
std::string status_message;
std::getline(response_stream, status_message);
if (!response_stream || http_version.substr(0, 5) != "HTTP/") {
responseStr = "Invalid response\n";
return responseStr;
}
if (status_code != 200) {
std::cout << "Response returned with status code " << status_code;
}
// Read the response headers, which are terminated by a blank line.
boost::asio::read_until(ssocket, response, "\r\n\r\n");
// Process the response headers.
std::string header, temp;
while (std::getline(response_stream, temp) && temp != "\r") {
header += temp;
}
// Read until EOF, writing data to output as we go.
boost::system::error_code error;
while (boost::asio::read(ssocket, response,
boost::asio::transfer_at_least(1), error)) {
std::string data((std::istreambuf_iterator<char>(&response)), std::istreambuf_iterator<char>());
responseStr.append(data);
}
if (error != boost::asio::error::eof) {
LOG_ERROR << url.type << ": error != boost::asio::error::eof " << error << error.message();
throw boost::system::system_error(error);
}
return responseStr;
}
Я пробовал ссылку https://sourceforge.net/p/asio/mailman/message/18887284/, но это тоже не помогает.
Кроме того, я хотел бы знать, могу ли я использовать тот же boost::asio::io_service io_service;
а также boost::asio::ssl::context ctx;
для всех клиентских запросов, работающих в параллельных потоках. Хост, на который вносятся изменения, в моем случае.