unique_ptr Get() => Extract() || Send() || ExtractOrCreate() (#1984)
This commit is contained in:
parent
b9c5c978ee
commit
0665efe0fe
@ -2,6 +2,9 @@
|
||||
|
||||
## 1.0.0-beta.8 (Unreleased)
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Renamed `Azure::Core::Http::RawResponse::GetBodyStream()` to `ExtractBodyStream()`.
|
||||
|
||||
## 1.0.0-beta.7 (2021-03-11)
|
||||
|
||||
|
||||
@ -511,7 +511,7 @@ namespace Azure { namespace Core { namespace Http {
|
||||
/**
|
||||
* @brief Get HTTP response body as #Azure::Core::IO::BodyStream.
|
||||
*/
|
||||
std::unique_ptr<Azure::Core::IO::BodyStream> GetBodyStream()
|
||||
std::unique_ptr<Azure::Core::IO::BodyStream> ExtractBodyStream()
|
||||
{
|
||||
// If m_bodyStream was moved before. nullptr is returned
|
||||
return std::move(this->m_bodyStream);
|
||||
|
||||
@ -161,7 +161,10 @@ std::unique_ptr<RawResponse> CurlTransport::Send(Request& request, Context const
|
||||
Log::Write(Logger::Level::Verbose, LogMsgPrefix + "Creating a new session.");
|
||||
|
||||
auto session = std::make_unique<CurlSession>(
|
||||
request, CurlConnectionPool::GetCurlConnection(request, m_options), m_options.HttpKeepAlive);
|
||||
request,
|
||||
CurlConnectionPool::ExtractOrCreateCurlConnection(request, m_options),
|
||||
m_options.HttpKeepAlive);
|
||||
|
||||
CURLcode performing;
|
||||
|
||||
// Try to send the request. If we get CURLE_UNSUPPORTED_PROTOCOL/CURLE_SEND_ERROR back, it means
|
||||
@ -184,7 +187,7 @@ std::unique_ptr<RawResponse> CurlTransport::Send(Request& request, Context const
|
||||
// won't be no longer valid.
|
||||
session = std::make_unique<CurlSession>(
|
||||
request,
|
||||
CurlConnectionPool::GetCurlConnection(
|
||||
CurlConnectionPool::ExtractOrCreateCurlConnection(
|
||||
request,
|
||||
m_options,
|
||||
getConnectionOpenIntent + 1 >= _detail::RequestPoolResetAfterConnectionFailed),
|
||||
@ -202,7 +205,7 @@ std::unique_ptr<RawResponse> CurlTransport::Send(Request& request, Context const
|
||||
LogMsgPrefix + "Request completed. Moving response out of session and session to response.");
|
||||
|
||||
// Move Response out of the session
|
||||
auto response = session->GetResponse();
|
||||
auto response = session->ExtractResponse();
|
||||
// Move the ownership of the CurlSession (bodyStream) to the response
|
||||
response->SetBodyStream(std::move(session));
|
||||
return response;
|
||||
@ -573,7 +576,7 @@ void CurlSession::ReadStatusLineAndHeadersFromRawResponse(
|
||||
}
|
||||
}
|
||||
|
||||
this->m_response = parser.GetResponse();
|
||||
this->m_response = parser.ExtractResponse();
|
||||
this->m_innerBufferSize = static_cast<size_t>(bufferSize);
|
||||
this->m_lastStatusCode = this->m_response->GetStatusCode();
|
||||
|
||||
@ -818,7 +821,7 @@ int64_t CurlConnection::ReadFromSocket(uint8_t* buffer, int64_t bufferSize, Cont
|
||||
return readBytes;
|
||||
}
|
||||
|
||||
std::unique_ptr<RawResponse> CurlSession::GetResponse() { return std::move(this->m_response); }
|
||||
std::unique_ptr<RawResponse> CurlSession::ExtractResponse() { return std::move(this->m_response); }
|
||||
|
||||
int64_t CurlSession::ResponseBufferParser::Parse(
|
||||
uint8_t const* const buffer,
|
||||
@ -1113,7 +1116,7 @@ inline std::string GetConnectionKey(std::string const& host, CurlTransportOption
|
||||
}
|
||||
} // namespace
|
||||
|
||||
std::unique_ptr<CurlNetworkConnection> CurlConnectionPool::GetCurlConnection(
|
||||
std::unique_ptr<CurlNetworkConnection> CurlConnectionPool::ExtractOrCreateCurlConnection(
|
||||
Request& request,
|
||||
CurlTransportOptions const& options,
|
||||
bool resetPool)
|
||||
|
||||
@ -71,7 +71,7 @@ namespace Azure { namespace Core { namespace Http {
|
||||
*
|
||||
* @return #Azure::Core::Http::CurlNetworkConnection to use.
|
||||
*/
|
||||
static std::unique_ptr<CurlNetworkConnection> GetCurlConnection(
|
||||
static std::unique_ptr<CurlNetworkConnection> ExtractOrCreateCurlConnection(
|
||||
Request& request,
|
||||
CurlTransportOptions const& options,
|
||||
bool resetPool = false);
|
||||
|
||||
@ -198,7 +198,7 @@ namespace Azure { namespace Core { namespace Http {
|
||||
* @return Will move the response only if parsing is completed and if the HTTP RawResponse
|
||||
* was not moved before.
|
||||
*/
|
||||
std::unique_ptr<RawResponse> GetResponse()
|
||||
std::unique_ptr<RawResponse> ExtractResponse()
|
||||
{
|
||||
if (m_parseCompleted && m_response != nullptr)
|
||||
{
|
||||
@ -404,7 +404,7 @@ namespace Azure { namespace Core { namespace Http {
|
||||
* @return the unique ptr to the HTTP RawResponse or null if the HTTP RawResponse is not yet
|
||||
* created or was moved before.
|
||||
*/
|
||||
std::unique_ptr<Azure::Core::Http::RawResponse> GetResponse();
|
||||
std::unique_ptr<Azure::Core::Http::RawResponse> ExtractResponse();
|
||||
|
||||
/**
|
||||
* @brief Implement #Azure::Core::IO::BodyStream length.
|
||||
|
||||
@ -57,7 +57,7 @@ std::unique_ptr<RawResponse> TransportPolicy::Send(
|
||||
// If ReadToEnd fail, retry policy will eventually call this again
|
||||
// Using DownloadViaStream and getting an error code would also get to here to download error from
|
||||
// body
|
||||
auto bodyStream = response->GetBodyStream();
|
||||
auto bodyStream = response->ExtractBodyStream();
|
||||
response->SetBody(bodyStream->ReadToEnd(ctx));
|
||||
// BodyStream is moved out of response. This makes transport implementation to clean any active
|
||||
// session with sockets or internal state.
|
||||
|
||||
@ -42,7 +42,9 @@ namespace Azure { namespace Core { namespace Test {
|
||||
{
|
||||
// Creating a new connection with default options
|
||||
Azure::Core::Http::CurlTransportOptions options;
|
||||
auto connection = Azure::Core::Http::CurlConnectionPool::GetCurlConnection(req, options);
|
||||
auto connection
|
||||
= Azure::Core::Http::CurlConnectionPool::ExtractOrCreateCurlConnection(req, options);
|
||||
|
||||
EXPECT_EQ(connection->GetConnectionKey(), expectedConnectionKey);
|
||||
|
||||
auto session = std::make_unique<Azure::Core::Http::CurlSession>(
|
||||
@ -62,7 +64,9 @@ namespace Azure { namespace Core { namespace Test {
|
||||
{
|
||||
// Creating a new connection with default options
|
||||
Azure::Core::Http::CurlTransportOptions options;
|
||||
auto connection = Azure::Core::Http::CurlConnectionPool::GetCurlConnection(req, options);
|
||||
auto connection
|
||||
= Azure::Core::Http::CurlConnectionPool::ExtractOrCreateCurlConnection(req, options);
|
||||
|
||||
// There was just one connection in the pool, it should be empty now
|
||||
EXPECT_EQ(Azure::Core::Http::CurlConnectionPool::ConnectionPoolIndex.size(), 0);
|
||||
// And the connection key for the connection we got is the expected
|
||||
@ -87,7 +91,9 @@ namespace Azure { namespace Core { namespace Test {
|
||||
// Creating a new connection with default options
|
||||
Azure::Core::Http::CurlTransportOptions options;
|
||||
options.CAInfo = CAinfo;
|
||||
auto connection = Azure::Core::Http::CurlConnectionPool::GetCurlConnection(req, options);
|
||||
auto connection
|
||||
= Azure::Core::Http::CurlConnectionPool::ExtractOrCreateCurlConnection(req, options);
|
||||
|
||||
EXPECT_EQ(connection->GetConnectionKey(), secondExpectedKey);
|
||||
// One connection still in the pool after getting a new connection and with first expected
|
||||
// key
|
||||
@ -120,7 +126,9 @@ namespace Azure { namespace Core { namespace Test {
|
||||
// Creating a new connection with default options
|
||||
Azure::Core::Http::CurlTransportOptions options;
|
||||
options.CAInfo = CAinfo;
|
||||
auto connection = Azure::Core::Http::CurlConnectionPool::GetCurlConnection(req, options);
|
||||
auto connection
|
||||
= Azure::Core::Http::CurlConnectionPool::ExtractOrCreateCurlConnection(req, options);
|
||||
|
||||
EXPECT_EQ(connection->GetConnectionKey(), secondExpectedKey);
|
||||
// One connection still in the pool after getting a new connection and with first expected
|
||||
// key
|
||||
@ -178,7 +186,8 @@ namespace Azure { namespace Core { namespace Test {
|
||||
Azure::Core::Http::HttpMethod::Get, Azure::Core::Url("http://httpbin.org/get"));
|
||||
|
||||
Azure::Core::Http::CurlTransportOptions options;
|
||||
auto connection = Azure::Core::Http::CurlConnectionPool::GetCurlConnection(req, options);
|
||||
auto connection
|
||||
= Azure::Core::Http::CurlConnectionPool::ExtractOrCreateCurlConnection(req, options);
|
||||
// Simulate connection lost (like server disconnection).
|
||||
connection->Shutdown();
|
||||
|
||||
|
||||
@ -117,9 +117,9 @@ namespace Azure { namespace Core { namespace Test {
|
||||
request, std::move(uniqueCurlMock), true);
|
||||
|
||||
EXPECT_NO_THROW(session->Perform(Azure::Core::Context::GetApplicationContext()));
|
||||
auto r = session->GetResponse();
|
||||
auto r = session->ExtractResponse();
|
||||
r->SetBodyStream(std::move(session));
|
||||
auto bodyS = r->GetBodyStream();
|
||||
auto bodyS = r->ExtractBodyStream();
|
||||
|
||||
// Read the bodyStream to get all chunks
|
||||
EXPECT_THROW(
|
||||
@ -194,9 +194,9 @@ namespace Azure { namespace Core { namespace Test {
|
||||
request, std::move(uniqueCurlMock), true);
|
||||
|
||||
EXPECT_NO_THROW(session->Perform(Azure::Core::Context::GetApplicationContext()));
|
||||
auto response = session->GetResponse();
|
||||
auto response = session->ExtractResponse();
|
||||
response->SetBodyStream(std::move(session));
|
||||
auto bodyS = response->GetBodyStream();
|
||||
auto bodyS = response->ExtractBodyStream();
|
||||
|
||||
// Read the bodyStream to get all chunks
|
||||
EXPECT_NO_THROW(bodyS->ReadToEnd(Azure::Core::Context::GetApplicationContext()));
|
||||
|
||||
@ -531,7 +531,7 @@ namespace Azure { namespace Core { namespace Test {
|
||||
int64_t size,
|
||||
std::string expectedBody)
|
||||
{
|
||||
auto body = response.GetBodyStream();
|
||||
auto body = response.ExtractBodyStream();
|
||||
EXPECT_EQ(body, nullptr);
|
||||
std::vector<uint8_t> bodyVector = response.GetBody();
|
||||
int64_t bodySize = bodyVector.size();
|
||||
@ -553,7 +553,7 @@ namespace Azure { namespace Core { namespace Test {
|
||||
int64_t size,
|
||||
std::string expectedBody)
|
||||
{
|
||||
auto body = response.GetBodyStream();
|
||||
auto body = response.ExtractBodyStream();
|
||||
EXPECT_NE(body, nullptr);
|
||||
|
||||
std::vector<uint8_t> bodyVector
|
||||
|
||||
@ -141,7 +141,7 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Common { n
|
||||
* @param path The path for the request.
|
||||
* @return A unique ptr to an Http raw response.
|
||||
*/
|
||||
std::unique_ptr<Azure::Core::Http::RawResponse> GetResponse(
|
||||
std::unique_ptr<Azure::Core::Http::RawResponse> Send(
|
||||
Azure::Core::Context const& context,
|
||||
Azure::Core::Http::HttpMethod method,
|
||||
std::vector<std::string> const& path)
|
||||
|
||||
@ -33,7 +33,7 @@ Azure::Security::KeyVault::Keys::DeleteKeyOperation::PollInternal(Azure::Core::C
|
||||
std::unique_ptr<Azure::Core::Http::RawResponse> rawResponse;
|
||||
if (!IsDone())
|
||||
{
|
||||
rawResponse = m_pipeline->GetResponse(
|
||||
rawResponse = m_pipeline->Send(
|
||||
context, Azure::Core::Http::HttpMethod::Get, {_detail::DeletedKeysPath, m_value.Name()});
|
||||
m_status = CheckCompleted(*rawResponse);
|
||||
if (m_status == Azure::Core::OperationStatus::Succeeded)
|
||||
|
||||
@ -4747,7 +4747,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
throw StorageException::CreateFromResponse(std::move(pHttpResponse));
|
||||
}
|
||||
response.BodyStream = httpResponse.GetBodyStream();
|
||||
response.BodyStream = httpResponse.ExtractBodyStream();
|
||||
{
|
||||
const auto& headers = httpResponse.GetHeaders();
|
||||
auto content_md5_iterator = headers.find("content-md5");
|
||||
|
||||
@ -5984,7 +5984,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
|
||||
{
|
||||
// Succeeded to read the entire file.
|
||||
FileDownloadResult result;
|
||||
result.BodyStream = response.GetBodyStream();
|
||||
result.BodyStream = response.ExtractBodyStream();
|
||||
result.LastModified = DateTime::Parse(
|
||||
response.GetHeaders().at(_detail::HeaderLastModified),
|
||||
DateTime::DateFormat::Rfc1123);
|
||||
@ -6141,7 +6141,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
|
||||
{
|
||||
// Succeeded to read a specified range of the file.
|
||||
FileDownloadResult result;
|
||||
result.BodyStream = response.GetBodyStream();
|
||||
result.BodyStream = response.ExtractBodyStream();
|
||||
result.LastModified = DateTime::Parse(
|
||||
response.GetHeaders().at(_detail::HeaderLastModified),
|
||||
DateTime::DateFormat::Rfc1123);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user