diff options
Diffstat (limited to 'methods/http.h')
-rw-r--r-- | methods/http.h | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/methods/http.h b/methods/http.h new file mode 100644 index 000000000..d231aa1f1 --- /dev/null +++ b/methods/http.h @@ -0,0 +1,141 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/ +// $Id: http.h,v 1.1 1998/11/01 05:30:47 jgg Exp $ +/* ###################################################################### + + HTTP Aquire Method - This is the HTTP aquire method for APT. + + ##################################################################### */ + /*}}}*/ + +#ifndef APT_HTTP_H +#define APT_HTTP_H + +#define MAXLEN 360 + +class HttpMethod; + +class CircleBuf +{ + unsigned char *Buf; + unsigned long Size; + unsigned long InP; + unsigned long OutP; + string OutQueue; + unsigned long StrPos; + unsigned long MaxGet; + struct timeval Start; + + unsigned long LeftRead() + { + unsigned long Sz = Size - (InP - OutP); + if (Sz > Size - (InP%Size)) + Sz = Size - (InP%Size); + return Sz; + } + unsigned long LeftWrite() + { + unsigned long Sz = InP - OutP; + if (InP > MaxGet) + Sz = MaxGet - OutP; + if (Sz > Size - (OutP%Size)) + Sz = Size - (OutP%Size); + return Sz; + } + void FillOut(); + + public: + + MD5Summation *MD5; + + // Read data in + bool Read(int Fd); + bool Read(string Data); + + // Write data out + bool Write(int Fd); + bool WriteTillEl(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;}; + + // Test for free space in the buffer + bool ReadSpace() {return Size - (InP - OutP) > 0;}; + bool WriteSpace() {return InP - OutP > 0;}; + + // Dump everything + void Reset(); + void Stats(); + + CircleBuf(unsigned long Size); + ~CircleBuf() {delete [] Buf;}; +}; + +struct 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();}; +}; + +class HttpMethod : public pkgAcqMethod +{ + 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) + { + Depth = 0; + Srv = 0; + File = 0; + Depth = 0; + }; +}; + +URI Proxy; + +#endif |