00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #ifndef CCXX_URL_H_
00042 #define CCXX_URL_H_
00043
00044 #ifndef CCXX_CONFIG_H_
00045 #include <cc++/config.h>
00046 #endif
00047
00048 #ifndef CCXX_SOCKET_H_
00049 #include <cc++/socket.h>
00050 #endif
00051
00052 #ifdef CCXX_NAMESPACES
00053 namespace ost {
00054 #endif
00055
00056 typedef enum
00057 {
00058 URL_SUCCESS = 0,
00059 URL_UNREACHABLE,
00060 URL_MISSING,
00061 URL_DENIED,
00062 URL_INVALID,
00063 URL_FORBIDDEN,
00064 URL_UNAUTHORIZED,
00065 URL_RELOCATED,
00066 URL_FAILURE,
00067 URL_TIMEOUT
00068 } urlerror_t;
00069
00070 typedef enum
00071 {
00072 URL_ANONYMOUS_AUTH = 0,
00073 URL_BASIC_AUTH
00074 } urlauth_t;
00075
00076 typedef enum
00077 {
00078 URL_BINARY_ENCODING = 0,
00079 URL_CHUNKED_ENCODING
00080 } urlencoding_t;
00081
00082 typedef enum
00083 {
00084 HTTP_GET_METHOD,
00085 HTTP_PUT_METHOD,
00086 HTTP_POST_METHOD,
00087 FTP_GET_METHOD,
00088 FTP_PUT_METHOD,
00089 FILE_GET_METHOD,
00090 FILE_PUT_METHOD
00091 } urlmethod_t;
00092
00093 typedef enum
00094 {
00095 HTTP_PROTOCOL_1_0,
00096 HTTP_PROTOCOL_1_1
00097 } urlprotocol_t;
00098
00099 class CCXX_CLASS_EXPORT URLStream;
00100
00107 class CCXX_CLASS_EXPORT URLStream : public TCPStream
00108 {
00109 private:
00110 const char *agent, *referer, *cookie, *pragma, *user, *password;
00111 InetHostAddress proxyHost, prevHost;
00112 tpport_t proxyPort, prevPort;
00113 InetHostAddress refhost;
00114 urlmethod_t urlmethod;
00115 urlencoding_t encoding;
00116 urlprotocol_t protocol;
00117 urlauth_t auth;
00118 timeout_t timeout;
00119 bool persistent;
00120 bool follow;
00121 unsigned chunk;
00122 char authbuf[128];
00123
00124 urlerror_t getHTTPHeaders(char *buffer, unsigned bufsize);
00125
00126 protected:
00127 urlerror_t sendHTTPHeader(const char *path, const char **vars, int bufsize);
00128 int underflow(void);
00129
00136 virtual void httpHeader(const char *header, const char *value)
00137 {return;};
00138
00144 virtual char **extraHeader(void)
00145 {return NULL;};
00146
00147 public:
00151 URLStream();
00152
00160 URLStream &getline(char *buffer, size_t len);
00161
00169 urlerror_t Get(const char *path, int buffer = 512);
00170
00180 urlerror_t Submit(const char *path, const char **vars, int buffer = 512);
00181
00190 urlerror_t Post(const char *path, const char **vars, int buffer = 512);
00191
00199 urlerror_t Head(const char *path, int buffer = 512);
00200
00204 void Close();
00205
00211 void setReferer(const char *str);
00212
00218 inline void setCookie(const char *str)
00219 {cookie = str;};
00220
00226 inline void setUser(const char *str)
00227 {user = str;};
00228
00234 inline void setPassword(const char *str)
00235 {password = str;};
00236
00242 void setAuthentication(urlauth_t a, const char *str = NULL);
00243
00249 inline void setPragma(const char *str)
00250 {pragma = str;};
00251
00258 void setProxy(const char *host, tpport_t port);
00259
00265 inline void setAgent(const char *str)
00266 {agent = str;};
00267
00273 inline urlmethod_t getMethod(void)
00274 {return urlmethod;};
00275
00282 inline void setTimeout(timeout_t to)
00283 {timeout = to;};
00284
00291 inline void setFollow(bool enable)
00292 {follow = enable;};
00293
00299 inline void setProtocol(urlprotocol_t pro)
00300 {protocol = pro;};
00301 };
00302
00303 extern CCXX_EXPORT(char*) urldecode(char *source, char *dest = NULL);
00304 extern CCXX_EXPORT(char*) urlencode(const char *source, char *dest, unsigned size);
00305 extern CCXX_EXPORT(char*) b64decode(char *source, char *dest = NULL);
00306 extern CCXX_EXPORT(char*) b64encode(const char *source, char *dest, unsigned size);
00307
00308 #ifdef CCXX_NAMESPACES
00309 };
00310 #endif
00311
00312 #endif
00313