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.
2012-04-13 - Friday the Thirteenth special edition
Release version: [L1 ]; line differences: [L2 ]; word differences: [L3 ]; announcement: [L4 ]
AMG: Only two things are fixed in this version.
- Quote ' (apostrophe) as ' in HTML attributes.
- Automatically focus the entry widget when using the non-console Tk command interface.
- Bump version number. Yeah, I forgot to do this in page version 30.
2012-04-01 - April Fool's special edition
Release version: [L5 ]; line differences: [L6 ]; word differences: [L7 ]; announcement: [L8 ]
AMG: Any bugs introduced by this release are intentional April Fool's pranks, not careless mistakes.
- Add [dict getnull] command to simplify the common task of checking if a dict key exists before getting its value. It's very common to want to treat missing values as empty, so this new command makes sense.
- Double the performance of [dehex].
- Simplify [icc::catch] a tiny bit.
- Remove some looping and [set]s in the path normalization code in [getrequest].
- Allow for custom POST content-types such as application/json-rpc.
- Let the application replace [socket] with a custom command, e.g. [tls::socket].
- Add rudimentary history support to the command entry window, used when running Wibble with wish on a platform where there's no [console] command.
- Bump version number. I should do this every time...
2011-11-28 - [icc catch] fix
Release version: [L9 ]; line differences: [L10 ]; word differences: [L11 ]; announcement: [L12 ]
AMG: Just one change this time.
- Fix [icc catch] to properly bytecode the script and to correctly handle [return], etc. inside the script.
2011-11-27 - [icc] improvements
Release version: [L13 ]; line differences: [L14 ]; word differences: [L15 ]; announcement: [L16 ]
AMG: Some [icc] stuff...
- Improve comments.
- In [deheader], split if-match and if-none-match to be separate header types.
- Always accept exception and timeout events.
- Remove unnecessary ifs.
- Add [icc destroy] to destroy a feed, performing cleanup along the way.
- Add support for exception events to [icc get].
- Guard against [icc destroy] happening in the middle of [icc get].
- Add [icc catch] to get exception events.
- Don't explicitly accept timeout in the coroutine feed.
- In [panic], don't attempt to send errors to the client if not using HTTP.
- Improve demo to use docroot directory if it exists.
2011-11-24 - New outgoing header format, Thanksgiving bonanza
Release version: [L17 ]; line differences: [L18 ]; word differences: [L19 ]; announcement: [L20 ]
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 dicts.
- 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 [L21 ].
- 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]
- Update [deheader] for changes in encode/decode procs.
- 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.
- 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: [L23 ]; line differences: [L24 ]; word differences: [L25 ]; announcement: [L26 ]
AMG: I added a bunch of new features.
- Change "wibble" to "::wibble" to support being sourced, 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: [L27 ]; line differences: [L28 ]; word differences: [L29 ]; announcement: [L30 ]
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: [L31 ]; line differences: [L32 ]; word differences: [L33 ]; announcement: [L34 ]
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: [L35 ]; line differences: [L36 ]; word differences: [L37 ]; announcement: [L38 ]
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 coroutines [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: [L39 ]; line differences: [L40 ]; word differences: [L41 ]; announcement: [L42 ]
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 [L43 ]).
- 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 [L44 ]).
- Spell out "peerhost" and "peerport".
- Re-fix the [namespace code] in [accept] (see [L45 ]).
2010-11-07 - Separate templates and scripts, improved request dictionary reporting
Release version: [L46 ]; line differences: [L47 ]; word differences: [L48 ]; announcement: [L49 ]
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: [L50 ]; line differences: [L51 ]; word differences: [L52 ]; announcement: [L53 ]
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 <pre>.
- [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 <td><b> with <th> 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 [L54 ]).
- 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 [L55 ]).
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.