00001
00002
00003
00004
00005 #ifndef __WVHTTP_H
00006 #define __WVHTTP_H
00007
00008 #include "wvtcp.h"
00009 #include "wvstreamclone.h"
00010 #include "wvresolver.h"
00011 #include "wvhashtable.h"
00012
00013 class WvURL
00014 {
00015 public:
00016 WvURL(const WvString &url);
00017 ~WvURL();
00018
00019 bool isok() const
00020 { return port != 0 && (resolving || addr != NULL); }
00021 const WvString &errstr() const
00022 { return err; }
00023 bool resolve();
00024
00025 operator WvString () const;
00026
00027
00028 const WvIPPortAddr &getaddr() const
00029 { return *addr; }
00030 const WvString &getfile() const
00031 { return file; }
00032
00033 protected:
00034 WvString hostname;
00035 int port;
00036 bool resolving;
00037 WvResolver dns;
00038 WvIPPortAddr *addr;
00039 WvString file, err;
00040 };
00041
00042
00043 struct WvHTTPHeader
00044 {
00045 WvString name, value;
00046
00047 WvHTTPHeader(const WvString &_name, const WvString &_value)
00048 : name(_name), value(_value)
00049 {}
00050 };
00051
00052
00053 DeclareWvDict(WvHTTPHeader, WvString, name);
00054
00059 class WvHTTPStream : public WvStreamClone
00060 {
00061 public:
00062 enum State {Resolving = 0, Connecting, ReadHeader1, ReadHeader, ReadData,
00063 Done};
00064 WvHTTPHeaderDict headers;
00065 WvHTTPHeaderDict client_headers;
00066 size_t num_received;
00067
00071 WvHTTPStream(WvURL &_url);
00072 ~WvHTTPStream();
00073
00074 virtual bool isok() const;
00075 virtual int geterr() const;
00076 virtual const char *errstr() const;
00077 virtual bool pre_select(SelectInfo &si);
00078 virtual size_t uread(void *buf, size_t count);
00079
00080 public:
00081 WvURL &url;
00082 WvTCPConn *http;
00083 State state;
00084 };
00085
00086 #endif // __WVHTTP_H