1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2025-03-03 14:52:21 +02:00

Improve the HTTP client to set content-length to 0 when not specified by the server.

S3 (and gateways) always set content-length or transfer-encoding but HTTP 1.1 does not require it and proxies (e.g. HAProxy) may not include either.

Suggested by Adam K. Sumner.
This commit is contained in:
David Steele 2018-06-26 17:27:22 -04:00
parent e8c68b9c66
commit 7b0e65d488
4 changed files with 13 additions and 29 deletions

View File

@ -32,6 +32,14 @@
</release-feature-list>
<release-improvement-list>
<release-item>
<release-item-contributor-list>
<release-item-ideator id="sumner.adam.k"/>
</release-item-contributor-list>
<p>Improve the HTTP client to set <id>content-length</id> to 0 when not specified by the server. S3 (and gateways) always set <id>content-length</id> or <id>transfer-encoding</id> but <id>HTTP 1.1</id> does not require it and proxies (e.g. <proper>HAProxy</proper>) may not include either.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-ideator id="frost.stephen"/>

View File

@ -159,8 +159,7 @@ sub new
split(' ', trim($self->readLine()));
# Read the response headers
$self->{iContentLength} = undef;
$self->{iContentLength} = 0;
$self->{strResponseHeader} = '';
my $strHeader = trim($self->readLine());
@ -206,17 +205,6 @@ sub new
$strHeader = trim($self->readLine());
}
# Test response code
if ($self->{iResponseCode} == 200)
{
# Content length should have been defined either by content-length or transfer encoding
if (!defined($self->{iContentLength}))
{
confess &log(ERROR,
HTTP_HEADER_CONTENT_LENGTH . ' or ' . HTTP_HEADER_TRANSFER_ENCODING . ' must be defined', ERROR_PROTOCOL);
}
}
# Prefetch response - mostly useful when the response is known to be short
if ($bResponseBodyPrefetch)
{

View File

@ -6114,8 +6114,7 @@ static const EmbeddedModule embeddedModule[] =
"split(' ', trim($self->readLine()));\n"
"\n"
"\n"
"$self->{iContentLength} = undef;\n"
"\n"
"$self->{iContentLength} = 0;\n"
"$self->{strResponseHeader} = '';\n"
"my $strHeader = trim($self->readLine());\n"
"\n"
@ -6162,17 +6161,6 @@ static const EmbeddedModule embeddedModule[] =
"}\n"
"\n"
"\n"
"if ($self->{iResponseCode} == 200)\n"
"{\n"
"\n"
"if (!defined($self->{iContentLength}))\n"
"{\n"
"confess &log(ERROR,\n"
"HTTP_HEADER_CONTENT_LENGTH . ' or ' . HTTP_HEADER_TRANSFER_ENCODING . ' must be defined', ERROR_PROTOCOL);\n"
"}\n"
"}\n"
"\n"
"\n"
"if ($bResponseBodyPrefetch)\n"
"{\n"
"$self->{strResponseBody} = $self->responseBody();\n"

View File

@ -148,10 +148,10 @@ sub run
$self->httpsServer(sub
{
$self->httpsServerAccept();
$self->{oConnection}->write("HTTP/1.1 200 NoContentLengthMessage1\r\n\r\n");
$self->{oConnection}->write("HTTP/1.1 404 Error\r\nBogus-Header\r\n\r\n");
$self->httpsServerAccept();
$self->{oConnection}->write("HTTP/1.1 200 NoContentLengthMessage2\r\n\r\n");
$self->{oConnection}->write("HTTP/1.1 404 Error\r\nBogus-Header\r\n\r\n");
$self->httpsServerAccept();
$self->httpsServerResponse(200, $strTestData);
@ -161,7 +161,7 @@ sub run
$self->testException(
sub {new pgBackRest::Common::Http::Client(
$strTestHost, HTTP_VERB_GET, {iPort => HTTPS_TEST_PORT, bVerifySsl => false, iTryTotal => 1})},
ERROR_PROTOCOL, 'content-length or transfer-encoding must be defined');
ERROR_PROTOCOL, "http header 'Bogus-Header' requires colon separator");
$self->testResult(
sub {new pgBackRest::Common::Http::Client(