7 #include <lib/base/eptrlist.h>
8 #include <lib/base/ebase.h>
9 #include <lib/base/estring.h>
10 #include <lib/base/eerror.h>
11 #include <lib/socket/socket.h>
12 #include <lib/socket/serversocket.h>
14 class eHTTPConnection
;
15 class eHTTPDataSource
;
18 class eHTTPPathResolver
21 virtual ~eHTTPPathResolver() {};
22 virtual eHTTPDataSource
*getDataSource(eString request
, eString path
, eHTTPConnection
*conn
)=0;
25 class eHTTPLogResolver
: public eHTTPPathResolver
29 eHTTPDataSource
*getDataSource(eString request
, eString path
, eHTTPConnection
*conn
);
35 eHTTPConnection
*connection
;
37 eHTTPDataSource(eHTTPConnection
*c
);
38 virtual ~eHTTPDataSource();
39 virtual void haveData(void *data
, int len
);
40 virtual int doWrite(int bytes
); // number of written bytes, -1 for "no more"
43 class eHTTPError
: public eHTTPDataSource
47 eHTTPError(eHTTPConnection
*c
, int errcode
);
50 int doWrite(int bytes
);
53 class eHTTPD
: public eServerSocket
55 friend class eHTTPConnection
;
56 ePtrList
<eHTTPPathResolver
> resolver
;
59 eHTTPD(int port
, eMainloop
*ml
);
60 void newConnection(int socket
);
62 void addResolver(eHTTPPathResolver
*r
) { resolver
.push_back(r
); }
63 void removeResolver(eHTTPPathResolver
*r
) { resolver
.remove(r
); }
67 class eHTTPConnection
: public eSocket
69 void doError(int error
);
71 int getLine(eString
&line
);
73 int processLocalState();
74 int processRemoteState();
75 void writeString(const char *data
);
77 eHTTPDataSource
*data
;
84 void bytesWritten(int);
88 Signal1
<void,int> transferDone
;
89 Signal1
<eHTTPDataSource
*,eHTTPConnection
*> createDataSource
;
95 < If-modified-since: bla
99 > Content-Type: text/html
104 stateWait
, stateRequest
, stateResponse
, stateHeader
, stateData
, stateDone
, stateClose
106 int localstate
, remotestate
;
109 eHTTPConnection(int socket
, int issocket
, eHTTPD
*parent
, int persistent
=0);
110 eHTTPConnection(eMainloop
*ml
); // ready to do "connectToHost"
111 static eHTTPConnection
*doRequest(const char *uri
, eMainloop
*ml
, int *error
=0);
117 eString request
, requestpath
, httpversion
;
125 std::map
<eString
,eString
> remote_header
, local_header
;
128 int content_length
, content_length_remaining
;
130 eString
RemoteHost() { return parent
->RemoteHost(); }