From: Stephen D. <sd...@us...> - 2007-05-25 00:39:58
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv28105/nsd Modified Files: nsd.h proc.c tclrequest.c tclcmds.c Log Message: * nsd/nsd.h: * nsd/tclrequest.c: * nsd/tclcmds.c: * nsd/proc.c: * tests/adp.test: Add new command ns_register_tcl, analogous to ns_register_adp. Make mapped pages respect the -cache option. Allow relative path names for mapped pages. Index: tclrequest.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/tclrequest.c,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** tclrequest.c 24 May 2007 23:19:22 -0000 1.17 --- tclrequest.c 25 May 2007 00:39:56 -0000 1.18 *************** *** 41,44 **** --- 41,63 ---- /* + * The following structure allows a single ADP or Tcl page to + * be requested via multiple URLs. + */ + + typedef struct PageMap { + Ns_Time ttl; /* Time to live for cached output. */ + int tcl; /* This is a Tcl page, not ADP */ + char file[1]; /* Path in file system to page. */ + } PageMap; + + + /* + * Static functions defined in this file. + */ + + static int RegisterPage(ClientData arg, Tcl_Interp *interp, int objc, + Tcl_Obj *CONST objv[], Ns_OpProc *proc); + + /* * Static variables defined in this file. */ *************** *** 248,252 **** --- 267,286 ---- NsTclRegisterAdpObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + return RegisterPage(arg, interp, objc, objv, Ns_AdpPageProc); + } + + int + NsTclRegisterTclObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) + { + return RegisterPage(arg, interp, objc, objv, Ns_TclPageProc); + } + + int + RegisterPage(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], + Ns_OpProc *proc) + { NsInterp *itPtr = arg; + PageMap *page; + Ns_DString ds; char *method, *url, *file = NULL; int flags = 0; *************** *** 270,282 **** if (file != NULL) { Ns_RegisterRequest(itPtr->servPtr->server, method, url, ! NsAdpMapProc, ns_free, ns_strdup(file), flags); } else { if (ttlPtr != NULL) { ttlArgPtr = ns_malloc(sizeof(Ns_Time)); ! ttlArgPtr = ttlPtr; } Ns_RegisterRequest(itPtr->servPtr->server, method, url, ! Ns_AdpPageProc, ttlArgPtr ? ns_free : NULL, ttlArgPtr, flags); --- 304,343 ---- if (file != NULL) { + + /* + * Map the request to some specific file in the file + * system, bypassing url2file lookup at runtime. + */ + + Ns_DStringInit(&ds); + + if (!Ns_PathIsAbsolute(file)) { + file = Ns_PagePath(&ds, itPtr->servPtr->server, file, NULL); + if (file == NULL) { + Tcl_AppendResult(interp, "path construction failed for: ", file, NULL); + return TCL_ERROR; + } + } + + page = ns_calloc(1, sizeof(PageMap) + strlen(file)); + strcpy(page->file, file); + page->tcl = (proc == Ns_TclPageProc) ? 1 : 0; + if (ttlPtr != NULL) { + page->ttl = *ttlPtr; + } + Ns_RegisterRequest(itPtr->servPtr->server, method, url, ! NsPageMapProc, ns_free, page, flags); ! ! Ns_DStringFree(&ds); ! } else { + if (ttlPtr != NULL) { ttlArgPtr = ns_malloc(sizeof(Ns_Time)); ! *ttlArgPtr = *ttlPtr; } Ns_RegisterRequest(itPtr->servPtr->server, method, url, ! proc, ttlArgPtr ? ns_free : NULL, ttlArgPtr, flags); *************** *** 292,296 **** * NsTclUnRegisterObjCmd -- * ! * Implements ns_unregister_proc and ns_unregister_adp commands. * * Results: --- 353,357 ---- * NsTclUnRegisterObjCmd -- * ! * Implements the ns_unregister_* commands. * * Results: *************** *** 470,479 **** *---------------------------------------------------------------------- * ! * NsAdpMapProc -- * ! * Ns_OpProc which evaluates a specifically registered adp file. * * Results: ! * See Ns_AdpRequest. * * Side effects: --- 531,541 ---- *---------------------------------------------------------------------- * ! * NsPageMapProc -- * ! * Ns_OpProc which evaluates a specifically registered ADP or ! * Tcl file. * * Results: ! * See Ns_AdpRequestEx. * * Side effects: *************** *** 484,492 **** int ! NsAdpMapProc(void *arg, Ns_Conn *conn) { ! char *adpFile = arg; ! return Ns_AdpRequest(conn, adpFile); } --- 546,584 ---- int ! NsPageMapProc(void *arg, Ns_Conn *conn) { ! PageMap *map = arg; ! return Ns_AdpRequestEx(conn, map->file, &map->ttl, ! map->tcl ? ADP_TCLFILE : 0); ! } ! ! ! /* ! *---------------------------------------------------------------------- ! * ! * NsPageMapArgProc -- ! * ! * Proc info callback for page maps. ! * ! * Results: ! * None. ! * ! * Side effects: ! * None. ! * ! *---------------------------------------------------------------------- ! */ ! ! void ! NsPageMapArgProc(Tcl_DString *dsPtr, void *arg) ! { ! PageMap *page = arg; ! ! Tcl_DStringAppendElement(dsPtr, page->tcl ? "tcl" : "adp"); ! Tcl_DStringAppendElement(dsPtr, page->file); ! Ns_DStringPrintf(dsPtr, " %lu:%lu", ! (unsigned long) page->ttl.sec, ! (unsigned long) page->ttl.usec); } Index: tclcmds.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/tclcmds.c,v retrieving revision 1.51 retrieving revision 1.52 diff -C2 -d -r1.51 -r1.52 *** tclcmds.c 23 May 2007 23:09:43 -0000 1.51 --- tclcmds.c 25 May 2007 00:39:57 -0000 1.52 *************** *** 157,160 **** --- 157,161 ---- NsTclRegisterProcObjCmd, NsTclRegisterProxyObjCmd, + NsTclRegisterTclObjCmd, NsTclRegisterTraceObjCmd, NsTclRegisterUrl2FileObjCmd, *************** *** 435,438 **** --- 436,440 ---- {"ns_register_proc", NULL, NsTclRegisterProcObjCmd}, {"ns_register_proxy", NULL, NsTclRegisterProxyObjCmd}, + {"ns_register_tcl", NULL, NsTclRegisterTclObjCmd}, {"ns_register_trace", NULL, NsTclRegisterTraceObjCmd}, {"ns_register_url2file", NULL, NsTclRegisterUrl2FileObjCmd}, *************** *** 461,464 **** --- 463,467 ---- {"ns_unregister_adp", NULL, NsTclUnRegisterObjCmd}, {"ns_unregister_proc", NULL, NsTclUnRegisterObjCmd}, + {"ns_unregister_tcl", NULL, NsTclUnRegisterObjCmd}, {"ns_unregister_url2file", NULL, NsTclUnRegisterUrl2FileObjCmd}, {"ns_url2file", NULL, NsTclUrl2FileObjCmd}, Index: nsd.h =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/nsd.h,v retrieving revision 1.93 retrieving revision 1.94 diff -C2 -d -r1.93 -r1.94 *** nsd.h 24 May 2007 22:33:52 -0000 1.93 --- nsd.h 25 May 2007 00:39:56 -0000 1.94 *************** *** 1088,1093 **** extern Ns_FilterProc NsShortcutFilterProc; extern Ns_OpProc NsTclRequestProc; ! extern Ns_OpProc NsAdpMapProc; ! extern Ns_ArgProc NsTclRequestArgProc; extern Ns_TclTraceProc NsTclTraceProc; extern Ns_UrlToFileProc NsUrlToFileProc; --- 1088,1093 ---- extern Ns_FilterProc NsShortcutFilterProc; extern Ns_OpProc NsTclRequestProc; ! extern Ns_OpProc NsPageMapProc; ! extern Ns_ArgProc NsPageMapArgProc; extern Ns_TclTraceProc NsTclTraceProc; extern Ns_UrlToFileProc NsUrlToFileProc; Index: proc.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/proc.c,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** proc.c 24 May 2007 22:33:53 -0000 1.15 --- proc.c 25 May 2007 00:39:56 -0000 1.16 *************** *** 79,83 **** {(void *) NsShortcutFilterProc, "ns:shortcutfilter", NULL}, {(void *) NsTclRequestProc, "ns:tclrequest", Ns_TclCallbackArgProc}, ! {(void *) NsAdpMapProc, "ns:adpmap", Ns_StringArgProc}, {(void *) Ns_AdpPageProc, "ns:adppage", TimeArgProc}, {(void *) Ns_TclPageProc, "ns:tclpage", TimeArgProc}, --- 79,83 ---- {(void *) NsShortcutFilterProc, "ns:shortcutfilter", NULL}, {(void *) NsTclRequestProc, "ns:tclrequest", Ns_TclCallbackArgProc}, ! {(void *) NsPageMapProc, "ns:onepage", NsPageMapArgProc}, {(void *) Ns_AdpPageProc, "ns:adppage", TimeArgProc}, {(void *) Ns_TclPageProc, "ns:tclpage", TimeArgProc}, |