[Coco] The Coco's first webserver, written in Basic09
Aaron Wolfe
aawolfe at gmail.com
Wed Dec 30 10:02:19 EST 2009
Hi folks,
The Coco is now serving up web pages.. I guess it was only a matter of time :)
http://home.spogbiper.com/
Not much to look at, but all HTTP is processed and all HTML is
generated by the Coco.
All that drivewire is doing is passing raw data from TCP socket to the
Coco over a DriveWire virtual channel.
The source for the web server is below. I hope it serves as an
example of how easy it is to use the new features in drivewire to
write programs that talk to the outside world.
It can easily be improved to do much more. I plan to have it serving
up files and show directory listings for Coco disks soon. You'll be
able to browse files on your Coco using a browser and fun things like
that.
As a side note, I added "weather" command to my test coco that will
show you the weather for many cities or zip codes.
Basic09 source for "httpd" (please don't laugh, its my first Basic09 program):
PROCEDURE httpd
DIM port_path:BYTE
DIM port_name:STRING[4]
DIM errnum,tmp:INTEGER
DIM reqstr:STRING
DIM reqid:BYTE
TYPE servin = id:BYTE; control:BYTE; dat:STRING[128]
DIM srv_in:servin
DIM hits:INTEGER
port_name="/U0"
hits=0
ON ERROR GOTO 100
10 OPEN #port_path,port_name:UPDATE
PRINT "USING UTILITY PORT ";port_name
GOTO 30
20 PRINT "TRY NEXT"
tmp := PEEK(ADDR(port_name)+2)
tmp := tmp + 1
POKE ADDR(port_name) + 2, tmp
GOTO 10
30 PRINT "MAIN LOOP"
ON ERROR GOTO 200
PRINT #port_path,"httpd"
PRINT #port_path,"start"
REPEAT
REPEAT
GET #port_path,srv_in
IF LEFT$(srv_in.dat,3) = "GET" THEN
reqstr = TRIM$(RIGHT$(srv_in.dat,124))
reqid = srv_in.id
ENDIF
UNTIL (srv_in.control = 1) OR (srv_in.control = 0)
hits = hits + 1
IF srv_in.control = 1 THEN
print "REQUEST",reqstr
IF LEFT$(reqstr,2) = "/ " THEN
PRINT #port_path,"HTTP/1.1 200 OK"
PRINT #port_path,"Server: COCO OS9 DriveWire"
PRINT #port_path,"Connection: close"
PRINT #port_path,""
PRINT #port_path,"<HTML>"
PRINT #port_path,"<BODY BGCOLOR=#33FF33>"
PRINT #port_path,"<P><CENTER><H1>coco!</h1><P>"
PRINT #port_path,"<h4>This page is served by a Color Computer 3<BR>"
PRINT #port_path,"running <A
HREF=http://www.nitros9.org/>NitrOS-9</A>"
PRINT #port_path,"and <A
HREF=http://www.frontiernet.net/%7Emmarlette/Cloud-9/Software/DriveWire3.html>DriveWire</A>"
PRINT #port_path," <P>For more information on this
project, <A HREF=http://aaronwolfe.com/coco>click here</A><P>"
PRINT #port_path,"This server has processed "
PRINT #port_path,hits
PRINT #port_path," requests since it last crashed.</H4>"
PRINT #port_path,"</BODY>"
PRINT #port_path,"</HTML>"
PRINT #port_path,CHR$(0)
ELSE
GOSUB 1000
ENDIF
ENDIF
UNTIL srv_in.control = 0
CLOSE #port_path
END
100 errnum := ERR
IF errnum = 250 THEN
PRINT "BUSY ON PORT ",port_name
GOTO 20
ELSE
PRINT "ERROR ", errnum, " ON PORT ", port_name
END
ENDIF
200 errnum := ERR
PRINT "ERROR ", errnum
CLOSE #port_path
END
1000 PRINT #port_path,""
PRINT #port_path,CHR$(0)
RETURN
More information about the Coco
mailing list