Http/download on error (#376)

* Download body on error response codes from request

* Adding test case for downloading body
This commit is contained in:
Victor Vazquez 2020-07-31 22:11:31 -07:00 committed by GitHub
parent 4bf1f62ba8
commit fb729fcf10
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 4 deletions

View File

@ -16,13 +16,19 @@ std::unique_ptr<RawResponse> TransportPolicy::Send(
* Call the transport and return
*/
auto response = m_transport->Send(ctx, request);
if (request. IsDownloadViaStream())
auto statusCode = static_cast<typename std::underlying_type<Http::HttpStatusCode>::type>(
response->GetStatusCode());
if (request.IsDownloadViaStream() && statusCode < 300)
{ // special case to return a response with BodyStream to read directly from socket
// Return only if response is valid (less than 300)
return response;
}
// default behavior for all request is to download body content to Response
// 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();
response->SetBody(BodyStream::ReadToEnd(ctx, *bodyStream));
// BodyStream is moved out of response. This makes transport implementation to clean any active

View File

@ -21,14 +21,16 @@ namespace Azure { namespace Core { namespace Test {
constexpr int64_t c_fileSize = 1024 * 100;
}
void TransportAdapter::checkResponseCode(Azure::Core::Http::HttpStatusCode code)
void TransportAdapter::checkResponseCode(
Azure::Core::Http::HttpStatusCode code,
Azure::Core::Http::HttpStatusCode expectedCode)
{
/* if (code != Azure::Core::Http::HttpStatusCode::Ok)
{
std::cout << static_cast<typename std::underlying_type<Http::HttpStatusCode>::type>(code);
return;
} */
EXPECT_TRUE(code == Azure::Core::Http::HttpStatusCode::Ok);
EXPECT_TRUE(code == expectedCode);
}
void TransportAdapter::CheckBodyFromBuffer(

View File

@ -303,4 +303,22 @@ namespace Azure { namespace Core { namespace Test {
}
}
TEST_F(TransportAdapter, putWithStreamOnFail)
{
// point to bad address pah to generate server MethodNotAllowed error
std::string host("http://httpbin.org/get");
// PUT 1k
auto requestBodyVector = std::vector<uint8_t>(1024, 'x');
auto bodyRequest = Azure::Core::Http::MemoryBodyStream(requestBodyVector);
auto request
= Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, host, &bodyRequest, true);
auto response = pipeline.Send(context, request);
checkResponseCode(
response->GetStatusCode(), Azure::Core::Http::HttpStatusCode::MethodNotAllowed);
auto expectedResponseBodySize = std::stoull(response->GetHeaders().at("content-length"));
CheckBodyFromBuffer(*response, expectedResponseBodySize);
}
}}} // namespace Azure::Core::Test

View File

@ -28,7 +28,9 @@ namespace Azure { namespace Core { namespace Test {
int64_t size,
std::string expectedBody = std::string(""));
static void checkResponseCode(Azure::Core::Http::HttpStatusCode code);
static void checkResponseCode(
Azure::Core::Http::HttpStatusCode code,
Azure::Core::Http::HttpStatusCode expectedCode = Azure::Core::Http::HttpStatusCode::Ok);
};
}}} // namespace Azure::Core::Test