Graham Dumpleton
grahamd at dscpl.com.au
Tue Oct 19 17:12:56 EDT 2004
Thanks, this is good timing. I was looking at that specific code yesterday so as to start changing it to bring it inline with what mod_python 3.X does in publisher. Specifically, to allow kwargs as last argument of handler to gobble up those which aren't specifically defined as arguments. Anyway, I have to run out the door right now so no time to even finish this email properly. :-) Thanks again. On 20/10/2004, at 6:56 AM, Johannes Erdfelt wrote: > I've been using vampire the last couple of days and I like it, but it > has some problems some code I originally wrote didn't have. > > This patch fixes a problem where unknown query variables (form > variables) could cause an internal server error. > > Generally, this shouldn't happen and on a well designed site, it's the > users error for causing this to occur, but it causes some undue alarm > when looking at the logs, so I wrote up this patch to remove unknown > query variables before applying it to the called handler. > > It also prints out an error message if variables are required by the > handler, but aren't given by the client (it doesn't have a default) > > It applies to vampire 1.1 > > JE > > diff -ur vampire-1.1-20041009.orig/packages/vampire/apache.py > vampire-1.1-20041009/packages/vampire/apache.py > --- vampire-1.1-20041009.orig/packages/vampire/apache.py 2004-10-08 > 18:31:50.000000000 -0700 > +++ vampire-1.1-20041009/packages/vampire/apache.py 2004-10-19 > 13:55:48.000000000 -0700 > @@ -171,4 +171,40 @@ > > # Execute the content handler. > > - return apply(function,(req,),args) > + # Match up the arguments given by the client to the expected > arguments > + # from the method. We only remove non expected names and don't > check for > + # expected because the argument may have a default if not set. We > use > + # exceptions to catch the case where an argument does not have a > default. > + fc = function.func_code > + expected = fc.co_varnames[0:fc.co_argcount] > + > + # Silently remove any unexpected arguments if we need to > + if not fc.co_flags & 0x000C: # CO_VARARGS | CO_VARKEYWORDS > + for name in args.keys(): > + if name not in expected: > + del args[name] > + > + try: > + return apply(function,(req,),args) > + except TypeError, vars: > + missing = [] > + > + # Don't worry about the arguments with defaults > + argcount = fc.co_argcount > + if function.func_defaults: > + argcount = argcount - len(function.func_defaults) > + # Skip the first argument, which is the req > + for name in fc.co_varnames[1:argcount]: > + if name not in args: > + missing.append(name) > + > + if not len(missing): > + raise > + > + # We definately had some missing variables, let's let the user > know > + req.content_type = "text/plain" > + req.status = apache.HTTP_INTERNAL_SERVER_ERROR > + req.send_http_header() > + req.write("Call is missing these variables: %s\n" % ", > ".join(missing)) > + > + return apache.OK
|