00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifdef HAVE_CONFIG_H
00014 # include <config.h>
00015 #endif
00016
00017
00018 #include "url_p.h"
00019 #include "urlfns.h"
00020 #include <gwenhywfar/debug.h>
00021
00022
00023 GWEN_URL *GWEN_Url_fromString(const char *str) {
00024 GWEN_URL *url;
00025 GWEN_DB_NODE *dbVars;
00026 const char *s;
00027 const char *p;
00028
00029 url=GWEN_Url_new();
00030 dbVars=GWEN_DB_Group_new("vars");
00031 GWEN_Url_SetVars(url, dbVars);
00032 GWEN_DB_Group_free(dbVars);
00033 dbVars=0;
00034
00035 s=str;
00036
00037 p=strchr(s, ':');
00038 if (p) {
00039 char *buf;
00040
00041
00042 buf=(char*)malloc(p-s+1);
00043 assert(buf);
00044 memmove(buf, s, p-s+1);
00045 buf[p-s]=0;
00046 GWEN_Url_SetProtocol(url, buf);
00047 free(buf);
00048 s=p+1;
00049 }
00050
00051
00052 if (*s=='/')
00053 s++;
00054 if (*s=='/')
00055 s++;
00056
00057
00058 if (!*s) {
00059 DBG_ERROR(GWEN_LOGDOMAIN, "No server given");
00060 GWEN_Url_free(url);
00061 return 0;
00062 }
00063
00064 p=strchr(s, '@');
00065 if (p) {
00066 char *upw;
00067 char *pw;
00068 char *pat;
00069
00070 upw=(char*)malloc(p-s+1);
00071 assert(upw);
00072 memmove(upw, s, p-s);
00073 upw[p-s]=0;
00074 pw=strchr(upw, ':');
00075 if (pw) {
00076
00077 *pw=0;
00078 pw++;
00079 }
00080 pat=strchr(upw, '%');
00081 if (pat)
00082 *pat='@';
00083 GWEN_Url_SetUserName(url, upw);
00084 if (pw)
00085 GWEN_Url_SetPassword(url, pw);
00086 free(upw);
00087 s=p+1;
00088 }
00089
00090
00091 if (!*s) {
00092 DBG_ERROR(GWEN_LOGDOMAIN, "No server given");
00093 GWEN_Url_free(url);
00094 return 0;
00095 }
00096 p=s;
00097 while(*p && *p!=':' && *p!='/' && *p!='?')
00098 p++;
00099 if (p!=s) {
00100 char *buf;
00101
00102
00103 buf=(char*)malloc(p-s+1);
00104 assert(buf);
00105 memmove(buf, s, p-s+1);
00106 buf[p-s]=0;
00107 GWEN_Url_SetServer(url, buf);
00108 free(buf);
00109 s=p;
00110 }
00111
00112
00113 if (*s==':') {
00114 p=++s;
00115 while(*p && *p!='?' && *p!='/')
00116 p++;
00117 if (p!=s) {
00118 char *buf;
00119 int port;
00120
00121
00122 buf=(char*)malloc(p-s+1);
00123 assert(buf);
00124 memmove(buf, s, p-s+1);
00125 buf[p-s]=0;
00126 if (sscanf(buf, "%d", &port)!=1) {
00127 DBG_ERROR(GWEN_LOGDOMAIN, "Bad port (%s)", buf);
00128 free(buf);
00129 abort();
00130 }
00131 url->port=port;
00132 free(buf);
00133 s=p;
00134 }
00135 }
00136 else {
00137 if (url->protocol) {
00138 if (strcasecmp(url->protocol, "http")==0)
00139 url->port=80;
00140 else if (strcasecmp(url->protocol, "https")==0)
00141 url->port=443;
00142 }
00143 }
00144
00145
00146 if (*s=='/') {
00147 p=s;
00148 while(*p && *p!='?')
00149 p++;
00150 if (p!=s) {
00151 char *buf;
00152
00153
00154 buf=(char*)malloc(p-s+1);
00155 assert(buf);
00156 memmove(buf, s, p-s+1);
00157 buf[p-s]=0;
00158 GWEN_Url_SetPath(url, buf);
00159 free(buf);
00160 s=p;
00161 }
00162 }
00163 else {
00164 GWEN_Url_SetPath(url, "/");
00165 if (*s)
00166 s++;
00167 }
00168
00169
00170 while(*s && *s=='?') {
00171 GWEN_BUFFER *bName;
00172 GWEN_BUFFER *bValue;
00173
00174 bName=GWEN_Buffer_new(0, 256, 0, 1);
00175 bValue=GWEN_Buffer_new(0, 256, 0, 1);
00176 s++;
00177 p=s;
00178 while(*p && *p!='?' && *p!='=')
00179 p++;
00180 if (p!=s)
00181 GWEN_Buffer_AppendBytes(bName, s, (p-s));
00182 s=p;
00183 if (*p=='=') {
00184 s++;
00185 p=s;
00186 while(*p && *p!='?')
00187 p++;
00188 if (p!=s)
00189 GWEN_Buffer_AppendBytes(bValue, s, (p-s));
00190 s=p;
00191 }
00192
00193 if (GWEN_Buffer_GetUsedBytes(bName))
00194 GWEN_DB_SetCharValue(GWEN_Url_GetVars(url),
00195 GWEN_DB_FLAGS_DEFAULT,
00196 GWEN_Buffer_GetStart(bName),
00197 GWEN_Buffer_GetStart(bValue));
00198 GWEN_Buffer_free(bValue);
00199 GWEN_Buffer_free(bName);
00200 }
00201
00202 url->url=strdup(str);
00203 url->_modified=0;
00204 return url;
00205 }
00206
00207
00208
00209 int GWEN_Url_toString(const GWEN_URL *url, GWEN_BUFFER *buf) {
00210 assert(url);
00211 if (!url->_modified && !(url->url==0 || url->url[0]==0)) {
00212 GWEN_Buffer_AppendString(buf, url->url);
00213 }
00214 else {
00215 GWEN_DB_NODE *dbV;
00216
00217 if (url->protocol) {
00218 GWEN_Buffer_AppendString(buf, url->protocol);
00219 GWEN_Buffer_AppendString(buf, "://");
00220 }
00221 if (url->server) {
00222 GWEN_Buffer_AppendString(buf, url->server);
00223 }
00224 if (url->port) {
00225 char numbuf[32];
00226
00227 snprintf(numbuf, sizeof(numbuf), "%d", url->port);
00228 GWEN_Buffer_AppendString(buf, ":");
00229 GWEN_Buffer_AppendString(buf, numbuf);
00230 }
00231 if (url->path) {
00232 GWEN_Buffer_AppendString(buf, url->path);
00233 }
00234 if (url->vars) {
00235 dbV=GWEN_DB_GetFirstVar(url->vars);
00236 while(dbV) {
00237 const char *s;
00238
00239 s=GWEN_DB_VariableName(dbV);
00240 if (s) {
00241 GWEN_DB_NODE *dbVal;
00242
00243 GWEN_Buffer_AppendString(buf, "?");
00244 GWEN_Buffer_AppendString(buf, s);
00245 dbVal=GWEN_DB_GetFirstValue(dbV);
00246 if (dbVal) {
00247 s=GWEN_DB_GetCharValueFromNode(dbVal);
00248 if (s) {
00249 GWEN_Buffer_AppendString(buf, "=");
00250 GWEN_Buffer_AppendString(buf, s);
00251 }
00252 }
00253 }
00254 dbV=GWEN_DB_GetNextVar(dbV);
00255 }
00256 }
00257 }
00258 return 0;
00259 }
00260
00261
00262
00263 GWEN_URL *GWEN_Url_fromCommandString(const char *str) {
00264 GWEN_URL *url;
00265 GWEN_DB_NODE *dbVars;
00266 const char *s;
00267 const char *p;
00268
00269 url=GWEN_Url_new();
00270 dbVars=GWEN_DB_Group_new("vars");
00271 GWEN_Url_SetVars(url, dbVars);
00272 GWEN_DB_Group_free(dbVars);
00273 dbVars=0;
00274
00275 s=str;
00276
00277
00278 if (*s=='/') {
00279 p=s;
00280 while(*p && *p!='?')
00281 p++;
00282 if (p!=s) {
00283 char *buf;
00284
00285
00286 buf=(char*)malloc(p-s+1);
00287 assert(buf);
00288 memmove(buf, s, p-s+1);
00289 buf[p-s]=0;
00290 GWEN_Url_SetPath(url, buf);
00291 free(buf);
00292 s=p;
00293 }
00294 }
00295 else {
00296 GWEN_Url_SetPath(url, "/");
00297 if (*s)
00298 s++;
00299 }
00300
00301
00302 while(*s && *s=='?') {
00303 GWEN_BUFFER *bName;
00304 GWEN_BUFFER *bValue;
00305
00306 bName=GWEN_Buffer_new(0, 256, 0, 1);
00307 bValue=GWEN_Buffer_new(0, 256, 0, 1);
00308 s++;
00309 p=s;
00310 while(*p && *p!='?' && *p!='=')
00311 p++;
00312 if (p!=s)
00313 GWEN_Buffer_AppendBytes(bName, s, (p-s));
00314 s=p;
00315 if (*p=='=') {
00316 s++;
00317 p=s;
00318 while(*p && *p!='?')
00319 p++;
00320 if (p!=s)
00321 GWEN_Buffer_AppendBytes(bValue, s, (p-s));
00322 s=p;
00323 }
00324
00325 if (GWEN_Buffer_GetUsedBytes(bName))
00326 GWEN_DB_SetCharValue(GWEN_Url_GetVars(url),
00327 GWEN_DB_FLAGS_DEFAULT,
00328 GWEN_Buffer_GetStart(bName),
00329 GWEN_Buffer_GetStart(bValue));
00330 GWEN_Buffer_free(bValue);
00331 GWEN_Buffer_free(bName);
00332 }
00333
00334 url->url=strdup(str);
00335
00336 return url;
00337 }
00338
00339
00340
00341 int GWEN_Url_toCommandString(const GWEN_URL *url, GWEN_BUFFER *buf) {
00342 GWEN_DB_NODE *dbV;
00343
00344 assert(url);
00345
00346 if (url->path) {
00347 GWEN_Buffer_AppendString(buf, url->path);
00348 }
00349 if (url->vars) {
00350 dbV=GWEN_DB_GetFirstVar(url->vars);
00351 while(dbV) {
00352 const char *s;
00353
00354 s=GWEN_DB_VariableName(dbV);
00355 if (s) {
00356 GWEN_DB_NODE *dbVal;
00357
00358 GWEN_Buffer_AppendString(buf, "?");
00359 GWEN_Buffer_AppendString(buf, s);
00360 dbVal=GWEN_DB_GetFirstValue(dbV);
00361 if (dbVal) {
00362 s=GWEN_DB_GetCharValueFromNode(dbVal);
00363 if (s) {
00364 GWEN_Buffer_AppendString(buf, "=");
00365 GWEN_Buffer_AppendString(buf, s);
00366 }
00367 }
00368 }
00369 dbV=GWEN_DB_GetNextVar(dbV);
00370 }
00371 }
00372
00373 return 0;
00374 }
00375
00376
00377