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
00046 #ifndef CCXX_URL_H_
00047 #define CCXX_URL_H_
00048
00049 #ifndef CCXX_CONFIG_H_
00050 #include <cc++/config.h>
00051 #endif
00052
00053 #ifndef CCXX_SOCKET_H_
00054 #include <cc++/socket.h>
00055 #endif
00056
00057 #ifdef CCXX_NAMESPACES
00058 namespace ost {
00059 #endif
00060
00067 class __EXPORT URLStream : public TCPStream
00068 {
00069 public:
00073 typedef enum
00074 {
00075 errSuccess = 0,
00076 errUnreachable,
00077 errMissing,
00078 errDenied,
00079 errInvalid,
00080 errForbidden,
00081 errUnauthorized,
00082 errRelocated,
00083 errFailure,
00084 errTimeout,
00085 errInterface
00086 } Error;
00087
00091 typedef enum
00092 {
00093 authAnonymous = 0,
00094 authBasic
00095 } Authentication;
00096
00100 typedef enum
00101 {
00102 encodingBinary = 0,
00103 encodingChunked
00104 } Encoding;
00105
00109 typedef enum
00110 {
00111 methodHttpGet,
00112 methodHttpPut,
00113 methodHttpPost,
00114 methodFtpGet,
00115 methodFtpPut,
00116 methodFileGet,
00117 methodFilePut
00118 } Method;
00119
00123 typedef enum
00124 {
00125 protocolHttp1_0,
00126 protocolHttp1_1
00127 } Protocol;
00128
00129 private:
00130 const char *agent, *referer, *cookie, *pragma, *user, *password;
00131 const char *localif;
00132 InetHostAddress proxyHost;
00133 tpport_t proxyPort;
00134 Method urlmethod;
00135 Encoding encoding;
00136 Protocol protocol;
00137 Authentication auth;
00138 timeout_t timeout;
00139 bool persistent;
00140 bool follow;
00141 unsigned chunk;
00142
00143 Error getHTTPHeaders();
00144 URLStream(const URLStream& rhs);
00145
00146 protected:
00147 Error sendHTTPHeader(const char *url, const char **vars, int bufsize);
00148 int underflow(void);
00149
00150 virtual int aRead(char *buffer, size_t len, timeout_t timeout)
00151 #ifndef __MINGW32__
00152 {return ::read(so, buffer, len);};
00153 #else
00154 {return ::recv(so, buffer, len, 0); };
00155 #endif
00156
00157 virtual int aWrite(char *buffer, size_t len, timeout_t timeout)
00158 #ifndef __MINGW32__
00159 {return ::write(so, buffer, len);};
00160 #else
00161 {return ::send(so, buffer, len, 0); };
00162 #endif
00163
00170 virtual void httpHeader(const char *header, const char *value)
00171 {return;};
00172
00178 virtual char **extraHeader(void)
00179 {return NULL;};
00180
00181 public:
00187 URLStream(timeout_t to = 0);
00188
00196 URLStream &getline(char *buffer, size_t len);
00197
00205 Error get(const char *url, int buffer = 512);
00206
00216 Error submit(const char *url, const char **vars, int buffer = 512);
00217
00226 Error post(const char *url, const char **vars, int buffer = 512);
00227
00235 Error head(const char *url, int buffer = 512);
00236
00240 void close();
00241
00247 void setReferer(const char *str);
00248
00254 inline void setCookie(const char *str)
00255 {cookie = str;};
00256
00262 inline void setUser(const char *str)
00263 {user = str;};
00264
00270 inline void setPassword(const char *str)
00271 {password = str;};
00272
00279 void setAuthentication(Authentication a, const char *str = NULL);
00280
00286 inline void setPragma(const char *str)
00287 {pragma = str;};
00288
00295 void setProxy(const char *host, tpport_t port);
00296
00302 inline void setAgent(const char *str)
00303 {agent = str;};
00304
00310 inline Method getMethod(void)
00311 {return urlmethod;};
00312
00319 inline void setTimeout(timeout_t to)
00320 {timeout = to;};
00321
00328 inline void setFollow(bool enable)
00329 {follow = enable;};
00330
00336 inline void setProtocol(Protocol pro)
00337 {protocol = pro;};
00343 inline void setLocalInterface(const char *intf)
00344 {localif=intf;}
00345 };
00346
00352 __EXPORT char* urlDecode(char *source, char *dest = NULL);
00353
00360 __EXPORT char* urlEncode(const char *source, char *dest, unsigned size);
00361
00372 __EXPORT char* b64Decode(char *src, char *dest = NULL);
00373
00385 __EXPORT char* b64Encode(const char *source, char *dest, unsigned size);
00386
00398 __EXPORT size_t b64Encode(const unsigned char *src, size_t srcsize,
00399 char *dst, size_t dstsize);
00400
00410 __EXPORT size_t b64Decode(const char *src,
00411 unsigned char *dst, size_t dstsize);
00412
00418 __EXPORT String b64Encode(const String& src);
00419
00427 __EXPORT String b64Decode(const String& src);
00428
00435 __EXPORT String b64Encode(const unsigned char *src, size_t srcsize);
00436
00446 __EXPORT size_t b64Decode(const String& src,
00447 unsigned char *dst, size_t dstsize);
00448
00449
00450 #ifdef CCXX_NAMESPACES
00451 };
00452 #endif
00453
00454 #endif
00455