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 *proxyUser, *proxyPasswd;
00132
const char *localif;
00133
IPV4Host proxyHost;
00134
#ifdef CCXX_IPV6
00135
IPV6Host v6proxyHost;
00136
#endif
00137
tpport_t proxyPort;
00138 Method urlmethod;
00139 Encoding encoding;
00140 Protocol protocol;
00141 Authentication auth;
00142 Authentication proxyAuth;
00143
timeout_t timeout;
00144
bool persistent;
00145
bool follow;
00146
unsigned chunk;
00147
00148 Error getHTTPHeaders();
00149 URLStream(
const URLStream& rhs);
00150
00151
protected:
00152 ost::String m_host, m_address;
00153
00154 Error sendHTTPHeader(
const char *url,
const char **vars, size_t bufsize);
00155
int underflow(
void);
00156
00157 virtual int aRead(
char *buffer, size_t len,
timeout_t timer)
00158 #ifndef __MINGW32__
00159 {return ::read((
int)so, buffer, _IOLEN64 len);};
00160
#else
00161
{return ::recv(so, buffer, _IOLEN64 len, 0); };
00162
#endif
00163
00164 virtual int aWrite(
char *buffer, size_t len,
timeout_t timer)
00165 #ifndef __MINGW32__
00166 {return ::write((
int)so, buffer, _IOLEN64 len);};
00167
#else
00168
{return ::send((
int)so, buffer, _IOLEN64 len, 0); };
00169
#endif
00170
00177 virtual void httpHeader(
const char *header,
const char *value)
00178 {
return;};
00179
00185 virtual char **extraHeader(
void)
00186 {
return NULL;};
00187
00188
public:
00194 URLStream(Family family = IPV4,
timeout_t to = 0);
00195
00203 URLStream &getline(
char *buffer, size_t len);
00204
00212 Error get(
const char *url, size_t buffer = 512);
00213
00222 Error get(size_t buffer = 512);
00223
00233 Error submit(
const char *url,
const char **vars, size_t buffer = 512);
00234
00243 Error post(
const char *url,
const char **vars, size_t buffer = 512);
00244
00252 Error head(
const char *url, size_t buffer = 512);
00253
00257
void close();
00258
00264
void setReferer(
const char *str);
00265
00271 inline void setHost(
const char *str)
00272 {m_host = str;};
00273
00279 inline void setAddress(
const char *str)
00280 {m_address = str;};
00281
00287 inline void setCookie(
const char *str)
00288 {cookie = str;};
00289
00295 inline void setUser(
const char *str)
00296 {user = str;};
00297
00303 inline void setPassword(
const char *str)
00304 {password = str;};
00305
00312
void setAuthentication(Authentication a,
const char *str = NULL);
00313
00319 inline void setProxyUser(
const char *str)
00320 {proxyUser = str;};
00321
00327 inline void setProxyPassword(
const char *str)
00328 {proxyPasswd = str;};
00329
00336
void setProxyAuthentication(Authentication a,
const char *str = NULL);
00337
00343 inline void setPragma(
const char *str)
00344 {pragma = str;};
00345
00352
void setProxy(
const char *host,
tpport_t port);
00353
00359 inline void setAgent(
const char *str)
00360 {agent = str;};
00361
00367 inline Method getMethod(
void)
00368 {
return urlmethod;};
00369
00376 inline void setTimeout(
timeout_t to)
00377 {timeout = to;};
00378
00385 inline void setFollow(
bool enable)
00386 {follow = enable;};
00387
00393 inline void setProtocol(Protocol pro)
00394 {protocol = pro;};
00400 inline void setLocalInterface(
const char *intf)
00401 {localif=intf;}
00402 };
00403
00409 __EXPORT
char* urlDecode(
char *source,
char *dest = NULL);
00410
00417 __EXPORT
char* urlEncode(
const char *source,
char *dest, size_t size);
00418
00429 __EXPORT
char* b64Decode(
char *src,
char *dest = NULL);
00430
00442 __EXPORT
char* b64Encode(
const char *source,
char *dest, size_t size);
00443
00455 __EXPORT size_t b64Encode(
const unsigned char *src, size_t srcsize,
00456
char *dst, size_t dstsize);
00457
00467 __EXPORT size_t b64Decode(
const char *src,
00468
unsigned char *dst, size_t dstsize);
00469
00475 __EXPORT String b64Encode(
const String& src);
00476
00484 __EXPORT String b64Decode(
const String& src);
00485
00492 __EXPORT String b64Encode(
const unsigned char *src, size_t srcsize);
00493
00503 __EXPORT size_t b64Decode(
const String& src,
00504
unsigned char *dst, size_t dstsize);
00505
00506
00507
#ifdef CCXX_NAMESPACES
00508
}
00509
#endif
00510
00511
#endif
00512