[AMG]: This page lists detailed change information for [Wibble implementation]. See also [Wibble news] for higher-level announcements. Discussion can be in-line here, on the [Wibble discussion] page if it's lengthy, or on [Wibble bugs] if you want to report a problem. <> ---- **2011-11-24 - New outgoing header format, Thanksgiving bonanza** '''Release version''': [http://wiki.tcl.tk/_/revision?N=27377.code&V=25]; '''line differences''': [http://wiki.tcl.tk/_/diff?N=27377&V=25&D=24&W=0]; '''word differences''': [http://wiki.tcl.tk/_/diff?N=27377&V=25&D=24&W=1]; '''announcement''': [http://wiki.tcl.tk/27383#pagetoc58b50302] [AMG]: ''Major'' revision! * Bump revision to 0.2. * Put zone handlers in "::wibble::zone" [namespace]. * Rewrite zone handlers to properly inherit from the existing state [dict]s. * Rename the [[static]], [[template], and [[script]] zone handlers to [[staticfile]], [[templatefile]], and [[scriptfile]], respectively. * Change [[compiletemplate]] to [[template]], which immediately expands the template rather than just compiling it. ** This effectively reverts a change made in the 2010-11-06 revision [http://wiki.tcl.tk/27384#pagetoc4c207243]. * Use [[template]] in zone handlers when appropriate. * Fundamentally change the format of response headers generated by zone handlers. ** The new format mirrors the format of request headers. * Change the branch order of [[indexfile]] to prefer serving index.html. * Remove caching of template scripts. ** Writing files into the docroot made me nervous... * Add [[contenttype]] zone handler to guess content-type from file extension. * Expand [[dumprequest]] into [[dumpstate]] which analyzes the entire state dictionary, not just a request dictionary. * Remove [[enurl]] and [[deurl]]. * Make [[enhex]] more flexible to make up for the loss of [[enurl]]. * Update [[enquery]]/[[dequery]] to use [[enhex]]/[[dehex]] instead of [[enurl]]/[[deurl]]. * Add [[entime]] and [[detime]] to process HTTP time/date, both relative and absolute. * Improve correctness of [[delist]], and teach it to recognize weak tag prefix ("w/"). * Add [[enquote]] to complement [[dequote]]. * Add [[entag]] and [[detag]] to process HTTP entity tags, including weak tags. * Add [[enheader]] to complement [[deheader]] ** HUGE new feature! * Update [[deheader]] for changes in encode/decode [proc]s. * Add support for cache-control, if-range, and date headers to [[deheader]]. * Correct if-match and if-none-match support in [[deheader]]. * Beef up warning support in [[deheader]]. * Call [[dequote]] by default in [[deheader]]. * Eliminate duplicate filters in [[icc configure accept]]. * Style tweak to [[icc put]]. * Search for zone handler commands in the new "::wibble::zone" namespace. * Add cleanup script naming and cancellation capabilities to [[cleanup]]. * Simplify path normalization [regexp] in [[getrequest]]. * Add TE/transfercoding to accept dictionary generation. * Prefer [[[dict for]]] over [[[foreach]]]. * Replace [[deurl]] with [[dehex]] in [[getrequest]]. * Add blank response dictionary to initial system dictionary in [[getresponse]]. * Set charset to utf-8 in various places. ** This change is probably a mistake, since the output will be converted to iso8859-1 anyway. * Move much of the guts of [[process]] into [[defaultsend]]. * In [[defaultsend]], use the updated [[cleanup]] facility to close the contentfile. * Use [[enheader]] in [[defaultsend]] to encode the outgoing headers for HTTP. * Remove header capitalization normalization. * Add connection: close capability via the return value of [[defaultsend]]. * Update [[process]] for the change in [[cleanup]]. * Have [[process]] call [[defaultsend]] or a custom send command supplied by the zone handler. ** This can be used to implement upgrading, e.g. [WebSocket] and [Server-Sent Events] [http://en.wikipedia.org/wiki/Server-sent_events]. * Move the error log code into [[panic]] which can be overridden by the application. * Update panic code to use [[dumpstate]] instead of [[dumprequest]]. * In Wibble demo, explicitly initialize zonehandlers to empty. ** This facilitates re-sourcing wibble.tcl in the middle of execution. * Add sample content-type zone handler configuration. * Add Tk console to demo. ** Use [[[console show]]] if available. Customize it, too. ** If that fails, provide a bare-bones command prompt window. ---- **2011-02-03 - Inter-coroutine communication, text/xml POST, cleanup scripts, contentchan** '''Release version''': [http://wiki.tcl.tk/_/revision?N=27377.code&V=24]; '''line differences''': [http://wiki.tcl.tk/_/diff?N=27377&V=24&D=21&W=0]; '''word differences''': [http://wiki.tcl.tk/_/diff?N=27377&V=24&D=21&W=1]; '''announcement''': [http://wiki.tcl.tk/27383#pagetoc56a64650] [AMG]: I added a bunch of new features. * Change "wibble" to "::wibble" to support being [source]d, etc. when not in the :: [namespace]. This was done by [JCW]'s request. * Add [[redirect]] zone handler. * Modify [[dirslash]] to chain to [[redirect]]. * Add [[forbidden]] zone handler. * Modify [[dirlist]] to chain to [[forbidden]]. * Add [[[string trimright]]] to end of [[compiletemplate]]. I can't remember exactly why I did this, but I think it cleans up the output a little bit in some obscure corner case. * Allow display of multiline data in [[dumprequest]], so long as the hard-coded string length limit isn't exceeded. * Remove [[resume]] and [[suspend]]. * Remove argument from [[getline]] and [[getblock]]; instead derive the socket name from the coroutine name. * Use the new [[icc]] commands instead of [[resume]] and [[suspend]]. * Strip CR in [[enhtml]], [[enattr]], and [[enpre]]. * Add new [[icc]] commands. * Add [[cleanup]] command. * Update accept list generation logic to discard elements with a nonpositive qvalue. * Restructure the POST content-type dispatch code. * Add text/xml POST support. * Add default set of cleanup scripts. * Create an ICC feed for each coroutine. * Add support for contentchan/contentsize in addition to content and contentfile. * Don't error on flushing an output socket. (Maybe I should revert this change.) * Call cleanup scripts when the coroutine terminates. * Avoid gratuitous use of [[[namespace code]]]. **2010-12-22 - Fix 501 bug, remove empty query and post** '''Release version''': [http://wiki.tcl.tk/_/revision?N=27377.code&V=21]; '''line differences''': [http://wiki.tcl.tk/_/diff?N=27377&V=21&D=18&W=0]; '''word differences''': [http://wiki.tcl.tk/_/diff?N=27377&V=21&D=18&W=1]; '''announcement''': [http://wiki.tcl.tk/27383#pagetoc41bb1c27] [AMG]: Oops. The 501 code didn't work. I forgot to quote the value of the header key, resulting in an extra argument to [[[dict create]]]. Also, I removed the query, rawquery, post, and rawpost keys from the request dictionary when no query or post was made. This makes it easier to check if there was a query or a post. * Fix 501 bug. * Remove empty query, rawquery, post, and rawpost dicts. **2010-12-20 - Remove no-op [[nexthandler]] invocations, rearrange [[suspend]]** '''Release version''': [http://wiki.tcl.tk/_/revision?N=27377.code&V=18]; '''line differences''': [http://wiki.tcl.tk/_/diff?N=27377&V=18&D=17&W=0]; '''word differences''': [http://wiki.tcl.tk/_/diff?N=27377&V=18&D=17&W=1]; '''announcement''': [http://wiki.tcl.tk/27383#pagetocc7121a3d] [AMG]: Per [JBR]'s suggestion, I removed the [[nexthandler $state]] calls when $state is unmodified. Instead the zone handler just returns. This winds up having the same effect, because the no-op [[nexthandler $state]] was changing $system without really modifying it. ;^) * Remove no-op [[nexthandler]] invocations throughout Wibble. * Clarify the comment for [[resume]]. * Rearrange [[suspend]] to be a little easier to understand. **2010-12-18 - State dicts, coroutine helpers, fixed zone handler order** '''Release version''': [http://wiki.tcl.tk/_/revision?N=27377.code&V=17]; '''line differences''': [http://wiki.tcl.tk/_/diff?N=27377&V=17&D=13&W=0]; '''word differences''': [http://wiki.tcl.tk/_/diff?N=27377&V=17&D=13&W=1]; '''announcement''': [http://wiki.tcl.tk/27383#pagetocab50d82b] [AMG]: I changed the zone handler arguments, so any existing zone handlers will have to be rewritten. I hope this new method works better than the fixed request/response approach I had before. Also, I changed the way the [coroutine]s [[[yield]]] and are resumed; this should make [AJAX] work better. (Yes, Wibble supports AJAX!) * Cutesy [CSS] changes in [[vars]]. * Update all zone handlers to receive a unified state dict instead of request and response dicts. * Update [[vars]] to display all sub-dicts in $state. * Pointless wording, capitalization, comment, and indentation changes. * Fix [[dumprequest]] to format query the same as post. * Write [[resume]] and [[suspend]] as wrappers around reinvoking the coroutine and [[yield]]. * Remove [[[chan names]]] testing code since it didn't work anyway. * Update [[getline]] and [[getblock]] to use [[suspend]]. * Rename $zones to $zonehandlers. * Change $zonehandlers to be a flat list instead of a dict. * Rewrite [[getresponse]] to use state dictionaries instead of request/response pairs. * Don't merge options into the request dict; instead make a separate options dict in $state. * Fix zone order handling in [[getresponse]]. * Fix a subtle bug in [[getresponse]] that can make it replace the wrong state entry in $system. * Update the [[[chan copy]]] code to use [[resume]] and [[suspend]]. * Don't install the [[[chan event]]] handler in [[listen]] since it'll be installed by [[suspend]]. ---- **2010-11-13 - Non-blocking file transfers, bug workarounds** '''Release version''': [http://wiki.tcl.tk/_/revision?N=27377.code&V=13]; '''line differences''': [http://wiki.tcl.tk/_/diff?N=27377&V=13&D=11&W=0]; '''word differences''': [http://wiki.tcl.tk/_/diff?N=27377&V=13&D=11&W=1]; '''announcement''': [http://wiki.tcl.tk/27383#pagetoc8a441aa4] [AMG]: Sorry about the blocking [[[chan copy]]]. It's fixed now. * Don't initialize $wibble::zones to empty string. This makes it easier to re-[[[source]]] wibble.tcl while it's running. * Remove some extra [[[chan close]]]s. The channel will be closed anyway by the finally clause at the end of [[process]]. * Add workaround for the Wiki bug that was corrupting [[enhtml]] and [[enattr]] (see [http://wiki.tcl.tk/27382#pagetoc5da162fc]). * Remove the question mark from [[enquery]] to make it mirror [[dequery]] * Make [[chan copy]] be non-blocking. * Add workaround for the "command returned bad code: 2" Tcl bug (see [http://wiki.tcl.tk/27382#pagetoc640ac485]). * Spell out "peerhost" and "peerport". * Re-fix the [[[namespace code]]] in [[accept]] (see [http://wiki.tcl.tk/27382#pagetoca290566b]). ---- **2010-11-07 - Separate templates and scripts, improved request dictionary reporting** '''Release version''': [http://wiki.tcl.tk/_/revision?N=27377.code&V=11]; '''line differences''': [http://wiki.tcl.tk/_/diff?N=27377&V=11&D=6&W=0]; '''word differences''': [http://wiki.tcl.tk/_/diff?N=27377&V=11&D=6&W=1]; '''announcement''': [http://wiki.tcl.tk/27383#pagetoc40fc9a27] [AMG]: Now that I've finished reorganizing all the Wibble pages, I'm eager to edit them some more! :^) * Write [[dumprequest]] to partially "flatten" a request dictionary to make it easier to display. * Make the output of the vars zone handler much nicer. * Make the error log nicer too. * Split the template zone handler into two pieces: ** [[template]]: Compile *.tmpl files into *.script files. ** [[script]]: Execute *.script files. * Add rawtime, time, and port to the request dictionary. * Completely remove PUT. * Slightly simplify POST handling. * Replace [[[dict for]]] with [[[foreach]]] to support duplicate keys. * Improve the failsafe ![[[info exists] $request]] error log. * Remove -nonewline option from [[log]]. * Move \n from the end to the beginning of the line. * Add new script zone handler to example code. * Remove special logging of the never-implemented "content" key in the request dictionary. * Remove [[accept]] and changed [[listen]] to use [[[apply]]]. ---- **2010-11-06 - Header and POST parsing** '''Release version''': [http://wiki.tcl.tk/_/revision?N=27377.code&V=4]; '''line differences''': [http://wiki.tcl.tk/_/diff?N=27377&V=4&D=0&W=0]; '''word differences''': [http://wiki.tcl.tk/_/diff?N=27377&V=4&D=0&W=1]; '''announcement''': [http://wiki.tcl.tk/27383#pagetoc7f4ca42f] [AMG]: I've been holding on to these changes for far too long, and I'm glad to finally publish them. * Add separator comments delimiting major sections of the code. * Change usage of [[[dict with] request]] to cut down on indenting. * Add many conversion routines: ** [[enhtml]]: Encode for HTML. ** [[enattr]]: Encode for HTML tag attribute. ** [[enpre]]: Encode for HTML
.
   ** [[enquery]]: Encode a query string.
   ** [[dequery]]: Decode a query string into a list.
   ** [[enhex]]: Encode most non-alphanumerics with hexadecimal codes.
   ** [[dehex]]: Decode hexadecimal encoding.
   ** [[enurl]]: Encode for URLs.
   ** [[deurl]]: Decode URL encoding.
   ** [[delist]]: Decode header list encoding.
   ** [[dequote]]: Decode header quoting.
   ** [[deheader]]: Decode HTTP headers.  (!!!)
   * Actually, [[dehex]] already existed, named [[unhex]].  Rename because [[enhex]] and [[unhex]] are too similar.
   * Modify zone handlers to use new conversion routines, e.g. [[enhtml]].
   * Replace  with  in [[vars]].
   * Simplify the way [[dirlist]] adds .. to the directory listing.
   * Change [[applytemplate]] to [[compiletemplate]], which returns the script instead of running it.
   * Make [[template]] cache the result of [[compiletemplate]].
   * Simplify [append]'s arguments in [[compiletemplate]].
   * Add [channel] closure detection to [[getline]] and [[getblock]].
   * Revert second-chance [[[chan gets]]] in [[getline]], since I'm not convinced it's necessary (see [http://wiki.tcl.tk/27382#pagetoc3c65f636]).
   * Change the way [[nexthandler]] and [[sendresponse]] pass control back to [[getresponse]].
   * Add accept, post, and rawpost to the request dictionary.
   * Add Accept*: header handling.
   * Add POST handling.
   * [Unset] request dictionary after sending the response to avoid stale data.
   * Correct error report charset.
   * Incorporate [APN]'s [[accept]] fix (see [http://wiki.tcl.tk/27382#pagetoc8c99f371]).

The channel closure detection makes it possible to close connections due to timeouts.  This isn't implemented yet, but it would be nice to harden Wibble against basic [DoS] attacks.

<> Wibble