// -*- mode: cpp; mode: fold -*-
-// Description /*{{{*/
-// $Id: http.h,v 1.1 1998/11/01 05:30:47 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 acquire method for APT.
##################################################################### */
/*}}}*/
#ifndef APT_HTTP_H
#define APT_HTTP_H
-#define MAXLEN 360
+#include <apt-pkg/strutl.h>
+#include <apt-pkg/acquire-method.h>
+#include <string>
+#include <sys/time.h>
+#include <iostream>
+
+#include "server.h"
+
+using std::cout;
+using std::endl;
+
+class FileFd;
class HttpMethod;
+class Hashes;
class CircleBuf
{
unsigned char *Buf;
- unsigned long Size;
- unsigned long InP;
- unsigned long OutP;
- string OutQueue;
- unsigned long StrPos;
- unsigned long MaxGet;
+ unsigned long long Size;
+ unsigned long long InP;
+ unsigned long long OutP;
+ std::string OutQueue;
+ unsigned long long StrPos;
+ unsigned long long MaxGet;
struct timeval Start;
-
- unsigned long LeftRead()
+
+ static unsigned long long BwReadLimit;
+ static unsigned long long BwTickReadData;
+ static struct timeval BwReadTick;
+ static const unsigned int BW_HZ;
+
+ unsigned long long LeftRead() const
{
- unsigned long Sz = Size - (InP - OutP);
+ unsigned long long Sz = Size - (InP - OutP);
if (Sz > Size - (InP%Size))
Sz = Size - (InP%Size);
return Sz;
}
- unsigned long LeftWrite()
+ unsigned long long LeftWrite() const
{
- unsigned long Sz = InP - OutP;
+ unsigned long long Sz = InP - OutP;
if (InP > MaxGet)
Sz = MaxGet - OutP;
if (Sz > Size - (OutP%Size))
return Sz;
}
void FillOut();
-
+
public:
-
- MD5Summation *MD5;
-
+ Hashes *Hash;
+
// Read data in
bool Read(int Fd);
- bool Read(string Data);
-
+ bool Read(std::string Data);
+
// Write data out
bool Write(int Fd);
- bool WriteTillEl(string &Data,bool Single = false);
-
+ bool WriteTillEl(std::string &Data,bool Single = false);
+
// Control the write limit
- void Limit(long Max) {if (Max == -1) MaxGet = 0-1; else MaxGet = OutP + Max;}
- bool IsLimit() {return MaxGet == OutP;};
- void Print() {cout << MaxGet << ',' << OutP << endl;};
+ void Limit(long long Max) {if (Max == -1) MaxGet = 0-1; else MaxGet = OutP + Max;}
+ bool IsLimit() const {return MaxGet == OutP;};
+ void Print() const {cout << MaxGet << ',' << OutP << endl;};
// Test for free space in the buffer
- bool ReadSpace() {return Size - (InP - OutP) > 0;};
- bool WriteSpace() {return InP - OutP > 0;};
+ bool ReadSpace() const {return Size - (InP - OutP) > 0;};
+ bool WriteSpace() const {return InP - OutP > 0;};
// Dump everything
void Reset();
void Stats();
- CircleBuf(unsigned long Size);
- ~CircleBuf() {delete [] Buf;};
+ CircleBuf(unsigned long long Size);
+ ~CircleBuf();
};
-struct ServerState
+struct HttpServerState: public ServerState
{
- // This is the last parsed Header Line
- unsigned int Major;
- unsigned int Minor;
- unsigned int Result;
- char Code[MAXLEN];
-
- // These are some statistics from the last parsed get line
- unsigned long Size;
- signed long StartPos;
- time_t Date;
- enum {Chunked,Stream,Closes} Encoding;
- enum {Header, Data} State;
-
- HttpMethod *Owner;
-
// This is the connection itself. Output is data FROM the server
CircleBuf In;
CircleBuf Out;
int ServerFd;
- URI ServerName;
-
- 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;};
- bool RunHeaders();
- bool RunData();
-
- bool Open();
- bool Close();
-
- ServerState(URI Srv,HttpMethod *Owner);
- ~ServerState() {Close();};
+
+ protected:
+ virtual bool ReadHeaderLines(std::string &Data);
+ virtual bool LoadNextResponse(bool const ToFile, FileFd * const File);
+ virtual bool WriteResponse(std::string const &Data);
+
+ public:
+ virtual void Reset() { ServerState::Reset(); ServerFd = -1; };
+
+ virtual bool RunData(FileFd * const File);
+
+ virtual bool Open();
+ virtual bool IsOpen();
+ virtual bool Close();
+ virtual bool InitHashes(FileFd &File);
+ virtual Hashes * GetHashes();
+ virtual bool Die(FileFd &File);
+ virtual bool Flush(FileFd * const File);
+ virtual bool Go(bool ToFile, FileFd * const File);
+
+ HttpServerState(URI Srv, HttpMethod *Owner);
+ virtual ~HttpServerState() {Close();};
};
-class HttpMethod : public pkgAcqMethod
+class HttpMethod : public ServerMethod
{
- void SendReq(FetchItem *Itm,CircleBuf &Out);
- bool Go(bool ToFile,ServerState *Srv);
- bool Flush(ServerState *Srv);
- bool ServerDie(ServerState *Srv);
- int DealWithHeaders(FetchResult &Res,ServerState *Srv);
-
public:
- friend ServerState;
-
- ServerState *Srv;
- int Depth;
- FileFd *File;
-
- int Loop();
-
- HttpMethod() : pkgAcqMethod("1.2",SingleInstance | Pipeline | SendConfig)
+ virtual void SendReq(FetchItem *Itm);
+
+ /** \brief Try to AutoDetect the proxy */
+ bool AutoDetectProxy();
+
+ virtual bool Configuration(std::string Message);
+
+ virtual ServerState * CreateServerState(URI uri);
+ virtual void RotateDNS();
+
+ protected:
+ std::string AutoDetectProxyCmd;
+
+ public:
+ friend struct HttpServerState;
+
+ HttpMethod() : ServerMethod("1.2",Pipeline | SendConfig)
{
- Depth = 0;
- Srv = 0;
File = 0;
- Depth = 0;
+ Server = 0;
};
};
-URI Proxy;
-
#endif