X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/b53b7926de5d01fc33bc253fa94b9c98a0833dea..30b30ec1c01acb6f128e3fc8eb74d978a287ae1a:/methods/http.cc diff --git a/methods/http.cc b/methods/http.cc index cd0b913c3..da15cec32 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: http.cc,v 1.17 1998/12/14 08:23:10 jgg Exp $ +// $Id: http.cc,v 1.28 1999/03/15 06:01:00 jgg Exp $ /* ###################################################################### HTTP Aquire Method - This is the HTTP aquire method for APT. @@ -38,6 +38,7 @@ #include #include #include +#include // Internet stuff #include @@ -335,18 +336,10 @@ bool ServerState::Open() /* This implements a timeout for connect by opening the connection nonblocking */ - fd_set wfds; - FD_ZERO(&wfds); - FD_SET(ServerFd,&wfds); - struct timeval tv; - tv.tv_sec = TimeOut; - tv.tv_usec = 0; - int Res = 0; - if ((Res = select(ServerFd+1,0,&wfds,0,&tv)) < 0) - return _error->Errno("select","Select failed"); - if (Res == 0) + if (WaitFd(ServerFd,true,TimeOut) == false) return _error->Error("Could not connect, connection timed out"); - unsigned int Err,Len; + unsigned int Err; + unsigned int Len = sizeof(Err); if (getsockopt(ServerFd,SOL_SOCKET,SO_ERROR,&Err,&Len) != 0) return _error->Errno("getsockopt","Failed"); if (Err != 0) @@ -447,7 +440,7 @@ bool ServerState::RunData() while ((Last = Owner->Go(false,this)) == true); if (Last == false) return false; - return true; + return !_error->PendingError(); } // Transfer the block @@ -489,12 +482,12 @@ bool ServerState::RunData() continue; In.Limit(-1); - return true; + return !_error->PendingError(); } while (Owner->Go(true,this) == true); } - return Owner->Flush(this); + return Owner->Flush(this) && !_error->PendingError(); } /*}}}*/ // ServerState::HeaderLine - Process a header line /*{{{*/ @@ -616,7 +609,7 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out) and we expect the proxy to do this */ if (Proxy.empty() == true) sprintf(Buf,"GET %s HTTP/1.1\r\nHost: %s\r\nConnection: keep-alive\r\n", - Uri.Path.c_str(),ProperHost.c_str()); + QuoteString(Uri.Path,"~").c_str(),ProperHost.c_str()); else { /* Generate a cache control header if necessary. We place a max @@ -659,8 +652,9 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out) } } -/* if (ProxyAuth.empty() == false) - Req += string("Proxy-Authorization: Basic ") + Base64Encode(ProxyAuth) + "\r\n";*/ + if (Proxy.User.empty() == false || Proxy.Password.empty() == false) + Req += string("Proxy-Authorization: Basic ") + + Base64Encode(Proxy.User + ":" + Proxy.Password) + "\r\n"; Req += "User-Agent: Debian APT-HTTP/1.2\r\n\r\n"; // cerr << Req << endl; @@ -793,6 +787,8 @@ bool HttpMethod::Flush(ServerState *Srv) /* */ bool HttpMethod::ServerDie(ServerState *Srv) { + unsigned int LErrno = errno; + // Dump the buffer to the file if (Srv->State == ServerState::Data) { @@ -813,8 +809,9 @@ bool HttpMethod::ServerDie(ServerState *Srv) Srv->Encoding != ServerState::Closes) { Srv->Close(); - if (errno == 0) + if (LErrno == 0) return _error->Error("Error reading from server Remote end closed connection"); + errno = LErrno; return _error->Errno("read","Error reading from server"); } else @@ -874,6 +871,7 @@ int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv) return 5; FailFile = Queue->DestFile; + FailFile.c_str(); // Make sure we dont do a malloc in the signal handler FailFd = File->Fd(); FailTime = Srv->Date; @@ -983,13 +981,7 @@ int HttpMethod::Loop() int FailCounter = 0; while (1) - { - if (FailCounter >= 2) - { - Fail("Massive Server Brain Damage"); - FailCounter = 0; - } - + { // We have no commands, wait for some to arrive if (Queue == 0) { @@ -1018,7 +1010,9 @@ int HttpMethod::Loop() // Connnect to the host if (Server->Open() == false) { - Fail(); + Fail(true); + delete Server; + Server = 0; continue; } @@ -1035,7 +1029,7 @@ int HttpMethod::Loop() case 2: { _error->Error("Bad header Data"); - Fail(); + Fail(true); continue; } @@ -1046,6 +1040,13 @@ int HttpMethod::Loop() FailCounter++; _error->Discard(); Server->Close(); + + if (FailCounter >= 2) + { + Fail("Connection timed out",true); + FailCounter = 0; + } + continue; } }; @@ -1082,7 +1083,7 @@ int HttpMethod::Loop() URIDone(Res); } else - Fail(); + Fail(true); break; }