Monday, November 08, 2010 at 12:06 AM.
system.verbs.builtins.webserver.responders.websiteFramework.methods.any
on any (adrParamTable) { <<Changes <<1/24/08; 1:30:17 PM by DW <<Clean up error string so it looks good in a web browser. <<1/25/06; 8:09:41 AM by DW <<Implement a callback mechanism that works like the one we did for Radio in 2001, this time for NewsRiver, and then anyone else in the future that needs to catch or filter wsf responder calls. <<12/15/01; 8:44:25 AM by DW <<Allow the Radio responder to handle the .wsf's it sees fit to. Meet the new boss. ;-> <<3/18/01; 1:48:03 PM by PBS <<Don't leave dangling page table addresses in the temp table after building a page -- call html.deletePageTableAddress. <<3/16/01; 10:03:25 PM by PBS <<If the request is for the default page in a table, but the request doesn't end with a /, redirect so the request ends with a /. <<1/23/01; 5:13:53 PM by JES <<Call html.buildObject in a try block, so that a firstFilter script can set the response code and call scriptError, to redirect the browser or make an authentication challenge. <<1/19/01; 1:48:26 PM by PBS <<Don't url-encode the URI when serving the default page in a table. This broke My UserLand on the Desktop. <<Sat, 06 Jun 1998 01:51:15 GMT; RAB <<Gave html.buildObject direct access to the real adrParamTable so that it can make error conditions, etc. local (objType, mimeType); //For type info local (adrRequestHeaders, adrResponseHeaders); local (dataTableAdr, responderTableAdr, docTreeTableAdr, prefsTableAdr); local (objName); local (s); <<scratchpad.anyparams = adrParamTable^ //debugging -- 1/24/08 by DW on getODBTypeInfo(name) { if (typeOf (name^) == binaryType) { objType = getBinaryType (name^)} else { objType = typeOf (name^)}; if defined (user.webserver.prefs.type2MIME.[objType]) { mimeType = user.webserver.prefs.type2MIME.[objType]} else { mimeType = "text/html"}}; on serve (name) { if typeOf (name^) == binaryType { getODBTypeInfo(name); adrParamTable^.responseBody = string(name^); adrResponseHeaders^.["Content-Type"] = mimeType; adrParamTable^.code = 200} else { adrParamTable^.code = 200; adrResponseHeaders^.["Content-Type"] = "text/html"; try { adrParamTable^.responseBody = html.buildObject (name, adrParamTable); try {html.deletePageTableAddress ()}} //PBS 03/18/01: don't leave dangling page table addresses in the temp table else { local (s = tryerror); //1/24/08 by DW bundle { //clean up the string so it looks good in a web browser <<CanŐt evaluate the expression because the name “hailmary” hasnŐt been defined. s = string.replaceall (s, "Ő", "'"); s = string.replaceall (s, "“", "\""); s = string.replaceall (s, "”", "\"")}; if adrParamTable^.code == 200 { scriptError (s)} else { if not defined (adrParamTable^.responseBody) { adrParamTable^.responseBody = webserver.util.buildErrorPage (code + " Error", s)}}}}; return (true)}; on fileServe (name) { s = file.readWholeFile (name); return (serve (@s))}; bundle { //allow a callback to handle the request, 1/25/06 by DW try { local (adrtable = @user.webserver.callbacks.wsfMasterControl, adrscript); if not defined (adrtable^) { new (tabletype, adrtable)}; for adrscript in adrtable { while typeof (adrscript^) == addresstype { adrscript = adrscript^}; try { if adrscript^ (adrParamTable) { //the callback handled the request return (true)}}}}}; bundle { //allow Radio to handle the request try { if radio.webserver.wsfMasterControl (adrParamTable) { //the new main dude handled it return (true)}}}; //you da man adrRequestHeaders = @adrParamTable^.requestHeaders; adrResponseHeaders = @adrParamTable^.responseHeaders; responderTableAdr = adrParamTable^.responderTableAdr; // the responder table dataTableAdr = @responderTableAdr^.["data"]; //This table contains the user data for this responder docTreeTableAdr = @dataTableAdr^.["docTree"]; //This table is the base "server" root prefsTableAdr = @dataTableAdr^.["prefs"]; //This table contains the user prefs for this responder bundle { //parse the URl into an ODB/file path objName = string.urlDecode(adrParamTable^.path); objName = string.popSuffix (objName, '.'); //pop off the .wsf extension <<The following is the main security and path processing script. The result from this script is an error or the final <<file or odb specification for the responder to serve. if ! webserver.util.pathToAddressExt (objName, docTreeTableAdr, adrParamTable) { return (true)}; //The error is already set. objName = adrParamTable^.resultPath}; //as returned from pathToAddressExt if adrParamTable^.resultType == addressType { // we are serving out of the ODB <<Start the serving process if typeOf (objName^) == tableType { local (i); <<Check for the default element to render for i in prefsTableAdr^.ODBdefault { local (default); default = @objName^.[i]; if defined (default^) { if not (adrParamTable^.path endsWith "/") { //PBS 03/16/01: must end with / -- redirect local (url = adrParamTable^.path + "/"); adrParamTable^.code = 302; //non-permanent redirect adrParamTable^.responseBody = webserver.util.buildErrorPage ("302 FOUND", "Found the page."); adrParamTable^.responseHeaders.location = url; adrParamTable^.responseHeaders.URI = url; try {delete (@adrParamTable^.responseHeaders.["Content-Type"])}; return (true)}; adrParamTable^.path = string.popTrailing (adrParamTable^.path, "/"); adrParamTable^.path = adrParamTable^.path + "/" + i + ".wsf"; <<adrParamTable^.URI = string.urlEncode(adrParamTable^.path) adrParamTable^.URI = adrParamTable^.path; //PBS 01/19/01: don't URL-encode the URI return (this^ (adrParamTable))}}; // Yes we recurse here so default behaves correctly bundle { //Tables are not served adrParamTable^.code = 403; adrParamTable^.responseBody = webserver.util.buildErrorPage ("403 Forbidden", "Access to the object " + adrParamTable^.path + " is forbidden."); return (true)}} else { // Not a table return (serve (objName))}} else { //otherwise it should be serving out of the file system if adrParamTable^.resultType == filespecType { // we are serving out of the File System <<Start the serving process if file.isFolder (objName) { local (i); <<Check for the default element to render for i in prefsTableAdr^.fileDefault { local (default); default = string.popTrailing (objName, file.getPathChar()) + file.getPathChar() + i; if file.exists (default) { return(fileServe(default))}}; bundle { //Directories are not served adrParamTable^.code = 403; adrParamTable^.responseBody = webserver.util.buildErrorPage ("403 Forbidden", "Access to the object " + adrParamTable^.path + " is forbidden."); return (true)}} else { // Just a simple file... return (fileServe (objName))}} else { //this should never occur adrParamTable^.code = 500; adrParamTable^.responseBody = webserver.util.buildErrorPage ("500 Internal Server Error", "The type of the object " + adrParamTable^.path + " is unknown.")}}; return (true)} <<bundle //test code <<any (@scratchpad.anyparams)
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.