| What | '''DustMote''' | | Where | http://www.simtel.net/pub/pd/6948.html | | | ftp://ftp.simtel.net/pub/simtelnet/win95/webbrows/dumo102.zip | | Description | '''A web server in one page of Tcl code.''' | | | A tiny HTTP server written in Tcl with nearly no features. | | | Designed for the user to easily add the features they want in Tcl. | | | Size is only 3k, so it can be easily modified. | | | Uses non-blocking channels to support many clients simultaneously. | | | Tested heavily on Windows 95, moderately on Linux, and lightly on MacOS. | | Updated | 10/2002 | | Contact | mailto:hmk@nadn.navy.mil (Harold Melvin Kaplan) | [LES] on 20040929: The wind of time has taken this dust mote away. We shall be taken as well sooner or later. [Larry Smith] on 20041007: It's small enough that it can be included here: **Code** ====== # This web server program has a smaller source than any other # that I have seen or heard of. # Its name is DustMote, and I hereby place it in the public domain. # I wrote it in the Tcl language because Tcl is free, easy, stable, and # well documented. For more documentation than comes with the Tcl # download, one may purchase Brent B. Welch's excellent book, "Practical # Programming in Tcl and Tk," second edition, Prentice Hall PTR. It is # well worth the money. It is true that Tcl is not remarkably speedy, but # it is fast enough for my site, and, though not multi-threaded, it can # handle many clients at the same time asynchronously, by the use of # non-blocking channels. # Of course, there are now many freeware server programs to be downloaded # from the web, and most of them are sturdy professional jobs that go like # lightning and swarm with useful features. The businessperson ought to # use one of those. I am an amateur, so I had to write the program myself. # There are nearly no features. All DustMote can do is serve files, both # text and image. I offer it to fellow amateurs, so they can ignore other # people's features and think up new features that have never been thought # up before. # If you do use my program, remember to change the definition of "root" to # suit your computer. Be sure to use forward slashes, not backward, or # else double them so Tcl will understand them rightly. # Please E-mail complaints to hmk@nadn.navy.mil and do not try to spare my # feelings. The date of this revision is May 26, 1998. # Yours truly, # Harold Kaplan. set root "f:/public_html" set default "index.html" set port 80 proc bgerror {trouble} {puts stdout "bgerror: $trouble"} proc answer {socketChannel host2 port2} { fileevent $socketChannel readable [list readIt $socketChannel] } proc readIt {socketChannel} { global root default fconfigure $socketChannel -blocking 0 set gotLine [gets $socketChannel] if { [fblocked $socketChannel] } then {return} fileevent $socketChannel readable "" set shortName "/" regexp {/[^ ]*} $gotLine shortName set many [string length $shortName] set last [string index $shortName [expr {$many-1}] ] if {$last=="/"} then {set shortName $shortName$default } set wholeName $root$shortName if {[catch {set fileChannel [open $wholeName RDONLY] } ]} { puts $socketChannel "HTTP/1.0 404 Not found" puts $socketChannel "" puts $socketChannel "<No such URL.>" puts $socketChannel "
" puts $socketChannel "The URL you requested does not exist on this site." puts $socketChannel "
" close $socketChannel } else { fconfigure $fileChannel -translation binary fconfigure $socketChannel -translation binary -buffering full puts $socketChannel "HTTP/1.0 200 OK" puts $socketChannel "" fcopy $fileChannel $socketChannel -command [list done $fileChannel $socketChannel] } } proc done {inChan outChan args} { close $inChan close $outChan } socket -server answer $port vwait forEver ====== **Discussion** [MS] offers a small change that will increase the performance for multiple simultaneous queries. Key idea: replace read/puts with fcopy. Incidentally, that should be ''puts -nonewline'' in the original. The idea is to add ====== proc done {inChan outChan args} { close $inChan close $outChan } ====== move the "close $socketChannel" to the first branch, and replace the last three lines of the second branch with fcopy $fileChannel $socketChannel -command [list done $fileChannel $socketChannel] [MJ] - 20070128: Added suggestion by [MS] and braced expr's [gavino] * outstanding 41 lines of code! * works with images * smaller than wibble * mini demo webserver seems not to work with images * smallest tcl server to run a internal info website with just tcl 8.6 and dustmote! awesome! [dbohdan] 2015-04-07: [Tclssg] includes a modified [https://github.com/tclssg/tclssg/blob/master/lib/tclssg/webserver/webserver.tcl%|%version of DustMote]. This version can log requests to stdout, serves files with [MIME] type (''Content-Type'') specified and supports custom route handlers. It is wrapped in a [namespace] for easier embedding and does not require [Tcllib]. The following is an example of a custom handler: ====== ::tclssg::webserver::add-handler /bye { socketChannel { puts "shutting down" puts $socketChannel {HTTP/1.0 204 No Content} puts $socketChannel {} close $socketChannel set ::tclssg::webserver::done 1 } } ====== A further extended version that uses [Snit] can be found through a link below. **See also** * [Inspecting app state with a browser] * [Web servers which provide native Tcl support] ***DustMote derivatives*** * [DustMote with Snit] * [CHMvfs] Web server * [Playing CGI] — needs 47 lines of code, but serves active content too :^) * [tcliki - a webserver based on DustMote] * [EmberWeb] - A simple web framework based off the Dustmote code. It's TCL only and is being written for use on small systems, but does not exclude use on larger systems. ***Similar Web servers*** * [8-Line Server] * [Castle] — [Larry Smith]: Anyone interested in dumo might also be interested in Castle. * [Embedded TCL Web Server] * [Mini Demo Webserver] * [scwsd] <> Application | Internet | Webserver