Monday, November 08, 2010 at 12:06 AM.
system.verbs.builtins.webserver.dispatch
on dispatch (adrParamTable) { <<Thursday, November 11, 1999 at 3:08:16 AM by AR <<Implemented as a kernel script in Frontier 6.1. <<Old code <<Wed, Jun 10, 1998 at 2:36:20 PM by PBS <<Get responder name from user.webserver.responders table, not from actual responder table. <<Script: system.verbs.builtins.webserver.dispatch; Version 2; Date: Thu, 21 May 1998 17:52:33 GMT; ID: RAB <<Allow the condition to be a script <<Script: system.verbs.builtins.webserver.dispatch; Version 1; Date: Wed, 13 May 1998 01:12:57 GMT; ID: RAB <<on dispatch (adrParamTable) <<March 19, 1998 at 5:26:27 PM by WMF <<A common script that dispatches a request to the proper responder <<local (compatibility, method, methodAdr, filterAdr, responderTableAdr) <<local (i) //used for indexing << <<on isScript (name) <<local (objType) <<if (typeOf (name^) == binaryType) <<objType = getBinaryType (name^) <<else <<objType = typeOf (name^) <<if (objType == scriptType) or (objType == codeType) <<return (true) <<return (false) << <<bundle //call pre-filters <<for i = 1 to sizeOf (user.webserver.preFilters) <<try <<filterAdr = @user.webserver.preFilters[i] <<if typeOf (filterAdr^) == addressType <<filterAdr = filterAdr^ <<filterAdr^ (adrParamTable) <<else <<log.add ("Pre filter error: " + @user.webserver.preFilters[i] + ": " + tryError, "webserver") << <<determine which responder should handle this request <<local (responder = webserver.getPref("defaultResponder")) <<for i =1 to sizeOf(user.webserver.responders) <<responderTableAdr = webserver.util.getResponderTableAdr (nameOf(user.webserver.responders[i])) <<try //this handles ignoring a bad address dereference on the responderTableAdr <<if defined (responderTableAdr^.condition) <<if (defined (responderTableAdr^.enabled) && responderTableAdr^.enabled) <<try <<with adrParamTable^, adrParamTable^.requestHeaders // allow conditions to see headers easily <<if (typeOf (responderTableAdr^.condition) == scriptType) or (typeOf (responderTableAdr^.condition) == codeType) <<if responderTableAdr^.condition (adrParamTable) <<responder = nameOf (user.webserver.responders [i]) //PBS 6/10/98: get responder name from user.webserver.responders table. <<break <<else <<if evaluate (responderTableAdr^.condition) <<responder = nameOf (user.webserver.responders [i]) //PBS 6/10/98: get responder name from user.webserver.responders table. <<break << <<adrParamTable^.responder = responder <<adrParamTable^.responderTableAdr = webserver.util.getResponderTableAdr (responder) <<adrParamTable^.code = 200 // fill in default values <<adrParamTable^.responseBody = "" <<new (tableType, @adrParamTable^.responseHeaders) << <<dispatch the request to the correct responder method << <<method = adrParamTable^.method << <<bundle //handle switching to the any method <<methodAdr = webserver.util.getMethodAdr (responder, method) <<if ! defined(methodAdr^) <<methodAdr = webserver.util.getMethodAdr (responder, "any") <<if defined (methodAdr^) <<method = "any" //change from the specific method type to the any method << <<methodAdr = webserver.util.getMethodAdr (responder, method) <<if defined (methodAdr^) && (isScript (methodAdr)) <<try <<compatibility = methodAdr^ (adrParamTable) //call the responder <<if (compatibility == true) <<call post-filters <<for i = 1 to sizeOf (user.webserver.postFilters) <<try <<filterAdr = @user.webserver.postFilters[i] <<if typeOf (filterAdr^) == addressType <<filterAdr = filterAdr^ <<filterAdr^ (adrParamTable) <<else <<log.add ("Post filter error: " + @user.webserver.postFilters[i] + ": " + tryError, "webserver") <<return (webserver.util.buildResponse (adrParamTable^.code, @adrParamTable^.responseHeaders, adrParamTable^.responseBody)) <<else <<do the hack for the old CGI framework <<return (compatibility) <<else <<log.add ("Responder method error: " + methodAdr + ": " + tryError, "webserver") <<semaphores.unlock ("") <<return (webserver.util.buildResponse (500, nil, webserver.util.buildErrorPage ("500 Server Error", tryError))) <<else // this service doesn't support this method <<local (allowedMethods, methodTableAdr) <<responderTableAdr = webserver.util.getResponderTableAdr (responder) <<methodTableAdr = @responderTableAdr^.methods <<if typeOf (methodTableAdr^) == addressType <<methodTableAdr = methodTableAdr^ <<allowedMethods = "" <<for i =1 to sizeOf (methodTableAdr^) <<allowedMethods = allowedMethods + ", " + nameOf(methodTableAdr^[i]) <<new (tableType, @badMethodHeaders) <<badMethodHeaders.Allow = allowedMethods <<return (webserver.util.buildResponse (405, @badMethodHeaders, webserver.util.buildErrorPage ("405 Method Not Allowed", method + " isn't allowed on this object."))) kernel (webserver.dispatch)}
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.