urlfns.c

Go to the documentation of this file.
00001 /***************************************************************************
00002  $RCSfile$
00003                              -------------------
00004     cvs         : $Id$
00005     begin       : Fri May 07 2004
00006     copyright   : (C) 2004 by Martin Preuss
00007     email       : martin@libchipcard.de
00008 
00009  ***************************************************************************
00010  *          Please see toplevel file COPYING for license details           *
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   /* read protocol (if any) */
00037   p=strchr(s, ':');
00038   if (p) {
00039     char *buf;
00040 
00041     /* got protocol settings */
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   /* skip slashes (if any) */
00052   if (*s=='/')
00053     s++;
00054   if (*s=='/')
00055     s++;
00056 
00057   /* read user/password */
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       /* there is also a password */
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   /* read server */
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     /* got server */
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   /* get port */
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       /* got port */
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   /* get path */
00146   if (*s=='/') {
00147     p=s;
00148     while(*p && *p!='?')
00149       p++;
00150     if (p!=s) {
00151       char *buf;
00152 
00153       /* got path */
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   /* read vars */
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     /* store variable/value pair */
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       } /* while */
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   /* get path */
00278   if (*s=='/') {
00279     p=s;
00280     while(*p && *p!='?')
00281       p++;
00282     if (p!=s) {
00283       char *buf;
00284 
00285       /* got path */
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   /* read vars */
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     /* store variable/value pair */
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 

Generated on Wed Jul 9 13:12:28 2008 for gwenhywfar by  doxygen 1.5.6