Browse Source

don't sent Range requests if we know its not accepted

If the server told us in a previous request that it isn't supporting
Ranges with bytes via an Accept-Ranges header missing bytes, we don't
try to formulate requests using Ranges.
tags/debian/1.3_rc2
David Kalnischkies 4 years ago
parent
commit
d94b1d80d8
9 changed files with 37 additions and 13 deletions
  1. +1
    -1
      methods/http.cc
  2. +8
    -7
      methods/https.cc
  3. +10
    -0
      methods/server.cc
  4. +1
    -0
      methods/server.h
  5. +1
    -1
      test/integration/test-apt-update-transactions
  6. +0
    -1
      test/integration/test-bug-lp1445239-download-loop
  7. +7
    -1
      test/integration/test-partial-file-support
  8. +0
    -2
      test/integration/test-releasefile-verification
  9. +9
    -0
      test/interactive-helper/aptwebserver.cc

+ 1
- 1
methods/http.cc View File

@@ -906,7 +906,7 @@ void HttpMethod::SendReq(FetchItem *Itm)

// Check for a partial file and send if-queries accordingly
struct stat SBuf;
if (stat(Itm->DestFile.c_str(),&SBuf) >= 0 && SBuf.st_size > 0)
if (Server->RangesAllowed && stat(Itm->DestFile.c_str(),&SBuf) >= 0 && SBuf.st_size > 0)
Req << "Range: bytes=" << std::to_string(SBuf.st_size) << "-\r\n"
<< "If-Range: " << TimeRFC1123(SBuf.st_mtime, false) << "\r\n";
else if (Itm->LastModified != 0)


+ 8
- 7
methods/https.cc View File

@@ -382,8 +382,15 @@ bool HttpsMethod::Fetch(FetchItem *Itm)
headers = curl_slist_append(headers, "Accept: text/*");
}

// go for it - if the file exists, append on it
File = new FileFd(Itm->DestFile, FileFd::WriteAny);
if (Server == nullptr || Server->Comp(Itm->Uri) == false)
Server = CreateServerState(Itm->Uri);
else
Server->Reset(false);

// if we have the file send an if-range query with a range header
if (stat(Itm->DestFile.c_str(),&SBuf) >= 0 && SBuf.st_size > 0)
if (Server->RangesAllowed && stat(Itm->DestFile.c_str(),&SBuf) >= 0 && SBuf.st_size > 0)
{
std::string Buf;
strprintf(Buf, "Range: bytes=%lli-", (long long) SBuf.st_size);
@@ -397,12 +404,6 @@ bool HttpsMethod::Fetch(FetchItem *Itm)
curl_easy_setopt(curl, CURLOPT_TIMEVALUE, Itm->LastModified);
}

// go for it - if the file exists, append on it
File = new FileFd(Itm->DestFile, FileFd::WriteAny);
if (Server == nullptr || Server->Comp(Itm->Uri) == false)
Server = CreateServerState(Itm->Uri);
else
Server->Reset(false);
if (Server->InitHashes(Itm->ExpectedHashes) == false)
return false;



+ 10
- 0
methods/server.cc View File

@@ -227,6 +227,15 @@ bool ServerState::HeaderLine(string Line)
return true;
}

if (stringcasecmp(Tag, "Accept-Ranges:") == 0)
{
std::string ranges = ',' + Val + ',';
ranges.erase(std::remove(ranges.begin(), ranges.end(), ' '), ranges.end());
if (ranges.find(",bytes,") == std::string::npos)
RangesAllowed = false;
return true;
}

return true;
}
/*}}}*/
@@ -252,6 +261,7 @@ void ServerState::Reset(bool const Everything) /*{{{*/
if (Everything)
{
Persistent = false; Pipeline = false; PipelineAllowed = true;
RangesAllowed = true;
}
}
/*}}}*/


+ 1
- 0
methods/server.h View File

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

// This is a Persistent attribute of the server itself.


+ 1
- 1
test/integration/test-apt-update-transactions View File

@@ -82,7 +82,7 @@ testsetup 'file'
changetowebserver
webserverconfig 'aptwebserver::support::modified-since' 'false' "$1"
webserverconfig 'aptwebserver::support::last-modified' 'false' "$1" # curl is clever and sees hits here also
webserverconfig 'aptwebserver::support::range' 'false' "$1"
webserverconfig 'aptwebserver::response-header::Accept-Ranges' 'none' "$1"

testsetup 'http'



+ 0
- 1
test/integration/test-bug-lp1445239-download-loop View File

@@ -12,7 +12,6 @@ setupenvironment
configarchitecture 'amd64'

changetowebserver
webserverconfig 'aptwebserver::support::range' 'true'

TESTFILE='aptarchive/testfile'
dd if=/dev/zero of=$TESTFILE bs=100k count=1 2>/dev/null


+ 7
- 1
test/integration/test-partial-file-support View File

@@ -96,6 +96,7 @@ followuprequest() {

testrun() {
webserverconfig 'aptwebserver::support::range' 'true'
webserverconfig 'aptwebserver::response-header::Accept-Ranges' 'bytes'
local DOWN='./downloaded/testfile'

copysource $TESTFILE 0 $DOWN
@@ -125,7 +126,11 @@ testrun() {
testdownloadfile 'old data' "${1}/testfile" "$DOWN" '='
testwebserverlaststatuscode '200' "$DOWNLOADLOG"

webserverconfig 'aptwebserver::support::range' 'false'
if [ "${1%%:*}" = 'https' ] && expr match "$1" "^.*/redirectme$" >/dev/null; then
webserverconfig 'aptwebserver::response-header::Accept-Ranges' 'none'
else
webserverconfig 'aptwebserver::support::range' 'false'
fi

copysource $TESTFILE 20 $DOWN
testdownloadfile 'no server support' "${1}/testfile" "$DOWN" '='
@@ -148,4 +153,5 @@ changetohttpswebserver
serverconfigs "https://localhost:${APTHTTPSPORT}"

webserverconfig 'aptwebserver::redirect::replace::/redirectme/' "https://localhost:${APTHTTPSPORT}/"
serverconfigs "https://localhost:${APTHTTPSPORT}/redirectme"
serverconfigs "http://localhost:${APTHTTPPORT}/redirectme"

+ 0
- 2
test/integration/test-releasefile-verification View File

@@ -12,8 +12,6 @@ buildaptarchive
setupflataptarchive
changetowebserver

webserverconfig 'aptwebserver::support::range' 'false'

prepare() {
local DATE="${2:-now}"
if [ "$DATE" = 'now' ]; then


+ 9
- 0
test/interactive-helper/aptwebserver.cc View File

@@ -717,6 +717,15 @@ static void * handleClient(void * voidclient) /*{{{*/
condition.clear();
if (condition.empty() == false && strncmp(condition.c_str(), "bytes=", 6) == 0)
{
std::string ranges = ',' + _config->Find("aptwebserver::response-header::Accept-Ranges") + ',';
ranges.erase(std::remove(ranges.begin(), ranges.end(), ' '), ranges.end());
if (ranges.find(",bytes,") == std::string::npos)
{
// we handle it as an error here because we are a test server - a real one should just ignore it
sendError(client, 400, *m, sendContent, "Client does range requests we don't support", headers);
continue;
}

time_t cache;
std::string ifrange;
if (_config->FindB("aptwebserver::support::if-range", true) == true)


Loading…
Cancel
Save