summaryrefslogtreecommitdiff
path: root/methods
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2021-10-18 13:37:47 +0000
committerJulian Andres Klode <jak@debian.org>2021-10-18 13:37:47 +0000
commitefa3528de4277a3d5195c5ce875e7ee960726239 (patch)
tree259ded536c8f6359c4c4bf629ba8e310f17f799a /methods
parent76bd0ab589f5a577bd6127bf6487fd351de5b32a (diff)
parent1edf8551cef0a7db7fdcdd5d6b06aec2ea7bb70d (diff)
Merge branch 'pu/ifrange' into 'main'
Add AllowRange option to disable HTTP Range usage See merge request apt-team/apt!188
Diffstat (limited to 'methods')
-rw-r--r--methods/basehttp.cc31
1 files changed, 29 insertions, 2 deletions
diff --git a/methods/basehttp.cc b/methods/basehttp.cc
index f2c4156e1..df34698cd 100644
--- a/methods/basehttp.cc
+++ b/methods/basehttp.cc
@@ -11,6 +11,7 @@
#include <config.h>
#include <apt-pkg/configuration.h>
+#include <apt-pkg/debversion.h>
#include <apt-pkg/error.h>
#include <apt-pkg/fileutl.h>
#include <apt-pkg/strutl.h>
@@ -19,6 +20,7 @@
#include <limits>
#include <map>
#include <string>
+#include <string_view>
#include <vector>
#include <ctype.h>
#include <signal.h>
@@ -246,7 +248,7 @@ bool RequestState::HeaderLine(string const &Line) /*{{{*/
return true;
}
- if (stringcasecmp(Tag, "Accept-Ranges:") == 0)
+ if (Server->RangesAllowed && stringcasecmp(Tag, "Accept-Ranges:") == 0)
{
std::string ranges = ',' + Val + ',';
ranges.erase(std::remove(ranges.begin(), ranges.end(), ' '), ranges.end());
@@ -255,6 +257,24 @@ bool RequestState::HeaderLine(string const &Line) /*{{{*/
return true;
}
+ if (Server->RangesAllowed && stringcasecmp(Tag, "Via:") == 0)
+ {
+ auto const parts = VectorizeString(Val, ' ');
+ std::string_view const varnish{"(Varnish/"};
+ if (parts.size() != 3 || parts[1] != "varnish" || parts[2].empty() ||
+ not APT::String::Startswith(parts[2], std::string{varnish}) ||
+ parts[2].back() != ')')
+ return true;
+ auto const version = parts[2].substr(varnish.length(), parts[2].length() - (varnish.length() + 1));
+ if (version.empty())
+ return true;
+ std::string_view const varnishsupport{"6.4~"};
+ if (debVersioningSystem::CmpFragment(version.data(), version.data() + version.length(),
+ varnishsupport.begin(), varnishsupport.end()) < 0)
+ Server->RangesAllowed = false;
+ return true;
+ }
+
return true;
}
/*}}}*/
@@ -276,7 +296,6 @@ void ServerState::Reset() /*{{{*/
Persistent = false;
Pipeline = false;
PipelineAllowed = true;
- RangesAllowed = true;
PipelineAnswersReceived = 0;
}
/*}}}*/
@@ -411,6 +430,13 @@ BaseHttpMethod::DealWithHeaders(FetchResult &Res, RequestState &Req)
}
/* else pass through for error message */
}
+ // the server is not supporting ranges as much as we would like. Retry without ranges
+ else if (not Server->RangesAllowed && (Req.Result == 416 || Req.Result == 206))
+ {
+ RemoveFile("server", Queue->DestFile);
+ NextURI = Queue->Uri;
+ return TRY_AGAIN_OR_REDIRECT;
+ }
// retry after an invalid range response without partial data
else if (Req.Result == 416)
{
@@ -607,6 +633,7 @@ int BaseHttpMethod::Loop()
setPostfixForMethodNames(::URI(Queue->Uri).Host.c_str());
AllowRedirect = ConfigFindB("AllowRedirect", true);
PipelineDepth = ConfigFindI("Pipeline-Depth", 10);
+ Server->RangesAllowed = ConfigFindB("AllowRanges", true);
Debug = DebugEnabled();
}