Monday, November 08, 2010 at 12:06 AM.
system.verbs.builtins.webserver.echoResponder
on echoResponder (adrParamTable) {
<<3/3/98 at 9:36:20 PM by WMF
<<This is a debugging responder that echos all the parameters that are available to a responder
<<It is similar to the samples.tellParams CGI
<<9/26/98; 6:38:48 AM by DW
<<improved the HTML it generates to make it prettier and to learn how to upgrade responders
local (htmltext = "", indentlevel = 0);
on add (s) {
htmltext = htmltext + string.filledString ("\t", indentlevel) + s + "\r"};
local (title = "Echo Responder for \"" + tcp.dns.getMyDomainName () + "\"");
add ("<html>"); indentlevel++;
add ("<head>"); indentlevel++;
add ("<title>" + title + "</title>");
add ("</head>"); indentlevel--;
add ("<body>"); indentlevel++;
on addTable (adrtable) {
local (i, adritem, val);
add ("<table cellpadding=\"2\" border=\"0\">"); indentlevel++;
add ("<tr>"); indentlevel++;
add ("<td valign=\"top\"><b>" + "Name" + "</b></td>");
add ("<td> </td>");
add ("<td valign=\"top\"><b>" + "Value" + "</b></td>");
add ("</tr>"); indentlevel--;
for i = 1 to sizeof (adrtable^) {
adritem = @adrtable^ [i];
if typeof (adritem^) == tabletype {
val = sizeof (adritem^) + " items"}
else {
val = string (adritem^);
if sizeof (val) == 0 {
val = "\"\""};
if val contains "\r" {
val = "<pre>" + string.trimWhitespace (val) + "</pre>"}};
add ("<tr>"); indentlevel++;
add ("<td valign=\"top\">" + nameof (adritem^) + "</td>");
add ("<td> </td>");
add ("<td valign=\"top\">" + val + "</td>");
add ("</tr>"); indentlevel--};
add ("</table>"); indentlevel--};
add ("<blockquote>"); indentlevel++;
add ("<h2>" + title + "</h2>");
add ("<blockquote>"); indentlevel++;
bundle { //add introductory text
add ("This responder shows you the contents of the param table for an HTTP request received on your machine.");
add ("The first table shows you the top level items, and the second table shows you the contents of the requestHeaders sub-table.");
add ("This responder was last updated on " + timeModified (this) + ".");
add ("<p>")};
add ("<h4>Top level items in adrParamTable^</h4>");
add ("<blockquote>"); indentlevel++;
addTable (adrParamTable);
add ("</blockquote>"); indentlevel--;
add ("<h4>Contents of the adrParamTable^.requestHeaders sub-table:</h4>");
add ("<blockquote>"); indentlevel++;
addTable (@adrParamTable^.requestHeaders);
add ("</blockquote>"); indentlevel--;
add ("</blockquote>"); indentlevel--;
add ("</blockquote>"); indentlevel--;
add ("</body>"); indentlevel--;
add ("</html>"); indentlevel--;
adrParamTable^.responseHeaders.["Content-Type"] = "text/html"; // always set the MIME type
adrParamTable^.responseBody = htmltext;
return (true)}
<<bundle //test code
<<local (params)
<<new (tabletype, @params)
<<params.client = tcp.dns.getMyDomainName ()
<<new (tabletype, @params.requestHeaders)
<<params.requestHeaders.somevalue = "Hello!"
<<new (tabletype, @params.responseHeaders)
<<get (@params)
<<webbrowser.displaytext (params.responseBody)
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.