unique_ptr Get() => Extract() || Send() || ExtractOrCreate() (#1984)

This commit is contained in:
Anton Kolesnyk 2021-03-30 17:17:24 +00:00 committed by GitHub
parent b9c5c978ee
commit 0665efe0fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 42 additions and 27 deletions

View File

@ -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)

View File

@ -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);

View File

@ -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)

View File

@ -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);

View File

@ -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.

View File

@ -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.

View File

@ -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();

View File

@ -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()));

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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");

View File

@ -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);