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:
parent
e8c68b9c66
commit
7b0e65d488
@ -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"/>
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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"
|
||||
|
@ -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(
|
||||
|
Loading…
x
Reference in New Issue
Block a user