// -*- mode: cpp; mode: fold -*-
-// Description /*{{{*/// $Id: http.h,v 1.6 1998/12/10 05:39:56 jgg Exp $
+// Description /*{{{*/// $Id: http.h,v 1.12 2002/04/18 05:09:38 jgg Exp $
+// $Id: http.h,v 1.12 2002/04/18 05:09:38 jgg Exp $
/* ######################################################################
- HTTP Aquire Method - This is the HTTP aquire method for APT.
+ HTTP Acquire Method - This is the HTTP aquire method for APT.
##################################################################### */
/*}}}*/
#define MAXLEN 360
+#include <apt-pkg/hashes.h>
+
+using std::cout;
+using std::endl;
+
class HttpMethod;
class CircleBuf
unsigned long MaxGet;
struct timeval Start;
+ static unsigned long BwReadLimit;
+ static unsigned long BwTickReadData;
+ static struct timeval BwReadTick;
+ static const unsigned int BW_HZ;
+
unsigned long LeftRead()
{
unsigned long Sz = Size - (InP - OutP);
public:
- MD5Summation *MD5;
+ Hashes *Hash;
// Read data in
bool Read(int Fd);
void Stats();
CircleBuf(unsigned long Size);
- ~CircleBuf() {delete [] Buf;};
+ ~CircleBuf() {delete [] Buf; delete Hash;};
};
struct ServerState
bool HaveContent;
enum {Chunked,Stream,Closes} Encoding;
enum {Header, Data} State;
+ bool Persistent;
+ string Location;
+
+ // This is a Persistent attribute of the server itself.
+ bool Pipeline;
HttpMethod *Owner;
bool HeaderLine(string Line);
bool Comp(URI Other) {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;};
- int RunHeaders();
+ Encoding = Closes; time(&Date); ServerFd = -1;
+ Pipeline = true;};
+
+ /** \brief Result of the header acquire */
+ enum RunHeadersResult {
+ /** \brief Header ok */
+ RUN_HEADERS_OK,
+ /** \brief IO error while retrieving */
+ RUN_HEADERS_IO_ERROR,
+ /** \brief Parse error after retrieving */
+ RUN_HEADERS_PARSE_ERROR,
+ };
+ /** \brief Get the headers before the data */
+ RunHeadersResult RunHeaders();
+ /** \brief Transfer the data from the socket */
bool RunData();
bool Open();
bool Go(bool ToFile,ServerState *Srv);
bool Flush(ServerState *Srv);
bool ServerDie(ServerState *Srv);
- int DealWithHeaders(FetchResult &Res,ServerState *Srv);
- virtual bool Fetch(FetchItem *);
+ /** \brief Result of the header parsing */
+ enum DealWithHeadersResult {
+ /** \brief The file is open and ready */
+ FILE_IS_OPEN,
+ /** \brief We got a IMS hit, the file has not changed */
+ IMS_HIT,
+ /** \brief The server reported a unrecoverable error */
+ ERROR_UNRECOVERABLE,
+ /** \brief The server reported a error with a error content page */
+ ERROR_WITH_CONTENT_PAGE,
+ /** \brief A error on the client side */
+ ERROR_NOT_FROM_SERVER,
+ /** \brief A redirect or retry request */
+ TRY_AGAIN_OR_REDIRECT
+ };
+ /** \brief Handle the retrieved header data */
+ DealWithHeadersResult DealWithHeaders(FetchResult &Res,ServerState *Srv);
+
+ /** \brief Try to AutoDetect the proxy */
+ bool AutoDetectProxy();
+
virtual bool Configuration(string Message);
// In the event of a fatal signal this file will be closed and timestamped.
static int FailFd;
static time_t FailTime;
static void SigTerm(int);
+
+ protected:
+ virtual bool Fetch(FetchItem *);
+ string NextURI;
+ string AutoDetectProxyCmd;
+
public:
- friend ServerState;
+ friend class ServerState;
FileFd *File;
ServerState *Server;
};
};
-URI Proxy;
-
#endif