You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

147 lines
3.4 KiB

// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/// $Id: http.h,v 1.6 1998/12/10 05:39:56 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 header lines
unsigned long Size;
signed long StartPos;
time_t Date;
bool HaveContent;
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;};
int 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);
virtual bool Fetch(FetchItem *);
virtual bool Configuration(string Message);
// In the event of a fatal signal this file will be closed and timestamped.
static string FailFile;
static int FailFd;
static time_t FailTime;
static void SigTerm(int);
public:
friend ServerState;
FileFd *File;
ServerState *Server;
int Loop();
HttpMethod() : pkgAcqMethod("1.2",Pipeline | SendConfig)
{
File = 0;
Server = 0;
};
};
URI Proxy;
#endif