7 #include <lib/base/object.h>
8 #include <lib/base/eptrlist.h>
9 #include <lib/base/ebase.h>
11 #include <lib/base/eerror.h>
12 #include <lib/network/socket.h>
13 #include <lib/network/serversocket.h>
15 class eHTTPConnection;
16 class eHTTPDataSource;
19 class eHTTPDataSource;
20 typedef ePtr<eHTTPDataSource> eHTTPDataSourcePtr;
22 class iHTTPPathResolver: public iObject
25 virtual ~iHTTPPathResolver() {};
26 virtual RESULT getDataSource(eHTTPDataSourcePtr &source, std::string request, std::string path, eHTTPConnection *conn)=0;
29 class eHTTPDataSource: public iObject
32 eHTTPConnection *connection;
34 eHTTPDataSource(eHTTPConnection *c);
35 virtual ~eHTTPDataSource();
36 virtual void haveData(void *data, int len);
37 virtual int doWrite(int bytes); // number of written bytes, -1 for "no more"
40 typedef ePtr<eHTTPDataSource> eHTTPDataSourcePtr;
42 class eHTTPError: public eHTTPDataSource
44 DECLARE_REF(eHTTPError);
47 eHTTPError(eHTTPConnection *c, int errcode);
50 int doWrite(int bytes);
53 class eHTTPConnection: public eSocket
55 void doError(int error);
57 int getLine(std::string &line);
59 int processLocalState();
60 int processRemoteState();
61 void writeString(const char *data);
63 eHTTPDataSourcePtr data;
70 void bytesWritten(int);
74 Signal1<void,int> transferDone;
75 Signal1<eHTTPDataSource*,eHTTPConnection*> createDataSource;
81 < If-modified-since: bla
85 > Content-Type: text/html
90 stateWait, stateRequest, stateResponse, stateHeader, stateData, stateDone, stateClose
92 int localstate, remotestate;
95 eHTTPConnection(int socket, int issocket, eHTTPD *parent, int persistent=0);
96 eHTTPConnection(eMainloop *ml); // ready to do "connectToHost"
97 static eHTTPConnection *doRequest(const char *uri, eMainloop *ml, int *error=0);
103 std::string request, requestpath, httpversion;
109 std::string code_descr;
111 std::map<std::string,std::string> remote_header, local_header;
114 int content_length, content_length_remaining;
117 class eHTTPD: public eServerSocket
119 friend class eHTTPConnection;
120 eSmartPtrList<iHTTPPathResolver> resolver;
123 eHTTPD(int port, eMainloop *ml);
124 void newConnection(int socket);
126 void addResolver(iHTTPPathResolver *r) { resolver.push_back(r); }
127 void removeResolver(iHTTPPathResolver *r) { resolver.remove(r); }