summaryrefslogtreecommitdiff
path: root/appl/svc/httpd/echo.b
diff options
context:
space:
mode:
Diffstat (limited to 'appl/svc/httpd/echo.b')
-rw-r--r--appl/svc/httpd/echo.b89
1 files changed, 89 insertions, 0 deletions
diff --git a/appl/svc/httpd/echo.b b/appl/svc/httpd/echo.b
new file mode 100644
index 00000000..686a86d2
--- /dev/null
+++ b/appl/svc/httpd/echo.b
@@ -0,0 +1,89 @@
+implement echo;
+
+include "sys.m";
+ sys: Sys;
+stderr: ref Sys->FD;
+include "bufio.m";
+
+include "draw.m";
+draw : Draw;
+
+include "cache.m";
+include "contents.m";
+include "httpd.m";
+ Private_info: import Httpd;
+
+include "cgiparse.m";
+cgiparse: CgiParse;
+
+echo: module
+{
+ init: fn(g: ref Private_info, req: Httpd->Request);
+};
+
+init(g: ref Private_info, req: Httpd->Request)
+{
+ sys = load Sys Sys->PATH;
+ stderr = sys->fildes(2);
+ cgiparse = load CgiParse CgiParse->PATH;
+ if( cgiparse == nil ) {
+ sys->fprint( stderr, "echo: cannot load %s: %r\n", CgiParse->PATH);
+ return;
+ }
+
+ send(g, cgiparse->cgiparse(g, req));
+}
+
+send(g: ref Private_info, cgidata: ref CgiData )
+{
+ bufio := g.bufio;
+ Iobuf: import bufio;
+ if( cgidata == nil ){
+ g.bout.flush();
+ return;
+ }
+
+ g.bout.puts( cgidata.httphd );
+
+ g.bout.puts("<head><title>Echo</title></head>\r\n");
+ g.bout.puts("<body><h1>Echo</h1>\r\n");
+ g.bout.puts(sys->sprint("You requested a %s on %s",
+ cgidata.method, cgidata.uri));
+ if(cgidata.search!=nil)
+ g.bout.puts(sys->sprint(" with search string %s", cgidata.search));
+ g.bout.puts(".\n");
+
+ g.bout.puts("Your client sent the following headers:<p><pre>");
+ g.bout.puts( "Client: " + cgidata.remote + "\n" );
+ g.bout.puts( "Date: " + cgidata.tmstamp + "\n" );
+ g.bout.puts( "Version: " + cgidata.version + "\n" );
+ while( cgidata.header != nil ){
+ (tag, val) := hd cgidata.header;
+ g.bout.puts( tag + " " + val + "\n" );
+ cgidata.header = tl cgidata.header;
+ }
+
+ g.bout.puts("</pre>\n");
+ if (cgidata.form != nil){
+ i := 0;
+ g.bout.puts("</pre>");
+ g.bout.puts("Your client sent the following form data:<p>");
+ g.bout.puts("<table>\n");
+ while(cgidata.form!=nil){
+ (tag, val) := hd cgidata.form;
+ g.bout.puts(sys->sprint("<tr><td>%d</td><td><I> ",i));
+ g.bout.puts(tag);
+ g.bout.puts("</I></td> ");
+ g.bout.puts("<td><B> ");
+ g.bout.puts(val);
+ g.bout.puts("</B></td></tr>\n");
+ g.bout.puts("\n");
+ cgidata.form = tl cgidata.form;
+ i++;
+ }
+ g.bout.puts("</table>\n");
+ }
+ g.bout.puts("</body>\n");
+ g.bout.flush();
+}
+