You are viewing a plain text version of this content. The canonical link for it is here.
Posted to rivet-dev@tcl.apache.org by da...@apache.org on 2002/12/14 20:04:35 UTC
cvs commit: tcl-rivet/src TclWeb.h TclWebapache.c apache_request.c apache_request.h mod_rivet.h rivetCore.c
davidw 2002/12/14 11:04:35
Modified: . ChangeLog
src TclWeb.h TclWebapache.c apache_request.c
apache_request.h mod_rivet.h rivetCore.c
Log:
* src/rivetCore.c: Implemented Tcl commands (via objv[0]) to retrieve
variables from different, specified sources (query string,
POST). (David Brancato).
* src/mod_rivet.h: Added defines for variable sources. (David
Brancato).
* src/apache_request.c: Added functions to get query and post
params. (David Brancato).
* src/TclWebapache.c: Implemented TclWeb.h API change. (David
Brancato).
* src/TclWeb.h: Changed API to include a source option in order to
indicate the origin (query string, POST) of a variable. (David
Brancato).
Revision Changes Path
1.89 +19 -0 tcl-rivet/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /home/cvs/tcl-rivet/ChangeLog,v
retrieving revision 1.88
retrieving revision 1.89
diff -u -r1.88 -r1.89
--- ChangeLog 14 Dec 2002 01:03:51 -0000 1.88
+++ ChangeLog 14 Dec 2002 19:04:35 -0000 1.89
@@ -1,3 +1,22 @@
+2002-12-14 David N. Welton <da...@dedasys.com>
+
+ * src/rivetCore.c: Implemented Tcl commands (via objv[0]) to
+ retrieve variables from different, specified sources (query
+ string, POST). (David Brancato).
+
+ * src/mod_rivet.h: Added defines for variable sources. (David
+ Brancato).
+
+ * src/apache_request.c: Added functions to get query and post
+ params. (David Brancato).
+
+ * src/TclWebapache.c: Implemented TclWeb.h API change. (David
+ Brancato).
+
+ * src/TclWeb.h: Changed API to include a source option in order to
+ indicate the origin (query string, POST) of a variable. (David
+ Brancato).
+
2002-12-13 David N. Welton <da...@dedasys.com>
* src/mod_rivet.c (Rivet_InitTclStuff): Apache actually loads all
1.19 +7 -7 tcl-rivet/src/TclWeb.h
Index: TclWeb.h
===================================================================
RCS file: /home/cvs/tcl-rivet/src/TclWeb.h,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- TclWeb.h 22 Oct 2002 18:40:53 -0000 1.18
+++ TclWeb.h 14 Dec 2002 19:04:35 -0000 1.19
@@ -100,17 +100,17 @@
int TclWeb_MakeURL(Tcl_Obj *result, char *filename, TclWebRequest *req);
-int TclWeb_GetVar(Tcl_Obj *result, char *varname, TclWebRequest *req);
+int TclWeb_GetVar(Tcl_Obj *result, char *varname, int source, TclWebRequest *req);
-int TclWeb_GetVarAsList(Tcl_Obj *result, char *varname, TclWebRequest *req);
+int TclWeb_GetVarAsList(Tcl_Obj *result, char *varname, int source, TclWebRequest *req);
-int TclWeb_VarExists(Tcl_Obj *result, char *varname, TclWebRequest *req);
+int TclWeb_VarExists(Tcl_Obj *result, char *varname, int source, TclWebRequest *req);
-int TclWeb_VarNumber(Tcl_Obj *result, TclWebRequest *req);
+int TclWeb_VarNumber(Tcl_Obj *result, int source, TclWebRequest *req);
-int TclWeb_GetVarNames(Tcl_Obj *result, TclWebRequest *req);
+int TclWeb_GetVarNames(Tcl_Obj *result, int source, TclWebRequest *req);
-int TclWeb_GetAllVars(Tcl_Obj *result, TclWebRequest *req);
+int TclWeb_GetAllVars(Tcl_Obj *result, int source, TclWebRequest *req);
int TclWeb_GetEnvVars(Tcl_Obj *envvar, TclWebRequest *req);
1.38 +70 -18 tcl-rivet/src/TclWebapache.c
Index: TclWebapache.c
===================================================================
RCS file: /home/cvs/tcl-rivet/src/TclWebapache.c,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -r1.37 -r1.38
--- TclWebapache.c 6 Dec 2002 01:20:26 -0000 1.37
+++ TclWebapache.c 14 Dec 2002 19:04:35 -0000 1.38
@@ -134,16 +134,25 @@
}
int
-TclWeb_GetVar(Tcl_Obj *result, char *varname, TclWebRequest *req)
+TclWeb_GetVar(Tcl_Obj *result, char *varname, int source, TclWebRequest *req)
{
- int i;
+ int i, j;
array_header *parmsarray = ap_table_elts(req->apachereq->parms);
table_entry *parms = (table_entry *)parmsarray->elts;
int flag = 0;
+ /* determine which part of table to traverse */
+ if (source == VAR_SRC_QUERYSTRING) {
+ i = 0; j = req->apachereq->nargs;
+ } else if (source == VAR_SRC_POST) {
+ i = req->apachereq->nargs; j = parmsarray->nelts;
+ } else {
+ i = 0; j = parmsarray->nelts;
+ }
+
/* This isn't real efficient - move to hash table later
on... */
- for (i = 0; i < parmsarray->nelts; ++i)
+ for (; i < j; ++i)
{
char *parmkey = TclWeb_StringToUtf(parms[i].key, req);
if (!strncmp(varname, parmkey,
@@ -177,14 +186,23 @@
}
int
-TclWeb_GetVarAsList(Tcl_Obj *result, char *varname, TclWebRequest *req)
+TclWeb_GetVarAsList(Tcl_Obj *result, char *varname, int source, TclWebRequest *req)
{
- int i;
+ int i, j;
array_header *parmsarray = ap_table_elts(req->apachereq->parms);
table_entry *parms = (table_entry *)parmsarray->elts;
+ /* determine which part of table to traverse */
+ if (source == VAR_SRC_QUERYSTRING) {
+ i = 0; j = req->apachereq->nargs;
+ } else if (source == VAR_SRC_POST) {
+ i = req->apachereq->nargs; j = parmsarray->nelts;
+ } else {
+ i = 0; j = parmsarray->nelts;
+ }
+
/* This isn't real efficient - move to hash table later on. */
- for (i = 0; i < parmsarray->nelts; ++i)
+ for (; i < j; ++i)
{
if (!strncmp(varname, TclWeb_StringToUtf(parms[i].key, req),
@@ -204,13 +222,22 @@
}
int
-TclWeb_GetAllVars(Tcl_Obj *result, TclWebRequest *req)
+TclWeb_GetAllVars(Tcl_Obj *result, int source, TclWebRequest *req)
{
- int i;
+ int i, j;
array_header *parmsarray = ap_table_elts(req->apachereq->parms);
table_entry *parms = (table_entry *)parmsarray->elts;
- for (i = 0; i < parmsarray->nelts; ++i)
+ /* determine which part of table to traverse */
+ if (source == VAR_SRC_QUERYSTRING) {
+ i = 0; j = req->apachereq->nargs;
+ } else if (source == VAR_SRC_POST) {
+ i = req->apachereq->nargs; j = parmsarray->nelts;
+ } else {
+ i = 0; j = parmsarray->nelts;
+ }
+
+ for (; i < j; ++i)
{
Tcl_ListObjAppendElement(req->interp, result,
TclWeb_StringToUtfToObj(parms[i].key, req));
@@ -226,13 +253,22 @@
}
int
-TclWeb_GetVarNames(Tcl_Obj *result, TclWebRequest *req)
+TclWeb_GetVarNames(Tcl_Obj *result, int source, TclWebRequest *req)
{
- int i;
+ int i, j;
array_header *parmsarray = ap_table_elts(req->apachereq->parms);
table_entry *parms = (table_entry *)parmsarray->elts;
- for (i = 0; i < parmsarray->nelts; ++i)
+ /* determine which part of table to traverse */
+ if (source == VAR_SRC_QUERYSTRING) {
+ i = 0; j = req->apachereq->nargs;
+ } else if (source == VAR_SRC_POST) {
+ i = req->apachereq->nargs; j = parmsarray->nelts;
+ } else {
+ i = 0; j = parmsarray->nelts;
+ }
+
+ for (; i < j; ++i)
{
Tcl_ListObjAppendElement(req->interp, result,
TclWeb_StringToUtfToObj(parms[i].key, req));
@@ -247,14 +283,23 @@
}
int
-TclWeb_VarExists(Tcl_Obj *result, char *varname, TclWebRequest *req)
+TclWeb_VarExists(Tcl_Obj *result, char *varname, int source, TclWebRequest *req)
{
- int i;
+ int i, j;
array_header *parmsarray = ap_table_elts(req->apachereq->parms);
table_entry *parms = (table_entry *)parmsarray->elts;
+ /* determine which part of table to traverse */
+ if (source == VAR_SRC_QUERYSTRING) {
+ i = 0; j = req->apachereq->nargs;
+ } else if (source == VAR_SRC_POST) {
+ i = req->apachereq->nargs; j = parmsarray->nelts;
+ } else {
+ i = 0; j = parmsarray->nelts;
+ }
+
/* This isn't real efficient - move to hash table later on. */
- for (i = 0; i < parmsarray->nelts; ++i)
+ for (; i < j; ++i)
{
if (!strncmp(varname, TclWeb_StringToUtf(parms[i].key, req),
strlen(varname) < strlen(parms[i].key) ?
@@ -269,11 +314,18 @@
}
int
-TclWeb_VarNumber(Tcl_Obj *result, TclWebRequest *req)
+TclWeb_VarNumber(Tcl_Obj *result, int source, TclWebRequest *req)
{
array_header *parmsarray = ap_table_elts(req->apachereq->parms);
- Tcl_SetIntObj(result, parmsarray->nelts);
+ if (source == VAR_SRC_QUERYSTRING) {
+ Tcl_SetIntObj(result, req->apachereq->nargs);
+ } else if (source == VAR_SRC_POST) {
+ Tcl_SetIntObj(result, parmsarray->nelts - req->apachereq->nargs);
+ } else {
+ Tcl_SetIntObj(result, parmsarray->nelts);
+ }
+
return TCL_OK;
}
1.4 +29 -0 tcl-rivet/src/apache_request.c
Index: apache_request.c
===================================================================
RCS file: /home/cvs/tcl-rivet/src/apache_request.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- apache_request.c 5 Nov 2002 01:13:24 -0000 1.3
+++ apache_request.c 14 Dec 2002 19:04:35 -0000 1.4
@@ -167,6 +167,33 @@
return retval;
}
+table *ApacheRequest_query_params(ApacheRequest *req, ap_pool *p)
+{
+ array_header *a = ap_palloc(p, sizeof *a);
+ array_header *b = (array_header *)req->parms;
+
+ a->elts = b->elts;
+ a->nelts = req->nargs;
+
+ a->nalloc = a->nelts; /* COW hack: array push will induce copying */
+ a->elt_size = sizeof(table_entry);
+ return (table *)a;
+}
+
+table *ApacheRequest_post_params(ApacheRequest *req, ap_pool *p)
+{
+ array_header *a = ap_palloc(p, sizeof *a);
+ array_header *b = (array_header *)req->parms;
+
+ a->elts = (void *)( (table_entry *)b->elts + req->nargs );
+ a->nelts = b->nelts - req->nargs;
+
+ a->nalloc = a->nelts; /* COW hack: array push will induce copying */
+ a->elt_size = sizeof(table_entry);
+ return (table *)a;
+}
+
+
ApacheUpload *ApacheUpload_new(ApacheRequest *req)
{
ApacheUpload *upload = (ApacheUpload *)
@@ -210,6 +237,7 @@
req->temp_dir = NULL;
req->parsed = 0;
req->r = r;
+ req->nargs = 0;
return req;
}
@@ -264,6 +292,7 @@
if (r->args) {
split_to_parms(req, r->args);
+ req->nargs = ((array_header *)req->parms)->nelts;
}
if (r->method_number == M_POST) {
1.2 +3 -0 tcl-rivet/src/apache_request.h
Index: apache_request.h
===================================================================
RCS file: /home/cvs/tcl-rivet/src/apache_request.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- apache_request.h 19 Sep 2001 13:12:58 -0000 1.1
+++ apache_request.h 14 Dec 2002 19:04:35 -0000 1.2
@@ -45,6 +45,7 @@
void *hook_data;
char* temp_dir;
request_rec *r;
+ int nargs;
} ApacheRequest;
struct ApacheUpload {
@@ -97,6 +98,8 @@
int ApacheRequest___parse(ApacheRequest *req);
#define ApacheRequest_parse(req) \
(req->status = req->parsed ? req->status : ApacheRequest___parse(req))
+table *ApacheRequest_query_params(ApacheRequest *req, ap_pool *p);
+table *ApacheRequest_post_params(ApacheRequest *req, ap_pool *p);
FILE *ApacheRequest_tmpfile(ApacheRequest *req, ApacheUpload *upload);
ApacheUpload *ApacheUpload_new(ApacheRequest *req);
1.24 +4 -1 tcl-rivet/src/mod_rivet.h
Index: mod_rivet.h
===================================================================
RCS file: /home/cvs/tcl-rivet/src/mod_rivet.h,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- mod_rivet.h 14 Dec 2002 01:03:51 -0000 1.23
+++ mod_rivet.h 14 Dec 2002 19:04:35 -0000 1.24
@@ -43,6 +43,10 @@
#define STARTING_SEQUENCE "<?"
#define ENDING_SEQUENCE "?>"
+#define VAR_SRC_QUERYSTRING 1
+#define VAR_SRC_POST 2
+#define VAR_SRC_ALL 3
+
#define DEFAULT_ERROR_MSG "[an error occurred while processing this directive]"
#define DEFAULT_TIME_FORMAT "%A, %d-%b-%Y %H:%M:%S %Z"
#define MULTIPART_FORM_DATA 1
@@ -79,7 +83,6 @@
/* stuff for buffering output */
Tcl_Channel *outchannel;
-
} rivet_server_conf;
/* eventually we will transfer 'global' variables in here and
1.32 +25 -7 tcl-rivet/src/rivetCore.c
Index: rivetCore.c
===================================================================
RCS file: /home/cvs/tcl-rivet/src/rivetCore.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- rivetCore.c 6 Dec 2002 01:20:26 -0000 1.31
+++ rivetCore.c 14 Dec 2002 19:04:35 -0000 1.32
@@ -320,8 +320,10 @@
int objc,
Tcl_Obj *CONST objv[])
{
+ char *cmd;
char *command;
Tcl_Obj *result = NULL;
+ int source;
rivet_interp_globals *globals = Tcl_GetAssocData(interp, "rivet", NULL);
if (objc < 2 || objc > 4)
@@ -331,9 +333,15 @@
"|number|all)");
return TCL_ERROR;
}
+ cmd = Tcl_GetString(objv[0]);
command = Tcl_GetString(objv[1]);
result = Tcl_NewObj();
+ /* determine if var_qs, var_post or var was called */
+ if (!strcmp(cmd, "var_qs")) source = VAR_SRC_QUERYSTRING;
+ else if (!strcmp(cmd, "var_post")) source = VAR_SRC_POST;
+ else source = VAR_SRC_ALL;
+
if (!strcmp(command, "get"))
{
char *key = NULL;
@@ -349,7 +357,7 @@
deflt = Tcl_GetString(objv[3]);
}
- if (TclWeb_GetVar(result, key, globals->req) != TCL_OK)
+ if (TclWeb_GetVar(result, key, source, globals->req) != TCL_OK)
{
if (deflt == NULL) {
Tcl_SetStringObj(result, "", -1);
@@ -366,7 +374,7 @@
}
key = Tcl_GetString(objv[2]);
- TclWeb_VarExists(result, key, globals->req);
+ TclWeb_VarExists(result, key, source, globals->req);
} else if(!strcmp(command, "list")) {
char *key;
if (objc != 3)
@@ -376,7 +384,7 @@
}
key = Tcl_GetStringFromObj(objv[2], NULL);
- if (TclWeb_GetVarAsList(result, key, globals->req) != TCL_OK)
+ if (TclWeb_GetVarAsList(result, key, source, globals->req) != TCL_OK)
{
result = Tcl_NewStringObj("", -1);
}
@@ -387,7 +395,7 @@
return TCL_ERROR;
}
- if (TclWeb_GetVarNames(result, globals->req) != TCL_OK)
+ if (TclWeb_GetVarNames(result, source, globals->req) != TCL_OK)
{
result = Tcl_NewStringObj("", -1);
}
@@ -398,14 +406,14 @@
return TCL_ERROR;
}
- TclWeb_VarNumber(result, globals->req);
+ TclWeb_VarNumber(result, source, globals->req);
} else if(!strcmp(command, "all")) {
if (objc != 2)
{
Tcl_WrongNumArgs(interp, 2, objv, NULL);
return TCL_ERROR;
}
- if (TclWeb_GetAllVars(result, globals->req) != TCL_OK)
+ if (TclWeb_GetAllVars(result, source, globals->req) != TCL_OK)
{
result = Tcl_NewStringObj("", -1);
}
@@ -669,6 +677,16 @@
(Tcl_CmdDeleteProc *)NULL);
Tcl_CreateObjCommand(interp,
"var",
+ Rivet_Var,
+ NULL,
+ (Tcl_CmdDeleteProc *)NULL);
+ Tcl_CreateObjCommand(interp,
+ "var_qs",
+ Rivet_Var,
+ NULL,
+ (Tcl_CmdDeleteProc *)NULL);
+ Tcl_CreateObjCommand(interp,
+ "var_post",
Rivet_Var,
NULL,
(Tcl_CmdDeleteProc *)NULL);
---------------------------------------------------------------------
To unsubscribe, e-mail: rivet-cvs-unsubscribe@tcl.apache.org
For additional commands, e-mail: rivet-cvs-help@tcl.apache.org