diff --git a/doc/xml/release.xml b/doc/xml/release.xml index fdfd488a3..07330dd5f 100644 --- a/doc/xml/release.xml +++ b/doc/xml/release.xml @@ -32,6 +32,14 @@ + + + + + +

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.

+
+ diff --git a/lib/pgBackRest/Common/Http/Client.pm b/lib/pgBackRest/Common/Http/Client.pm index 01d09c986..c3818aa49 100644 --- a/lib/pgBackRest/Common/Http/Client.pm +++ b/lib/pgBackRest/Common/Http/Client.pm @@ -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) { diff --git a/src/perl/embed.auto.c b/src/perl/embed.auto.c index 7f60a5d41..5739a3207 100644 --- a/src/perl/embed.auto.c +++ b/src/perl/embed.auto.c @@ -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" diff --git a/test/lib/pgBackRestTest/Module/Common/CommonHttpClientPerlTest.pm b/test/lib/pgBackRestTest/Module/Common/CommonHttpClientPerlTest.pm index 631de8c23..a77b30649 100644 --- a/test/lib/pgBackRestTest/Module/Common/CommonHttpClientPerlTest.pm +++ b/test/lib/pgBackRestTest/Module/Common/CommonHttpClientPerlTest.pm @@ -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(