|
@@ -1,6 +1,6 @@
|
|
|
// -*- mode: cpp; mode: fold -*-
|
|
// -*- mode: cpp; mode: fold -*-
|
|
|
// Description /*{{{*/
|
|
// Description /*{{{*/
|
|
|
-// $Id: http.cc,v 1.9 1998/12/05 04:19:05 jgg Exp $
|
|
|
|
|
|
|
+// $Id: http.cc,v 1.10 1998/12/07 07:26:27 jgg Exp $
|
|
|
/* ######################################################################
|
|
/* ######################################################################
|
|
|
|
|
|
|
|
HTTP Aquire Method - This is the HTTP aquire method for APT.
|
|
HTTP Aquire Method - This is the HTTP aquire method for APT.
|
|
@@ -51,6 +51,7 @@
|
|
|
string HttpMethod::FailFile;
|
|
string HttpMethod::FailFile;
|
|
|
int HttpMethod::FailFd = -1;
|
|
int HttpMethod::FailFd = -1;
|
|
|
time_t HttpMethod::FailTime = 0;
|
|
time_t HttpMethod::FailTime = 0;
|
|
|
|
|
+unsigned long PipelineDepth = 5;
|
|
|
|
|
|
|
|
// CircleBuf::CircleBuf - Circular input buffer /*{{{*/
|
|
// CircleBuf::CircleBuf - Circular input buffer /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
// ---------------------------------------------------------------------
|
|
@@ -572,9 +573,9 @@ bool ServerState::HeaderLine(string Line)
|
|
|
void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out)
|
|
void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out)
|
|
|
{
|
|
{
|
|
|
URI Uri = Itm->Uri;
|
|
URI Uri = Itm->Uri;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// The HTTP server expects a hostname with a trailing :port
|
|
// The HTTP server expects a hostname with a trailing :port
|
|
|
- char Buf[300];
|
|
|
|
|
|
|
+ char Buf[1000];
|
|
|
string ProperHost = Uri.Host;
|
|
string ProperHost = Uri.Host;
|
|
|
if (Uri.Port != 0)
|
|
if (Uri.Port != 0)
|
|
|
{
|
|
{
|
|
@@ -582,6 +583,10 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out)
|
|
|
ProperHost += Buf;
|
|
ProperHost += Buf;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // Just in case.
|
|
|
|
|
+ if (Itm->Uri.length() >= sizeof(Buf))
|
|
|
|
|
+ abort();
|
|
|
|
|
+
|
|
|
/* Build the request. We include a keep-alive header only for non-proxy
|
|
/* Build the request. We include a keep-alive header only for non-proxy
|
|
|
requests. This is to tweak old http/1.0 servers that do support keep-alive
|
|
requests. This is to tweak old http/1.0 servers that do support keep-alive
|
|
|
but not HTTP/1.1 automatic keep-alive. Doing this with a proxy server
|
|
but not HTTP/1.1 automatic keep-alive. Doing this with a proxy server
|
|
@@ -592,8 +597,27 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out)
|
|
|
sprintf(Buf,"GET %s HTTP/1.1\r\nHost: %s\r\nConnection: keep-alive\r\n",
|
|
sprintf(Buf,"GET %s HTTP/1.1\r\nHost: %s\r\nConnection: keep-alive\r\n",
|
|
|
Uri.Path.c_str(),ProperHost.c_str());
|
|
Uri.Path.c_str(),ProperHost.c_str());
|
|
|
else
|
|
else
|
|
|
|
|
+ {
|
|
|
|
|
+ /* Generate a cache control header if necessary. We place a max
|
|
|
|
|
+ cache age on index files, optionally set a no-cache directive
|
|
|
|
|
+ and a no-store directive for archives. */
|
|
|
sprintf(Buf,"GET %s HTTP/1.1\r\nHost: %s\r\n",
|
|
sprintf(Buf,"GET %s HTTP/1.1\r\nHost: %s\r\n",
|
|
|
Itm->Uri.c_str(),ProperHost.c_str());
|
|
Itm->Uri.c_str(),ProperHost.c_str());
|
|
|
|
|
+ if (_config->FindB("Acquire::http::No-Cache",false) == true)
|
|
|
|
|
+ strcat(Buf,"Cache-Control: no-cache\r\n");
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ if (Itm->IndexFile == true)
|
|
|
|
|
+ sprintf(Buf+strlen(Buf),"Cache-Control: max-age=%u\r\n",
|
|
|
|
|
+ _config->FindI("Acquire::http::Max-Age",60*60*24));
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ if (_config->FindB("Acquire::http::No-Store",false) == true)
|
|
|
|
|
+ strcat(Buf,"Cache-Control: no-store\r\n");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
string Req = Buf;
|
|
string Req = Buf;
|
|
|
|
|
|
|
|
// Check for a partial file
|
|
// Check for a partial file
|
|
@@ -619,7 +643,8 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out)
|
|
|
|
|
|
|
|
Req += "User-Agent: Debian APT-HTTP/1.2\r\n\r\n";
|
|
Req += "User-Agent: Debian APT-HTTP/1.2\r\n\r\n";
|
|
|
// cerr << Req << endl;
|
|
// cerr << Req << endl;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+ cerr << Req << endl;
|
|
|
Out.Read(Req);
|
|
Out.Read(Req);
|
|
|
}
|
|
}
|
|
|
/*}}}*/
|
|
/*}}}*/
|
|
@@ -892,7 +917,7 @@ bool HttpMethod::Fetch(FetchItem *)
|
|
|
// Queue the requests
|
|
// Queue the requests
|
|
|
int Depth = -1;
|
|
int Depth = -1;
|
|
|
bool Tail = false;
|
|
bool Tail = false;
|
|
|
- for (FetchItem *I = Queue; I != 0 && Depth < 5; I = I->Next, Depth++)
|
|
|
|
|
|
|
+ for (FetchItem *I = Queue; I != 0 && Depth < (signed)PipelineDepth; I = I->Next, Depth++)
|
|
|
{
|
|
{
|
|
|
// Make sure we stick with the same server
|
|
// Make sure we stick with the same server
|
|
|
if (Server->Comp(I->Uri) == false)
|
|
if (Server->Comp(I->Uri) == false)
|