Factor Language Blog

An addendum to "The new HTTP server, part 2"

Tuesday, April 29, 2008

If you run the web app presented in the last blog post verbatim, you will get a “500 Internal server error” with no further indication of what’s going wrong. This is because the code I presented has a minor omission.

The opaque error message is intentional: if your web app crashes, you don’t necessarily want to expose internal details to every user that comes along (one famous case was reddit.com, which leaked a portion of their Python codebase inside a stack trace at some point). However, if you set the development-mode global variable to a true value, the behavior of the HTTP server changes in two respects:

  • If an error occurs, the error page contains the error message as well as the full stack trace.
  • Every request begins by calling refresh-all, thus interactive testing of web app changes becomes very straightforward.

If we enable development mode, we see the real error message, “No such table: SESSIONS”. This is because I didn’t mention that one must initialize the database by creating the table for storing sessions first:

"counter.db" sqlite-db [ init-sessions-table ] with-db

In the next installment of this series, which hopefully won’t take as long as the second one did, I will discuss form validation and the templating system.