davidw      02/01/19 08:11:52

  Modified:    .        ChangeLog
               src      TclWeb.h TclWebapache.c TclWebcgi.c make.tcl
  Log:
  * src/TclWebapache.c: Added individual functions for CGI variable
    access.  Much simpler than trying to devise a data structure to
    pass them around with.
  
  Revision  Changes    Path
  1.21      +4 -0      tcl-rivet/ChangeLog
  
  Index: ChangeLog
  ===================================================================
  RCS file: /home/cvs/tcl-rivet/ChangeLog,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- ChangeLog 19 Jan 2002 12:39:12 -0000      1.20
  +++ ChangeLog 19 Jan 2002 16:11:52 -0000      1.21
  @@ -1,5 +1,9 @@
   2002-01-19  David N. Welton  <[EMAIL PROTECTED]>
   
  +     * src/TclWebapache.c: Added individual functions for CGI variable
  +     access.  Much simpler than trying to devise a data structure to
  +     pass them around with.
  +
        * src/rivetCore.c (Rivet_LoadEnv): Roll back authorization
        information command.
   
  
  
  
  1.3       +2 -10     tcl-rivet/src/TclWeb.h
  
  Index: TclWeb.h
  ===================================================================
  RCS file: /home/cvs/tcl-rivet/src/TclWeb.h,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- TclWeb.h  18 Jan 2002 20:07:18 -0000      1.2
  +++ TclWeb.h  19 Jan 2002 16:11:52 -0000      1.3
  @@ -3,7 +3,6 @@
    *   Common API layer.
    */
   
  -
   /*
    
*-----------------------------------------------------------------------------
    *
  @@ -64,23 +63,16 @@
    
*-----------------------------------------------------------------------------
    */
   
  -int TclWeb_Cookie(Tcl_Obj *list, TclWebRequest *req);
  -
  -int TclWeb_GetCookie(Tcl_Obj *list, TclWebRequest *req);
   
  -int TclWeb_GetCGIVars(Tcl_Obj *list, TclWebRequest *req);
  +int TclWeb_GetCookieVars(Tcl_Obj *cookievar, TclWebRequest *req);
   
  -int TclWeb_GetEnvVars(Tcl_HashTable *envs, TclWebRequest *req);
  +int TclWeb_GetEnvVars(Tcl_Obj *envs, TclWebRequest *req);
   
   /* upload stuff goes here */
   
   int TclWeb_Escape(char *out, char *in, int len, void *var);
   
   int TclWeb_UnEscape(char *out, char *in, int len, void *var);
  -
  -int TclWeb_Base64Encode(char *out, char *in, int len, TclWebRequest *req);
  -
  -int TclWeb_Base64Decode(char *out, char *in, int len, TclWebRequest *req);
   
   int TclWeb_EscapeShellCommand(char *out, char *in, TclWebRequest *req);
   
  
  
  
  1.3       +228 -75   tcl-rivet/src/TclWebapache.c
  
  Index: TclWebapache.c
  ===================================================================
  RCS file: /home/cvs/tcl-rivet/src/TclWebapache.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- TclWebapache.c    18 Jan 2002 20:07:18 -0000      1.2
  +++ TclWebapache.c    19 Jan 2002 16:11:52 -0000      1.3
  @@ -7,30 +7,37 @@
    * operations.
    */
   
  -/* $Id: TclWebapache.c,v 1.2 2002/01/18 20:07:18 davidw Exp $ */
  +/* $Id: TclWebapache.c,v 1.3 2002/01/19 16:11:52 davidw Exp $ */
   
   #include <tcl.h>
  -#include "TclWeb.h"
   
  -typedef struct _TclWebRequest {
  +#include "apache_request.h"
  +#include "apache_cookie.h"
  +#include "mod_rivet.h"
  +
  +#define TCLWEBPOOL req->req->pool
  +
  +typedef struct TclWebRequest {
       Tcl_Interp *interp;
       request_rec *req;
       ApacheRequest *apachereq;
   } TclWebRequest;
   
  +#include "TclWeb.h"
  +
   int
   TclWeb_InitRequest(TclWebRequest *req, void *arg)
   {
  -    req = Tcl_Alloc(sizeof(TclWebRequest));
  +    req = (TclWebRequest *)Tcl_Alloc(sizeof(TclWebRequest));
       req->req = (request_rec *)arg;
  -    req->apacherequest = ApacheRequest_new(r);
  +    req->apachereq = ApacheRequest_new(req->req);
       return TCL_OK;
   }
   
   int
   TclWeb_SendHeaders(TclWebRequest *req)
   {
  -    ap_send_header(req->req);
  +    ap_send_http_header(req->req);
       return TCL_OK;
   }
   
  @@ -48,22 +55,186 @@
       return TCL_OK;
   }
   
  +
  +int
  +TclWeb_GetVar(Tcl_Obj *result, char *varname, TclWebRequest *req)
  +{
  +    int i;
  +    array_header *parmsarray = ap_table_elts(req->apachereq->parms);
  +    table_entry *parms = (table_entry *)parmsarray->elts;
  +
  +    result = NULL;
  +
  +    /* This isn't real efficient - move to hash table later
  +       on... */
  +    for (i = 0; i < parmsarray->nelts; ++i)
  +    {
  +     if (!strncmp(varname, Rivet_StringToUtf(parms[i].key, TCLWEBPOOL), 
strlen(varname)))
  +     {
  +         /* The following makes sure that we get one string,
  +            with no sub lists. */
  +         if (result == NULL)
  +         {
  +             result = STRING_TO_UTF_TO_OBJ(parms[i].val, TCLWEBPOOL);
  +             Tcl_IncrRefCount(result);
  +         } else {
  +             Tcl_Obj *tmpobjv[2];
  +             tmpobjv[0] = result;
  +             tmpobjv[1] = STRING_TO_UTF_TO_OBJ(parms[i].val, TCLWEBPOOL);
  +             result = Tcl_ConcatObj(2, tmpobjv);
  +         }
  +     }
  +    }
  +
  +    if (result == NULL)
  +    {
  +     result = Tcl_NewStringObj("", -1);
  +     Tcl_IncrRefCount(result);
  +    }
  +
  +    return TCL_OK;
  +}
  +
  +int
  +TclWeb_GetVarAsList(Tcl_Obj *result, char *varname, TclWebRequest *req)
  +{
  +    int i;
  +    array_header *parmsarray = ap_table_elts(req->apachereq->parms);
  +    table_entry *parms = (table_entry *)parmsarray->elts;
  +
  +    /* This isn't real efficient - move to hash table later on. */
  +    for (i = 0; i < parmsarray->nelts; ++i)
  +    {
  +     if (!strncmp(varname, Rivet_StringToUtf(parms[i].key, TCLWEBPOOL), 
strlen(varname)))
  +     {
  +         if (result == NULL)
  +         {
  +             result = Tcl_NewObj();
  +             Tcl_IncrRefCount(result);
  +         }
  +         Tcl_ListObjAppendElement(req->interp, result,
  +                                  STRING_TO_UTF_TO_OBJ(parms[i].val, 
TCLWEBPOOL));
  +     }
  +    }
  +
  +    if (result == NULL)
  +    {
  +     result = Tcl_NewStringObj("", -1);
  +     Tcl_IncrRefCount(result);
  +    }
  +    return TCL_OK;
  +}
  +
  +int
  +TclWeb_GetAllVars(Tcl_Obj *result, TclWebRequest *req)
  +{
  +    int i;
  +    array_header *parmsarray = ap_table_elts(req->apachereq->parms);
  +    table_entry *parms = (table_entry *)parmsarray->elts;
  +
  +    result = Tcl_NewObj();
  +    Tcl_IncrRefCount(result);
  +    for (i = 0; i < parmsarray->nelts; ++i)
  +    {
  +     Tcl_ListObjAppendElement(req->interp, result,
  +                              STRING_TO_UTF_TO_OBJ(parms[i].key, 
TCLWEBPOOL));
  +     Tcl_ListObjAppendElement(req->interp, result,
  +                              STRING_TO_UTF_TO_OBJ(parms[i].val, 
TCLWEBPOOL));
  +    }
  +
  +    if (result == NULL)
  +    {
  +     result = Tcl_NewStringObj("", -1);
  +     Tcl_IncrRefCount(result);
  +    }
  +
  +    return TCL_OK;
  +}
  +
  +int
  +TclWeb_GetVarNames(Tcl_Obj *result, TclWebRequest *req)
  +{
  +    int i;
  +    array_header *parmsarray = ap_table_elts(req->apachereq->parms);
  +    table_entry *parms = (table_entry *)parmsarray->elts;
  +
  +    result = Tcl_NewObj();
  +    Tcl_IncrRefCount(result);
  +
  +    result = Tcl_NewObj();
  +    Tcl_IncrRefCount(result);
  +    for (i = 0; i < parmsarray->nelts; ++i)
  +    {
  +     Tcl_ListObjAppendElement(req->interp, result,
  +                              STRING_TO_UTF_TO_OBJ(parms[i].key, 
TCLWEBPOOL));
  +    }
  +
  +    if (result == NULL)
  +    {
  +     result = Tcl_NewStringObj("", -1);
  +     Tcl_IncrRefCount(result);
  +    }
  +
  +    return TCL_OK;
  +}
  +
   int
  -TclWeb_GetCGIVars(Tcl_Obj *list, TclWebRequest *req)
  +TclWeb_VarExists(char *varname, TclWebRequest *req)
   {
  -    
  +    int i;
  +    array_header *parmsarray = ap_table_elts(req->apachereq->parms);
  +    table_entry *parms = (table_entry *)parmsarray->elts;
  +
  +    /* This isn't real efficient - move to hash table later on. */
  +    for (i = 0; i < parmsarray->nelts; ++i)
  +    {
  +     if (!strncmp(varname, Rivet_StringToUtf(parms[i].key, TCLWEBPOOL), 
strlen(varname)))
  +     {
  +         return TCL_OK;
  +     }
  +    }
  +    return TCL_ERROR;
  +}
  +
  +int
  +TclWeb_VarNumber(Tcl_Obj *result, TclWebRequest *req)
  +{
  +    array_header *parmsarray = ap_table_elts(req->apachereq->parms);
  +
  +    result = Tcl_NewIntObj(parmsarray->nelts);
  +    Tcl_IncrRefCount(result);
  +    return TCL_OK;
   }
   
   int
  -TclWeb_GetEnvVars(Tcl_HashTable *envs, TclWebRequest *req)
  +TclWeb_GetCookieVars(Tcl_Obj *cookievar, TclWebRequest *req)
  +{
  +    int i;
  +    ApacheCookieJar *cookies = ApacheCookie_parse(req->req, NULL);
  +
  +    for (i = 0; i < ApacheCookieJarItems(cookies); i++) {
  +     ApacheCookie *c = ApacheCookieJarFetch(cookies, i);
  +     int j;
  +     for (j = 0; j < ApacheCookieItems(c); j++) {
  +         char *name = c->name;
  +         char *value = ApacheCookieFetch(c, j);
  +         Tcl_ObjSetVar2(req->interp, cookievar,
  +                        Tcl_NewStringObj(name, -1),
  +                        Tcl_NewStringObj(value, -1), 0);
  +     }
  +    }
  +
  +    return TCL_OK;
  +}
  +
  +int
  +TclWeb_GetEnvVars(Tcl_Obj *envvar, TclWebRequest *req)
   {
       char *timefmt = DEFAULT_TIME_FORMAT;
   #ifndef WIN32
       struct passwd *pw;
   #endif /* ndef WIN32 */
       char *t;
  -    char *authorization = NULL;
  -
       time_t date;
   
       int i;
  @@ -72,7 +243,6 @@
       table_entry *hdrs;
       array_header *env_arr;
       table_entry  *env;
  -    Tcl_HashEntry *entry;
   
       date = req->req->request_time;
       /* ensure that the system area which holds the cgi variables is empty */
  @@ -88,77 +258,48 @@
       env_arr =  ap_table_elts(req->req->subprocess_env);
       env     = (table_entry *) env_arr->elts;
   
  -    if (envs == NULL)
  -    {
  -     Tcl_InitHashTable(envs, TCL_STRING_KEYS);
  -    }
  -
  -
  -    /* Get the user/pass info for Basic authentication */
  -    (const char*)authorization =
  -     ap_table_get(req->req->headers_in, "Authorization");
  -    if (authorization
  -     && !strcasecmp(ap_getword_nc(POOL, &authorization, ' '), "Basic"))
  -    {
  -     char *tmp;
  -     char *user;
  -     char *pass;
  -
  -     tmp = ap_pbase64decode(POOL, authorization);
  -     user = ap_getword_nulls_nc(POOL, &tmp, ':');
  -     pass = tmp;
  -     Tcl_ObjSetVar2(interp, Tcl_NewStringObj("::request::USER", -1),
  -                    Tcl_NewStringObj("user", -1),
  -                    STRING_TO_UTF_TO_OBJ(user, POOL),
  -                    0);
  -     Tcl_ObjSetVar2(interp, Tcl_NewStringObj("::request::USER", -1),
  -                    Tcl_NewStringObj("pass", -1),
  -                    STRING_TO_UTF_TO_OBJ(pass, POOL),
  -                    0);
  -    }
  -
       /* These were the "include vars"  */
  -    Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("DATE_LOCAL", -1),
  -                STRING_TO_UTF_TO_OBJ(ap_ht_time(POOL,
  -                                     date, timefmt, 0), POOL), 0);
  -    Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("DATE_GMT", -1),
  -                STRING_TO_UTF_TO_OBJ(ap_ht_time(POOL,
  -                                     date, timefmt, 1), POOL), 0);
  -    Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("LAST_MODIFIED", -1),
  -                STRING_TO_UTF_TO_OBJ(ap_ht_time(POOL,
  +    Tcl_ObjSetVar2(req->interp, envvar, Tcl_NewStringObj("DATE_LOCAL", -1),
  +                STRING_TO_UTF_TO_OBJ(ap_ht_time(TCLWEBPOOL,
  +                                     date, timefmt, 0), TCLWEBPOOL), 0);
  +    Tcl_ObjSetVar2(req->interp, envvar, Tcl_NewStringObj("DATE_GMT", -1),
  +                STRING_TO_UTF_TO_OBJ(ap_ht_time(TCLWEBPOOL,
  +                                     date, timefmt, 1), TCLWEBPOOL), 0);
  +    Tcl_ObjSetVar2(req->interp, envvar, Tcl_NewStringObj("LAST_MODIFIED", 
-1),
  +                STRING_TO_UTF_TO_OBJ(ap_ht_time(TCLWEBPOOL,
                                        req->req->finfo.st_mtime,
  -                                     timefmt, 0), POOL), 0);
  -    Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("DOCUMENT_URI", -1),
  -                STRING_TO_UTF_TO_OBJ(req->req->uri, POOL), 0);
  -    Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("DOCUMENT_PATH_INFO", 
-1),
  -                STRING_TO_UTF_TO_OBJ(req->req->path_info, POOL), 0);
  +                                     timefmt, 0), TCLWEBPOOL), 0);
  +    Tcl_ObjSetVar2(req->interp, envvar, Tcl_NewStringObj("DOCUMENT_URI", -1),
  +                STRING_TO_UTF_TO_OBJ(req->req->uri, TCLWEBPOOL), 0);
  +    Tcl_ObjSetVar2(req->interp, envvar, 
Tcl_NewStringObj("DOCUMENT_PATH_INFO", -1),
  +                STRING_TO_UTF_TO_OBJ(req->req->path_info, TCLWEBPOOL), 0);
   
   #ifndef WIN32
       pw = getpwuid(req->req->finfo.st_uid);
       if (pw)
  -     Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("USER_NAME", -1),
  -            STRING_TO_UTF_TO_OBJ(ap_pstrdup(POOL, pw->pw_name), POOL), 0);
  +     Tcl_ObjSetVar2(req->interp, envvar, Tcl_NewStringObj("USER_NAME", -1),
  +            STRING_TO_UTF_TO_OBJ(ap_pstrdup(TCLWEBPOOL, pw->pw_name), 
TCLWEBPOOL), 0);
       else
  -     Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("USER_NAME", -1),
  +     Tcl_ObjSetVar2(req->interp, envvar, Tcl_NewStringObj("USER_NAME", -1),
                       STRING_TO_UTF_TO_OBJ(
  -                        ap_psprintf(POOL, "user#%lu",
  -                        (unsigned long)req->req->finfo.st_uid), POOL), 0);
  +                        ap_psprintf(TCLWEBPOOL, "user#%lu",
  +                        (unsigned long)req->req->finfo.st_uid), TCLWEBPOOL), 
