From: Stephen D. <sd...@us...> - 2005-12-11 11:20:00
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31847/nsd Modified Files: filter.c nsd.h proc.c tclcmds.c tclrequest.c Log Message: * include/ns.h: * nsd/nsd.h: * nsd/filter.c: * nsd/tclrequest.c: * nsd/proc.c: * nsd/tclcmds.c: * tests/ns_register_filter.test: Add switch -first to ns_register_filter command, allowing filters to be registered at the head of the queue. Add new command ns_shortcut_filter which registers a C filter callback which simply returns NS_FILTER_BREAK, preventing any other filters of the same type from running. For further explanation, see: http://sf.net/tracker/index.php?func=detail&aid=1012103&group_id=3152&atid=353152 Index: tclcmds.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/tclcmds.c,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** tclcmds.c 11 Dec 2005 04:44:05 -0000 1.26 --- tclcmds.c 11 Dec 2005 11:19:50 -0000 1.27 *************** *** 158,161 **** --- 158,162 ---- NsTclSetCookieObjCmd, NsTclSetObjCmd, + NsTclShortcutFilterObjCmd, NsTclShutdownObjCmd, NsTclSleepObjCmd, *************** *** 308,311 **** --- 309,313 ---- {"ns_set", NULL, NsTclSetObjCmd}, {"ns_sha1", NULL, NsTclSHA1ObjCmd}, + {"ns_shortcut_filter", NULL, NsTclShortcutFilterObjCmd}, {"ns_sleep", NULL, NsTclSleepObjCmd}, {"ns_sockaccept", NULL, NsTclSockAcceptObjCmd}, Index: nsd.h =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/nsd.h,v retrieving revision 1.40 retrieving revision 1.41 diff -C2 -d -r1.40 -r1.41 *** nsd.h 11 Dec 2005 04:44:05 -0000 1.40 --- nsd.h 11 Dec 2005 11:19:50 -0000 1.41 *************** *** 880,883 **** --- 880,884 ---- extern Ns_ArgProc NsConnArgProc; extern Ns_FilterProc NsTclFilterProc; + extern Ns_FilterProc NsShortcutFilterProc; extern Ns_OpProc NsFastPathProc; extern Ns_OpProc NsTclRequestProc; Index: filter.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/filter.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** filter.c 10 Jun 2005 17:58:38 -0000 1.3 --- filter.c 11 Dec 2005 11:19:50 -0000 1.4 *************** *** 96,105 **** fPtr->when = when; fPtr->arg = arg; ! fPtr->nextPtr = NULL; ! fPtrPtr = &servPtr->filter.firstFilterPtr; ! while (*fPtrPtr != NULL) { ! fPtrPtr = &((*fPtrPtr)->nextPtr); } - *fPtrPtr = fPtr; return (void *) fPtr; } --- 96,110 ---- fPtr->when = when; fPtr->arg = arg; ! if (when & NS_FILTER_FIRST) { ! fPtr->nextPtr = servPtr->filter.firstFilterPtr; ! servPtr->filter.firstFilterPtr = fPtr; ! } else { ! fPtr->nextPtr = NULL; ! fPtrPtr = &servPtr->filter.firstFilterPtr; ! while (*fPtrPtr != NULL) { ! fPtrPtr = &((*fPtrPtr)->nextPtr); ! } ! *fPtrPtr = fPtr; } return (void *) fPtr; } Index: proc.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/proc.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** proc.c 11 Dec 2005 04:44:05 -0000 1.10 --- proc.c 11 Dec 2005 11:19:50 -0000 1.11 *************** *** 77,80 **** --- 77,81 ---- {(void *) NsConnThread, "ns:connthread", NsConnArgProc}, {(void *) NsTclFilterProc, "ns:tclfilter", Ns_TclCallbackArgProc}, + {(void *) NsShortcutFilterProc, "ns:shortcutfilter", NULL}, {(void *) NsTclRequestProc, "ns:tclrequest", Ns_TclCallbackArgProc}, {(void *) NsAdpRequestProc, "ns:adprequest", ServerArgProc}, Index: tclrequest.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/tclrequest.c,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** tclrequest.c 11 Dec 2005 10:17:59 -0000 1.9 --- tclrequest.c 11 Dec 2005 11:19:50 -0000 1.10 *************** *** 293,296 **** --- 293,301 ---- int when = 0; + Ns_ObjvSpec opts[] = { + {"-first", Ns_ObjvBool, &when, (void *) NS_FILTER_FIRST}, + {"--", Ns_ObjvBreak, NULL, NULL}, + {NULL, NULL, NULL, NULL} + }; Ns_ObjvSpec args[] = { {"when", Ns_ObjvFlags, &when, filters}, *************** *** 301,305 **** {NULL, NULL, NULL, NULL} }; ! if (Ns_ParseObjv(NULL, args, interp, 1, objc, objv) != NS_OK) { return TCL_ERROR; } --- 306,310 ---- {NULL, NULL, NULL, NULL} }; ! if (Ns_ParseObjv(opts, args, interp, 1, objc, objv) != NS_OK) { return TCL_ERROR; } *************** *** 316,319 **** --- 321,365 ---- *---------------------------------------------------------------------- * + * NsTclShortcutFilterObjCmd -- + * + * Implements ns_shortcut_filter. + * + * Results: + * Tcl result. + * + * Side effects: + * Other filters that also match when+method+urlPattern will not run. + * + *---------------------------------------------------------------------- + */ + + int + NsTclShortcutFilterObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) + { + NsInterp *itPtr = arg; + char *server = itPtr->servPtr->server; + char *method, *urlPattern; + int when = NS_FILTER_FIRST; + + Ns_ObjvSpec args[] = { + {"when", Ns_ObjvFlags, &when, filters}, + {"method", Ns_ObjvString, &method, NULL}, + {"urlPattern", Ns_ObjvString, &urlPattern, NULL}, + {NULL, NULL, NULL, NULL} + }; + if (Ns_ParseObjv(NULL, args, interp, 1, objc, objv) != NS_OK) { + return TCL_ERROR; + } + + Ns_RegisterFilter(server, method, urlPattern, + NsShortcutFilterProc, when, NULL); + + return TCL_OK; + } + + + /* + *---------------------------------------------------------------------- + * * NsTclRegisterTraceObjCmd -- * *************** *** 496,497 **** --- 542,566 ---- return status; } + + + /* + *---------------------------------------------------------------------- + * + * NsShortcutFilterProc -- + * + * The callback for Tcl shortcut filters. + * + * Results: + * Always NS_FILTER_BREAK. + * + * Side effects: + * No other filters of this type will run for this connection. + * + *---------------------------------------------------------------------- + */ + + int + NsShortcutFilterProc(void *arg, Ns_Conn *conn, int why) + { + return NS_FILTER_BREAK; + } |