Monday, November 08, 2010 at 12:06 AM.

system.verbs.builtins.webserver.data.responders.CGI.methods.any

<<Script: system.verbs.builtins.webserver.data.responders.CGI.methods.any; Version 1; Date: Wed, 20 May 1998 00:33:42 GMT; ID: RAB
	<<removed call to webserver.init
on any (adrParams) {
	<<we're using compatibility mode for speed
	
	local {
		adrHeaderTable = @adrParams^.requestHeaders};
	local (s, paramTable);
	local (request = adrparams^.request);
	local (lowerRequest = string.lower (request));
	local (frontierPath = frontier.getProgramPath ());
	local (authorization);
	
	new (tableType, @paramTable);
	paramTable.fullRequest = string (request);
	request = string.replaceAll (request, cr + lf, cr);
	lowerRequest = string.lower (request);
	
	on decodePassword (s) {
		local (val, usr, pass);
		val = string (base64.decode (s));
		usr = string.nthField (val, ":", 1);
		pass  = string.nthField (val, ":", 2);
		return ({usr, pass})};
	on parseAuthorization (s) {
		local (basicStart = string.patternMatch ("Basic", s));
		if basicStart {
			s = string.mid (s, basicStart + 6, infinity);
			return (decodePassword (s))}
		else {
			return ({"",""})}};
	bundle { // Set up cgi parameters table.
		<<March 05, 1998 at 8:38:22 PM by WMF
			<<This script needs to do less work because the server does more work
		<<on getField (fieldName)
			<<local (ix, x)
			<<fieldName = string.lower (fieldName + ":")
			<<ix = string.patternMatch (fieldName, lowerRequest)
			<<if ix < 1
				<<return ("")
			<<x = string.mid (request, ix, infinity)
			<<x = string.nthField (x, cr, 1)
			<<x = string.delete (x, 1, sizeOf (fieldName) + 1)
			<<x = string.popLeading (x, ' ')
			<<return (x)
		on getField (fieldName) { // March 05, 1998 at 8:29:07 PM by WMF
			if defined (adrParams^.requestHeaders.[fieldName]) {
				return (adrParams^.requestHeaders.[fieldName])}
			else {
				return ("")}};
		
		<<paramTable.scriptName = string.nthField (request, cr, 1)
		<<paramTable.scriptName = string.nthField (paramTable.scriptName, ' ', 2)
		paramTable.scriptName = adrParams^.path;
		paramTable.scriptName = string.urlDecode (paramTable.scriptName);
		<<if paramTable.scriptName contains "?"
			<<paramTable.httpSearchArgs = string.nthField (paramTable.scriptName, "?", 2)
			<<paramTable.scriptName = string.nthField (paramTable.scriptName, "?", 1)
		paramTable.httpSearchArgs = adrParams^.searchArgs;
		<<if paramTable.scriptName contains "$"
			<<paramTable.pathArgs = string.nthField (paramTable.scriptName, "$", 2)
			<<paramTable.scriptName = string.nthField (paramTable.scriptName, "$", 1)
		paramTable.pathArgs = adrParams^.pathArgs;
		
		paramTable.accept = getField ("accept");
		paramTable.acceptCharset = getField ("accept-charset");
		paramTable.acceptEncoding = getField ("accept-encoding");
		paramTable.acceptLanguage = getField ("accept-language");
		
		paramTable.appName = file.fileFromPath (frontierPath);
		paramTable.connection = getField ("connection");
		paramTable.connectionID = adrparams^.stream;
		paramTable.contentType = getField ("content-type");
		paramTable.fromUser = getField ("from");
		paramTable.host = getField ("host");
		paramTable.method = adrParams^.method;
		
		<<paramTable.postArgs = ""
		<<paramTable.postArgs = string.popTrailing (string.delete (request, 1, string.patternMatch ("\r\r", request) +1), cr)
		paramTable.postArgs = adrparams^.requestBody;
		<<theoretically, we should only parse the POST args if the content-type says that it's form data
			<<however, this would probably be too strict and break a bunch of stuff
		if paramTable.postArgs != "" { // parse post arguments into a table.
			new (tableType, @paramTable.argTable);
			webserver.parseArgs (paramTable.postArgs, @paramTable.argTable)};
		
		paramTable.referer = getField ("referer");
		paramTable.serverName = tcp.addressDecode (tcp.myAddress());
		paramTable.serverPath = frontierPath;
		<<paramTable.serverPort = parentof (this^)^.port
		paramTable.serverPort = adrParams^.port;
		paramTable.userAgent = getField ("user-agent");
		
		paramTable.userName = "";
		paramTable.password = "";
		authorization = getField ("authorization");
		if authorization != "" {
			local (authorizationList = parseAuthorization (authorization));
			paramTable.userName = authorizationList [1];
			paramTable.password = authorizationList [2]};
		
		paramTable.clientIP = adrparams^.client;
		if webserver.getPref ("fluseDNS") {
			try {
				paramTable.clientAddress = tcp.addressToName (tcp.addressEncode (adrparams^.client))}
			else {
				paramTable.clientAddress = adrparams^.client}}
		else {
			paramTable.clientAddress = adrparams^.client}};
	
	return (webserver.handler (@paramTable))}



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.