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


on domainStats (pta) {
	<<Keep track of the  number of hits per domain, and number of seconds spent processing hits, by domain, and number of bytes served, by domain. 
		<<11/05/1999 at 7:29:59 PM by AR
	if webserver.getPref ("flDomainStats") {
		local (host = "default");
		if defined (pta^.requestHeaders.["Host"]) {
			local (hostName = pta^.requestHeaders.["Host"]);
			if defined ([hostName]) {
				host = hostName}
			else {
				if hostName contains ":" {
					hostName = string.popSuffix (hostName, ":")}; //remove trailing port
				hostName = string.popTrailing (hostName, '.'); //remove trailing dot
				if defined ([hostName]) {
					host = hostName}}};
		local (adrStats =;
		if not defined (adrStats^) {
			new (tableType, adrStats)};
		local (adrHost = @adrStats^.[host]);
		if not defined (adrHost^) {
			new (tableType, adrHost)};
		local (ticks = clock.ticks () - pta^.stats.requestProcessingStarted);
		if not defined (adrHost^.ticks) {
			adrHost^.ticks = 0};
		adrHost^.ticks = adrHost^.ticks + ticks;
		if not defined (adrHost^.hits) {
			adrHost^.hits = 0};
		if not defined (adrHost^.bytes) {
			adrHost^.bytes = 0};
		if defined (pta^.responseBody) {
			adrHost^.bytes = adrHost^.bytes + string.length (pta^.responseBody)}};
	return (true)}

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.