summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2016-01-12 15:18:12 +0100
committerJulian Andres Klode <jak@debian.org>2016-01-12 23:40:59 +0100
commitb6d88f39aceda2e093e1bf8751f07236b7d9e483 (patch)
tree8ac4947fbf48085fad2bf78ae9ce21d8f844cb15
parentfe4a53782211c459e8a50654055ad4f797ad1f3b (diff)
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
-rw-r--r--methods/server.cc8
-rw-r--r--methods/server.h3
-rwxr-xr-xtest/integration/test-http-pipeline-messup5
3 files changed, 13 insertions, 3 deletions
diff --git a/methods/server.cc b/methods/server.cc
index d5188d4a3..6340390d4 100644
--- a/methods/server.cc
+++ b/methods/server.cc
@@ -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);
diff --git a/methods/server.h b/methods/server.h
index 365bc0879..3f6502432 100644
--- a/methods/server.h
+++ b/methods/server.h
@@ -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 */
diff --git a/test/integration/test-http-pipeline-messup b/test/integration/test-http-pipeline-messup
index 4069beb0d..95e890baf 100755
--- a/test/integration/test-http-pipeline-messup
+++ b/test/integration/test-http-pipeline-messup
@@ -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