In Racket 5.0.2 and before, the Web Server supported implicit conversion of X-expressions and lists with the format (cons/c bytes? (listof (or/c string? bytes?))) into response data structures for output. After 5.0.2, this implicit conversion has been generalized into any->response. In the process, implicit conversion has been completely removed from some internal plumbing AND the response structures have been streamlined---primarily for efficiency. This document describes the incompatible changes and how to restore the old behavior when that is possible. --- Coercion behavior --- The old coercion behavior will be dynamically introduced by requiring web-server/compat/0/coerce or running: (require web-server/compat/0/http/response-structs) (set-any->response! normalize-response) Users may want to allow implicit X-expression conversion by running (set-any->response! response/xexpr) --- New response structures --- The http/response-structs module has changed to be almost unrecognizable. http/response-structs was provided through http and servlet, so many Web applications implicitly rely on it. web-server/compat/0/http/response-structs provides a version that implements the old behavior without interfering with new version (i.e., they can both be required simultaneously.) [N.B. response/port was only present for a few weeks, so it is not provided in the compatibility library.] --- xexpr-response/cookies --- The http/cookie module provided xexpr-response/cookies, but that functionality is now part of response/xexpr. The old function can be required from web-server/compat/0/http/cookie (without interfering with any other bindings from the new cookie module.) --- Internal APIs --- Many internal APIs are restricted to receive only actual response? structures: configuration-table responders authentication responder on dispatchers/dispatch-passwords dispatchers/dispatch-lift --- make dispatchers/dispatch-pathprocedure --- make http/response --- output-response and output-response/method No compatible interface is provided for these functions and data structures. --- External APIs --- Most external APIs now use the new response/c. Specifically: dispatch/serve --- serve/dispatch servlet-dispatch --- dispatch/servlet servlet-env --- serve/servlet servlet/web --- send/*, with-errors-to-browser dispatchers/dispatch-servlets --- servlet-loading responder argument #lang web-server/insta lang/web --- make-stateless-servlet private/servlet --- handler field servlet/servlet-structs --- response-generator/c, expiration-handler/c servlet/setup --- make*servlet These represent nearly every place where servlets typically interact with the server. However, one function: send/formlet from formlets used to allow any old response/c as a wrapper result, while the new version requires that the wrapper returns an Xexpr. This changes is justified in that formlets already bake in support for Xexpr as a fundamental part of their syntax. --- Removed contracts --- web-server/compat/0/servlet/servlet-structs is a replacement for the old web-server/servlet/servlet-structs because k-url? response-generator/c expiration-handler/c are now removed. (This change is to ensure that internal uses of these have can-be-response? close to where they are used so any->response can be called appropriately.)