0);
   #endif
   
       if ((t = strrchr(req->req->filename, '/')))
  -     Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("DOCUMENT_NAME", -1),
  -                    STRING_TO_UTF_TO_OBJ(++t, POOL), 0);
  +     Tcl_ObjSetVar2(req->interp, envvar, Tcl_NewStringObj("DOCUMENT_NAME", 
-1),
  +                    STRING_TO_UTF_TO_OBJ(++t, TCLWEBPOOL), 0);
       else
  -     Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("DOCUMENT_NAME", -1),
  -                    STRING_TO_UTF_TO_OBJ(req->req->uri, POOL), 0);
  +     Tcl_ObjSetVar2(req->interp, envvar, Tcl_NewStringObj("DOCUMENT_NAME", 
-1),
  +                    STRING_TO_UTF_TO_OBJ(req->req->uri, TCLWEBPOOL), 0);
   
       if (req->req->args)
       {
  -     char *arg_copy = ap_pstrdup(POOL, req->req->args);
  +     char *arg_copy = ap_pstrdup(TCLWEBPOOL, req->req->args);
        ap_unescape_url(arg_copy);
  -     Tcl_ObjSetVar2(interp, ArrayObj,
  +     Tcl_ObjSetVar2(req->interp, envvar,
           Tcl_NewStringObj("QUERY_STRING_UNESCAPED", -1),
  -        STRING_TO_UTF_TO_OBJ(ap_escape_shell_cmd(POOL, arg_copy), POOL), 0);
  +        STRING_TO_UTF_TO_OBJ(ap_escape_shell_cmd(TCLWEBPOOL, arg_copy), 
TCLWEBPOOL), 0);
       }
   
       /* ----------------------------  */
  @@ -169,9 +310,9 @@
        if (!hdrs[i].key)
            continue;
        else {
  -         Tcl_ObjSetVar2(interp, ArrayObj,
  -                        STRING_TO_UTF_TO_OBJ(hdrs[i].key, POOL),
  -                        STRING_TO_UTF_TO_OBJ(hdrs[i].val, POOL), 0);
  +         Tcl_ObjSetVar2(req->interp, envvar,
  +                        STRING_TO_UTF_TO_OBJ(hdrs[i].key, TCLWEBPOOL),
  +                        STRING_TO_UTF_TO_OBJ(hdrs[i].val, TCLWEBPOOL), 0);
        }
       }
   
  @@ -180,8 +321,8 @@
       {
        if (!env[i].key)
            continue;
  -     Tcl_ObjSetVar2(interp, ArrayObj, STRING_TO_UTF_TO_OBJ(env[i].key, POOL),
  -                    STRING_TO_UTF_TO_OBJ(env[i].val, POOL), 0);
  +     Tcl_ObjSetVar2(req->interp, envvar, STRING_TO_UTF_TO_OBJ(env[i].key, 
TCLWEBPOOL),
  +                    STRING_TO_UTF_TO_OBJ(env[i].val, TCLWEBPOOL), 0);
       }
   
       /* cleanup system cgi variables */
  @@ -191,14 +332,26 @@
   }
   
   int
  -TclWeb_Base64Encode(char *out, char *in, int len, TclWebRequest *req);
  +TclWeb_Base64Encode(char *out, char *in, TclWebRequest *req)
  +{
  +    out = ap_pbase64encode(TCLWEBPOOL, in);
  +    return TCL_OK;
  +}
   
   int
  -TclWeb_Base64Decode(char *out, char *in, int len, TclWebRequest *req);
  +TclWeb_Base64Decode(char *out, char *in, TclWebRequest *req)
  +{
  +    out = ap_pbase64decode(TCLWEBPOOL, in);
  +    return TCL_OK;
  +}
   
   int
  -TclWeb_EscapeShellCommand(char *out, char *in, TclWebRequest *req);
  +TclWeb_EscapeShellCommand(char *out, char *in, TclWebRequest *req)
  +{
  +    out = ap_escape_shell_cmd(TCLWEBPOOL, in);
  +    return TCL_OK;
  +}
   
   /* output/write/flush?  */
   
  -/* error (log) ? */
  +/* error (log) ?  send to stderr. */
  
  
  
  1.3       +2 -2      tcl-rivet/src/TclWebcgi.c
  
  Index: TclWebcgi.c
  ===================================================================
  RCS file: /home/cvs/tcl-rivet/src/TclWebcgi.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- TclWebcgi.c       18 Jan 2002 20:07:18 -0000      1.2
  +++ TclWebcgi.c       19 Jan 2002 16:11:52 -0000      1.3
  @@ -6,7 +6,7 @@
    * TclWeb.h.  Low-level implementations are provided in this file.
    */
   
  -/* $Id: TclWebcgi.c,v 1.2 2002/01/18 20:07:18 davidw Exp $ */
  +/* $Id: TclWebcgi.c,v 1.3 2002/01/19 16:11:52 davidw Exp $ */
   
   #include <tcl.h>
   #include "TclWeb.h"
  @@ -56,4 +56,4 @@
   
   /* output/write/flush?  */
   
  -/* error (log) ? */
  +/* error (log) ? send to stderr with some information. */
  
  
  
  1.12      +11 -2     tcl-rivet/src/make.tcl
  
  Index: make.tcl
  ===================================================================
  RCS file: /home/cvs/tcl-rivet/src/make.tcl,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- make.tcl  18 Jan 2002 19:08:53 -0000      1.11
  +++ make.tcl  19 Jan 2002 16:11:52 -0000      1.12
  @@ -2,7 +2,7 @@
   # the next line restarts using tclsh \
        exec tclsh "$0" "$@"
   
  -# $Id: make.tcl,v 1.11 2002/01/18 19:08:53 davidw Exp $
  +# $Id: make.tcl,v 1.12 2002/01/19 16:11:52 davidw Exp $
   
   # this file actually runs things, making use of the aardvark build
   # system.
  @@ -95,6 +95,11 @@
       command {$COMPILE mod_rivet.c}
   }
   
  +AddNode TclWebapache.o {
  +    depends "TclWebapache.c mod_rivet.h apache_request.h"
  +    command {$COMPILE TclWebapache.c}
  +}
  +
   AddNode librivet.a {
       depends $LIB_OBJECTS
       command {$TCL_STLIB_LD $LIB_STLIB $LIB_OBJECTS}
  @@ -116,7 +121,11 @@
   }
   
   AddNode all {
  -    depends shared
  +    depends module
  +}
  +
  +AddNode module {
  +    depends "TclWebapache.o shared"
   }
   
   AddNode shared {
  
  
  

Reply via email to