Monday, November 08, 2010 at 12:07 AM.
system.verbs.builtins.webserver.util.parseHeaders
on parseHeaders (response, adrHeaderTable) {
<<Thursday, November 11, 1999 at 3:07:37 AM by AR
<<Implemented as a kernel script in Frontier 6.1.
<<Old code
<<on parseHeaders (response, adrHeaderTable)
<<Script: system.verbs.builtins.webserver.util.parseHeaders; Version 1; Date: Thu, 14 May 1998 00:09:29 GMT; ID: RAB
<<March 12, 1998 at 5:19:47 PM by WMF
<<This script will parse the headers of an HTTP request or response into the given table
<<It returns the first line of the request/response
<<local (firstLine)
<<local (headers = string.mid (response, 0, string.patternmatch ("\r\n\r\n", response) ) )
<<local (i, headerLine, headerName, headerValue)
<<
<<headers = string.replaceAll (headers, "\r\n", cr)
<<firstLine = string.nthField (headers, cr, 1)
<<if not defined (adrHeaderTable^)
<<new (tableType, adrHeaderTable)
<<for i =2 to string.countFields (headers, cr)
<<headerLine = string.nthField (headers, cr, i)
<<headerName = string.nthField (headerLine, ':', 1)
<<headerValue = string.popLeading(string.delete (headerLine, 1, sizeOf(headerName)+1), ' ')
<<if !defined (adrHeaderTable^.[headerName])
<<adrHeaderTable^.[headerName] = headerValue
<<else // in case of duplicate headers, make a list
<<if typeOf(adrHeaderTable^.[headerName]) == listType
<<adrHeaderTable^.[headerName] = adrHeaderTable^.[headerName] + {headerValue}
<<else
<<adrHeaderTable^.[headerName] = {adrHeaderTable^.[headerName], headerValue}
<<
<<return (firstLine)
kernel (webserver.parseheaders)}
<<bundle //test code
<<local (ix, ct = clock.ticks ())
<<for ix = 1 to 10
<<local (t); new (tableType, @t)
<<parseHeaders (string (scratchpad.testRequest), @t)
<<ct = clock.ticks () - ct
<<dialog.notify ("Ticks: " + ct)
<<bundle //timing code
<<local (i, ct = clock.ticks ())
<<for i = 1 to 100
<<local (t); new (tableType, @t)
<<parseHeaders (string (scratchpad.testrequest), @t)
<<msg ((clock.ticks () - ct ) / 100.0)
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.