- apply Progeny's redir and authentication patch
[apt.git] / methods / http.h
1 // -*- mode: cpp; mode: fold -*-
2 // Description                                                          /*{{{*/// $Id: http.h,v 1.2 2002/07/25 18:07:19 niemeyer Exp $
3 // $Id: http.h,v 1.2 2002/07/25 18:07:19 niemeyer Exp $
4 /* ######################################################################
5
6    HTTP Aquire Method - This is the HTTP aquire method for APT.
7
8    ##################################################################### */
9                                                                         /*}}}*/
10
11 #ifndef APT_HTTP_H
12 #define APT_HTTP_H
13
14 #define MAXLEN 360
15
16 #include <iostream>
17
18 using std::cout;
19 using std::endl;
20
21 class HttpMethod;
22
23 class CircleBuf
24 {
25    unsigned char *Buf;
26    unsigned long Size;
27    unsigned long InP;
28    unsigned long OutP;
29    string OutQueue;
30    unsigned long StrPos;
31    unsigned long MaxGet;
32    struct timeval Start;
33    
34    unsigned long LeftRead()
35    {
36       unsigned long Sz = Size - (InP - OutP);
37       if (Sz > Size - (InP%Size))
38          Sz = Size - (InP%Size);
39       return Sz;
40    }
41    unsigned long LeftWrite()
42    {
43       unsigned long Sz = InP - OutP;
44       if (InP > MaxGet)
45          Sz = MaxGet - OutP;
46       if (Sz > Size - (OutP%Size))
47          Sz = Size - (OutP%Size);
48       return Sz;
49    }
50    void FillOut();
51    
52    public:
53    
54    Hashes *Hash;
55    
56    // Read data in
57    bool Read(int Fd);
58    bool Read(string Data);
59    
60    // Write data out
61    bool Write(int Fd);
62    bool WriteTillEl(string &Data,bool Single = false);
63    
64    // Control the write limit
65    void Limit(long Max) {if (Max == -1) MaxGet = 0-1; else MaxGet = OutP + Max;}   
66    bool IsLimit() {return MaxGet == OutP;};
67    void Print() {cout << MaxGet << ',' << OutP << endl;};
68
69    // Test for free space in the buffer
70    bool ReadSpace() {return Size - (InP - OutP) > 0;};
71    bool WriteSpace() {return InP - OutP > 0;};
72
73    // Dump everything
74    void Reset();
75    void Stats();
76
77    CircleBuf(unsigned long Size);
78    ~CircleBuf() {delete [] Buf; delete Hash;};
79 };
80
81 struct ServerState
82 {
83    // This is the last parsed Header Line
84    unsigned int Major;
85    unsigned int Minor;
86    unsigned int Result;
87    char Code[MAXLEN];
88    
89    // These are some statistics from the last parsed header lines
90    unsigned long Size;
91    signed long StartPos;
92    time_t Date;
93    bool HaveContent;
94    enum {Chunked,Stream,Closes} Encoding;
95    enum {Header, Data} State;
96    bool Persistent;
97    string Location;
98    string Realm, ProxyRealm;
99    
100    // This is a Persistent attribute of the server itself.
101    bool Pipeline;
102    
103    HttpMethod *Owner;
104    
105    // This is the connection itself. Output is data FROM the server
106    CircleBuf In;
107    CircleBuf Out;
108    int ServerFd;
109    URI ServerName;
110   
111    bool HeaderLine(string Line);
112    bool Comp(URI Other) {return Other.Host == ServerName.Host && Other.Port == ServerName.Port;};
113    void Reset() {Major = 0; Minor = 0; Result = 0; Size = 0; StartPos = 0;
114                  Encoding = Closes; time(&Date); ServerFd = -1; 
115                  Pipeline = true;};
116    int RunHeaders();
117    bool RunData();
118    
119    bool Open();
120    bool Close();
121    
122    ServerState(URI Srv,HttpMethod *Owner);
123    ~ServerState() {Close();};
124 };
125
126 class HttpMethod : public pkgAcqMethod
127 {
128    struct AuthRec
129    {
130       string Host;
131       string Realm;
132       string User;
133       string Password;
134    };
135
136    void SendReq(FetchItem *Itm,CircleBuf &Out);
137    bool Go(bool ToFile,ServerState *Srv);
138    bool Flush(ServerState *Srv);
139    bool ServerDie(ServerState *Srv);
140    int DealWithHeaders(FetchResult &Res,ServerState *Srv);
141
142    virtual bool Fetch(FetchItem *);
143    virtual bool Configuration(string Message);
144    
145    // In the event of a fatal signal this file will be closed and timestamped.
146    static string FailFile;
147    static int FailFd;
148    static time_t FailTime;
149    static void SigTerm(int);
150
151    string NextURI;
152    vector<AuthRec> AuthList;
153    
154    public:
155    friend class ServerState;
156
157    FileFd *File;
158    ServerState *Server;
159    
160    int Loop();
161    
162    HttpMethod() : pkgAcqMethod("1.2",Pipeline | SendConfig) 
163    {
164       File = 0;
165       Server = 0;
166    };
167 };
168
169 URI Proxy;
170
171 #endif