BedSheetRelease Notes



  • New: BedSheet Proxy (by default) only monitors the pods that your app depends on.
  • New: BedSheetBuilder.setIpAddress() for deploying Bed Apps to Open Shift or similar.
  • New: HttpSession.flashExists() tells you just that.
  • Chg: WebProxy handles the case when the real web app didn't start up, and forces a restart.
  • Chg: Errs are unwrapped before being handled to look for a ReProcessErr cause. (For when thrown during efan template processing.)
  • Chg: Tweaked the internals of Route processing / parameter matching to be more correct. (Potential, but unlikely, breaking change.)
  • Bug: AppRestarter threw NPE if a new pod was introduced into the Fantom environment.
  • Bug: ValueEncoders, when converting an empty Str to a nullable Str, always returned null. This had repercussions in FormBean


  • New: Asset and ClientAsset classes - re-worked FileHandler and PodHandler to use new API.
  • New: HttpRequest.urlAbs gives the absolute request URL.
  • New: FieldProcessor lets fields be returned for further processing.
  • Chg: ClientAssets are now served up via middleware, not Routes.
  • Chg: TextProcessor now handles HEAD requests.
  • Chg: Response buffering is disabled if a Content-Length header is present.
  • Bug: RequestLogMiddleware logged all requests with a status code of 200 - See RequestLogMiddleware - wrong HTTP Status for errors for details.
  • Bug: HEAD requests had their Content-Length header reset to 0.


  • Bug: New Proxy code didn't work on MacOS - thanks go to Shturman.


  • New: BedSheetBuilder.makeFromType() ctor to pass in AppModule.
  • Chg: Documentation tweaks and fixes.


  • New: Use BedSheetBuilder to create BedSheet IoC Registries and start Wisp servers.
  • New: HttpRequestBody for convenience methods to access the request body. (Similar to Butter.)
  • Chg: New Proxy code ensures all build parameters are passed to the real app.
  • Chg: Renamed Text.json() -> Text.jsonObj(). Text.json() now takes a Str. (Potential breaking change.)
  • Chg: FileHandler.fromLocalUrl() and FileHandler.fromServerFile() now take a checked parameter.
  • Chg: FileAssetProcessor now copes with duff If-None-Match Etag requests headers.


  • Chg: BedSheet now compatible with Fantom v1.0.67 - issues with gzip and the dev proxy.
  • Bug: BedSheet sometimes reported a NullErr when starting up in dev mode.


  • Bug: Startup Errs thrown by FileHandler (and middleware in general) ended up in limbo and weren't reported.


  • Chg: HTTP requests received when BedSheet is starting up are given a 500 status code and a starting up message. Previous behaviour was to queue up the requests, but that can cause issues under heavy load.
  • Chg: HttpRequest.form throws a HttpStatusErr (400 - Bad Request) should the form data be invalid - see sys::Uri.decodeQuery. SpamBots send you all sorts of crap!
  • Bug: BedSheet welcome page had the 404 page appended to it - Firefox reported the page as junk!


  • New: Errs and Funcs may be used as response objects - new ResponseProcessors added.
  • New: Added HttpRequest.parseMultiPartForm().
  • New: Added Wisp Integration section to the docs.
  • Chg: Err processing updated; gone are bespoke ErrProcessors, contribute generic repsonse objects instead. (Breaking change.)
  • Chg: HTTP Status processing updated; gone are bespoke HTTPStatusProcessors, contribute generic repsonse objects instead. (Breaking change.)
  • Chg: Replaced the HttpFlash class with HttpSession.flash(). (Breaking change.)
  • Chg: Converted Route to a mixin so users can contribute their own implementations.
  • Chg: Route matches against the entire HttpRequest, not just the URL and HTTP Method.
  • Chg: Deprecated Route methods: routeRegex, httpMethod, response.
  • Chg: Overhauled the Route matching, argument conversion and documentation. (Possible breaking change.)
  • Chg: Nullability within ValueEncoders has now been property addressed. (Breaking change in ValueEncoder mixin.)
  • Chg: Middleware now returns Void not Bool. (Breaking change.)
  • Chg: Removed deprecated methods. (Breaking change.)
  • Chg: BedSheetServer.toAbsoluteUrl() now takes a client URL, not a local URL.
  • Chg: HttpResponse.saveAsAttachment() also sets the Content-Type HTTP response header.
  • Chg: Gave FileAsset a public ctor.
  • Chg: All BedSheet services have qualified names.
  • Chg: .csv files are gzip compressible.
  • Bug: Route method params are now correctly URL decoded - see URI Encoding / Decoding.
  • Bug: Logs were overly spammed with repeated warning msgs should the client close its socket connection early.
  • Bug: MethodCall responses could not call static methods.
  • Bug: Route HTTP methods were not case-insenstive.
  • Bug: FileAsset.toStr() sometimes threw an Err.
  • Bug: HTTP Flash objects no longer need to be immutable, just serialisable.



  • New: SafeOutStream doesn't throw an IOErr should the client close the connection early.
  • New: PodHandler has a whitelist of files allowed to be served.
  • Chg: Revamped PodHandler, now contains fromLocalUrl() and fromPodResource() to parallel FileHandler.
  • Chg: Deleted BedSheetMetaData; not that you should have been using it anyway!
  • Chg: BedSheetWebMod no longer takes a BedSheet options map, all values have been merged with Registry options.
  • Bug: Development Proxy process did not work on Mac OS-X - Thanks to LightDye for Reporting.


  • New: Static files are served with a default Cache-Control HTTP response header, change via Ioc Config.
  • New: Added BedSheetServer to replace BedSheetMetaData, contains methods for generating absolute URLs.
  • New: Added toClientUrl() and toAbsoluteUrl() to BedSheetServer.
  • New: Added HttpResponseHeaders.vary to responses that could be gzipped.
  • Chg: Updated to use IoC 1.7.2.
  • Chg: Renamed HttpRequest.modRel -> HttpRequest.url.], deprecated absUri, modBase, modRel and uri.
  • Chg: HttpSession fails fast on attempts to store non-serialisable values.
  • Chg: Gzip responses also set a HTTP header of Vary: Accept-Encoding.
  • Chg: Added the Cache-Control HTTP response header to error pages to ensure they're never cached.
  • Chg: Renamed Text.fromMimeType() -> Text.fromContentType().
  • Chg: is now a Str.


  • New: FileAsset objects are generated by the FileHandler service and contain clientUrls for your web page.
  • Chg: ValueEncoders service now lets ReProcessErrs pass through un-hindered.
  • Chg: Overhauled FileHandler API. (Breaking change)
  • Chg: Renamed Text.mimeType -> Text.contentType.


  • New: Set response headers X-BedSheet-errMsg, X-BedSheet-errType and X-BedSheet-errStackTrace when processing an Err. (Dev mode only)
  • New: Boring stack frames on the Err500 page are muted (greyed) and may be toggled on and off completely via a checkbox.
  • New: FileHandler now responds to HEAD requests.
  • New: Introduced a FileMetaCache to prevent excessive hits on the file system.
  • Chg: Updated to use IoC 1.6.2 and Bean Utils.
  • Chg: BedSheet pages (404, 500 & Welcome) are served up as XHTML.
  • Chg: ReProcessErr may now re-process non-const response objects.
  • Bug: FlashMiddleware needlessly created http sessions.


  • New: Added ActorPools section to Err500 page.
  • Chg: Updated to use IoC 1.6.0 and Concurrent.
  • Chg: Routes now perform some basic validation to catch cases where the Uri would never match the method handler.
  • Chg: Atom (RSS) feeds application/atom+xml are now GZip compressible.
  • Chg: Not found requests for HTTP methods other than GET or POST return a 501, not 404.
  • Chg: All BedSheet pages render as valid XML.
  • Bug: If 2 Routes had the same Regex, only 1 was shown on the 404 page.
  • Bug: HttpFlash data could leak into concurrent web requests.


  • New: Added fromClientUri() and fromServerFile() to FileHandler.
  • New: IocConfig values, BedSheet Routes and Fantom Pods are now printed on the standard Err page.
  • Chg: Added some handy toStr methods to Route and response objects.
  • Chg: Pretty printed the Str maps that get logged on Err.


  • New: Added appName to BedSheetMetaData that returns the from the application's pod meta.
  • Chg: Added matchesMethod() and matchesParams() helper methods to RouteResponseFactory.
  • Chg: Made ErrPrinterStr and ErrPrinterHtml public, but @NoDoc, as they're useful for emails et al.
  • Chg: Made HttpRequestHeaders and HttpResponsetHeaders const classes, backed by WebReq and WebRes.
  • Bug: Ensured HttpRequest.modRel always returns a path absolute uri - see Inconsistent WebReq::modRel()
  • Bug: Application could NPE on startup if an AppModule could not be found.


  • New: Added HttpCookies service, removed corresponding cookie methods from HttpRequest and HttpResponse. (Breaking change)
  • New: Added stash() to HttpRequest
  • New: Added fromXhtml(...) to Text
  • New: Added contentLength() and cookie() to HttpRequestHeaders
  • New: MethodCallResponseProcessor uses IoC to call methods so that it may inject any dependencies / services as method arguments.
  • New: Added StackFrameFilter to filter out lines in stack traces.
  • New: Added host to BedSheetConfigIds, mainly for use by 3rd party libraries.
  • Chg: Upgraded to IoC 1.5.2.
  • Chg: Removed BedServer and BedClient, they have been moved to Bounce. (Breaking change)
  • Chg: Removed @Config, use @afIocConfig::Config instead. (Breaking change)
  • Chg: Renamed HttpPipelineFilter -> Middleware and updated the corresponding services. Hardcoded the default BedSheet filters / middleware to the start of the pipeline. (Breaking change)
  • Chg: Renamed HttpRequestLogFilter -> RequestLogMiddleware and updated the @Config values. (Breaking change)
  • Chg: @NoDoced some services as they're only referenced by @Contribute methods: ErrProcessors, HttpStatusProcessors, ResponseProcessor, ValueEncoders.
  • Chg: QualityValues are nullable from HttpRequestHeaders



  • New: Added gzip compression for web fonts.
  • New: BedSheet connection details printed on startup.
  • Chg: FileHandler now lets non-existant files fall through.
  • Chg: FileHandler auto adds Route mappings to the Routes service.
  • Chg: Added more info to the BedSheet 404 page in dev.
  • Chg: Gave more control over the verbose rendering of the standard BedSheet pages.
  • Bug: BedServer generated the wrong info for BedSheetMetaData - required when testing Pillow web apps.


  • New: Route objects may take any response result - not just Methods!
  • New: BedSheet now has a dependency on IoC Env
  • Chg: HttpRequestLogFilter is now in the Http Pipeline by default - it just needs enabling.
  • Chg: The detailed BedSheet Err500 page is disabled in production environments.
  • Chg: Rejigged how the default ErrProcessor is used, making it easier to plug in your own. (Breaking change.)
  • Chg: BedSheetConfigIds renamed from ConfigIds. (Breaking change.)
  • Chg: Removed Route Matching - Routes now only take Route objects. (Breaking change.)
  • Chg: Removed IeAjaxCacheBustingFilter with no replacement. (Breaking change.)
  • Chg: Removed CorsHandler with no replacement. (Breaking change.)
  • Chg: Massaged a lot of the documentation.


  • New: The cause of startup Errs are printed before service shutdown - see this topic.
  • Chg: Better Err msg if AppModule type not found on startup.
  • Chg: Disabled afIoc service list on startup.
  • Bug: BedServer would crash if the app required BedSheetMetaData.


  • New: Added Causes section to Err500 page.
  • Chg: Faster startup times when using a proxy
  • Chg: Better Err handling on app startup
  • Bug: Transitive dependencies have been re-instated.
  • Bug: The -noTransDeps startup option now propogates through the proxy.


  • New: Added BedSheetMetaData with information on which AppModule afbedSheet was started with.
  • Chg: Renamed RouteHandler -> MethodInvoker. (Breaking change.)
  • Chg: Injectable services are now documented with (Service).
  • Chg: Moved internal proxy options in Main to their own class.
  • Chg: Enabled multi-line quotes.
  • Bug: IoC Config was not always added as a transitive dependency. (Thanks to LightDye for reporting.)


  • New: Added Available Values section to Err500 page, from afIoc::NotFoundErr.
  • Chg: Broke @Config code out into its own module: IoC Config.
  • Chg: Added a skull logo to the Err500 page.
  • Chg: Rejigged the Err500 section layout and tweaked the source code styling.


  • New: SrcCodeErrs from afPlastic / efan are printed in the default Err500 pages.
  • New: Added ConfigSource.getCoerced() method.
  • New: Added Template Rendering to fandoc.


  • New: Added IoC Operation Trace section to Err500 page.
  • New: Added Moustache Compilation Err section to Err500 page.
  • Chg: Moved Moustache out into it's own project.
  • Chg: Anyone may now contribute sections to the default verbose Err500 page.
  • Bug: Module name was not always found correctly on startup.


  • Bug: This documentation page didn't render.


  • Chg: Updated to use afIoc-1.4.x
  • Chg: Overhauled Route to match null values. Thanks go to LightDye.
  • Chg: Warnings on startup if an AppModule could not be found - see Issue #1. Thanks go to Jorge Ortiz.
  • Chg: Better Err handling when a dir is not mapped to FileHandler
  • Chg: Transferred VCS ownership to AlienFactory
  • Chg: Test code is no longer distributed with the afBedSheet.pod.


  • Chg: HttpResponse.statusCode is now a field.
  • Chg: HttpResponse.disableGzip is now a field.
  • Chg: HttpResponse.disableBuffering is now a field.


  • New: Added BedServer and BedClient to test BedSheet apps without using a real web server.


  • New: Initial release