summaryrefslogtreecommitdiff
path: root/methods
diff options
context:
space:
mode:
Diffstat (limited to 'methods')
-rw-r--r--methods/ftp.cc1
-rw-r--r--methods/http.cc14
-rw-r--r--methods/http.h7
-rw-r--r--methods/https.cc13
-rw-r--r--methods/rsh.cc4
5 files changed, 34 insertions, 5 deletions
diff --git a/methods/ftp.cc b/methods/ftp.cc
index ad8a7b828..b1e8d2b0a 100644
--- a/methods/ftp.cc
+++ b/methods/ftp.cc
@@ -77,6 +77,7 @@ FTPConn::FTPConn(URI Srv) : Len(0), ServerFd(-1), DataFd(-1),
{
Debug = _config->FindB("Debug::Acquire::Ftp",false);
PasvAddr = 0;
+ Buffer[0] = '\0';
}
/*}}}*/
// FTPConn::~FTPConn - Destructor /*{{{*/
diff --git a/methods/http.cc b/methods/http.cc
index b8ed43cd2..2721b1224 100644
--- a/methods/http.cc
+++ b/methods/http.cc
@@ -716,7 +716,19 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out)
}
}
-
+ // If we ask for uncompressed files servers might respond with content-
+ // negotation which lets us end up with compressed files we do not support,
+ // see 657029, 657560 and co, so if we have no extension on the request
+ // ask for text only. As a sidenote: If there is nothing to negotate servers
+ // seem to be nice and ignore it.
+ if (_config->FindB("Acquire::http::SendAccept", true) == true)
+ {
+ size_t const filepos = Itm->Uri.find_last_of('/');
+ string const file = Itm->Uri.substr(filepos + 1);
+ if (flExtension(file) == file)
+ strcat(Buf,"Accept: text/*\r\n");
+ }
+
string Req = Buf;
// Check for a partial file
diff --git a/methods/http.h b/methods/http.h
index c73d4df5c..5c195de64 100644
--- a/methods/http.h
+++ b/methods/http.h
@@ -117,9 +117,10 @@ struct ServerState
bool HeaderLine(std::string Line);
bool Comp(URI Other) const {return Other.Host == ServerName.Host && Other.Port == ServerName.Port;};
- void Reset() {Major = 0; Minor = 0; Result = 0; Size = 0; StartPos = 0;
- Encoding = Closes; time(&Date); ServerFd = -1;
- Pipeline = true;};
+ void Reset() {Major = 0; Minor = 0; Result = 0; Code[0] = '\0'; Size = 0;
+ StartPos = 0; Encoding = Closes; time(&Date); HaveContent = false;
+ State = Header; Persistent = false; ServerFd = -1;
+ Pipeline = true;};
/** \brief Result of the header acquire */
enum RunHeadersResult {
diff --git a/methods/https.cc b/methods/https.cc
index 6de18b8e0..4f2d581d2 100644
--- a/methods/https.cc
+++ b/methods/https.cc
@@ -242,6 +242,19 @@ bool HttpsMethod::Fetch(FetchItem *Itm)
// error handling
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errorstr);
+ // If we ask for uncompressed files servers might respond with content-
+ // negotation which lets us end up with compressed files we do not support,
+ // see 657029, 657560 and co, so if we have no extension on the request
+ // ask for text only. As a sidenote: If there is nothing to negotate servers
+ // seem to be nice and ignore it.
+ if (_config->FindB("Acquire::https::SendAccept", _config->FindB("Acquire::http::SendAccept", true)) == true)
+ {
+ size_t const filepos = Itm->Uri.find_last_of('/');
+ string const file = Itm->Uri.substr(filepos + 1);
+ if (flExtension(file) == file)
+ headers = curl_slist_append(headers, "Accept: text/*");
+ }
+
// 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)
{
diff --git a/methods/rsh.cc b/methods/rsh.cc
index d249ae961..fb3782314 100644
--- a/methods/rsh.cc
+++ b/methods/rsh.cc
@@ -42,7 +42,9 @@ int RSHMethod::FailFd = -1;
// ---------------------------------------------------------------------
/* */
RSHConn::RSHConn(URI Srv) : Len(0), WriteFd(-1), ReadFd(-1),
- ServerName(Srv), Process(-1) {}
+ ServerName(Srv), Process(-1) {
+ Buffer[0] = '\0';
+}
/*}}}*/
// RSHConn::RSHConn - Destructor /*{{{*/
// ---------------------------------------------------------------------