Browse Source

Only enable pipelining if server is HTTP/1.1

Just enabling it for anyone breaks with HTTP/1.0 servers and
proxies sometimes.

Closes: #810796
tags/debian/1.2
Julian Andres Klode 5 years ago
parent
commit
b6d88f39ac
3 changed files with 13 additions and 3 deletions
  1. +8
    -0
      methods/server.cc
  2. +2
    -1
      methods/server.h
  3. +3
    -2
      test/integration/test-http-pipeline-messup

+ 8
- 0
methods/server.cc View File

@@ -150,9 +150,15 @@ bool ServerState::HeaderLine(string Line)
else
{
if (Major == 1 && Minor == 0)
{
Persistent = false;
}
else
{
Persistent = true;
if (PipelineAllowed)
Pipeline = true;
}
}

return true;
@@ -532,6 +538,7 @@ int ServerMethod::Loop()
_error->Discard();
Server->Close();
Server->Pipeline = false;
Server->PipelineAllowed = false;
if (FailCounter >= 2)
{
@@ -604,6 +611,7 @@ int ServerMethod::Loop()
strprintf(out, _("Automatically disabled %s due to incorrect response from server/proxy. (man 5 apt.conf)"), "Acquire::http::PipelineDepth");
std::cerr << "W: " << out << std::endl;
Server->Pipeline = false;
Server->PipelineAllowed = false;
// we keep the PipelineDepth value so that the rest of the queue can be fixed up as well
}
Rename(Res.Filename, I->DestFile);


+ 2
- 1
methods/server.h View File

@@ -51,6 +51,7 @@ struct ServerState
enum {Chunked,Stream,Closes} Encoding;
enum {Header, Data} State;
bool Persistent;
bool PipelineAllowed;
std::string Location;

// This is a Persistent attribute of the server itself.
@@ -86,7 +87,7 @@ struct ServerState
bool Comp(URI Other) const {return Other.Host == ServerName.Host && Other.Port == ServerName.Port;};
virtual void Reset() {Major = 0; Minor = 0; Result = 0; Code[0] = '\0'; TotalFileSize = 0; JunkSize = 0;
StartPos = 0; Encoding = Closes; time(&Date); HaveContent = false;
State = Header; Persistent = false; Pipeline = true; MaximumSize = 0;};
State = Header; Persistent = false; Pipeline = false; MaximumSize = 0; PipelineAllowed = true;};
virtual bool WriteResponse(std::string const &Data) = 0;

/** \brief Transfer the data from the socket */


+ 3
- 2
test/integration/test-http-pipeline-messup View File

@@ -8,6 +8,7 @@ setupenvironment
configarchitecture "i386"

# try a little harder to create a size mismatch
buildsimplenativepackage 'pkg0' 'all' '1.0' 'stable' "Depends: foo" '' '' '' '' 'none'
buildsimplenativepackage 'pkga' 'all' '1.0' 'stable' "Depends: foo" '' '' '' '' 'none'
buildsimplenativepackage 'pkgb' 'all' '1.0' 'stable' "Depends: foo" '' '' '' '' 'none'
buildsimplenativepackage 'pkgc' 'all' '1.0' 'stable' "Depends: f$(for i in $(seq 0 1000); do printf 'o'; done)" '' '' '' '' 'none'
@@ -43,8 +44,8 @@ done
echo 'Acquire::http::Pipeline-Depth 10;' > ../rootdir/etc/apt/apt.conf.d/99enable-pipeline

# the output is a bit strange: it looks like it has downloaded pkga 4 times
testwarning aptget download pkga pkgb pkgc pkgd
for pkg in 'pkga' 'pkgb' 'pkgc' 'pkgd'; do
testwarning aptget download pkg0 pkga pkgb pkgc pkgd
for pkg in 'pkg0' 'pkga' 'pkgb' 'pkgc' 'pkgd'; do
testsuccess test -f ${pkg}_1.0_all.deb
testsuccess cmp ../incoming/${pkg}_1.0_all.deb ${pkg}_1.0_all.deb
rm -f ${pkg}_1.0_all.deb


Loading…
Cancel
Save