diff --git a/collects/web-server/compat/0/README b/collects/web-server/compat/0/README index 7e3b4ad3a4..9f25e638d7 100644 --- a/collects/web-server/compat/0/README +++ b/collects/web-server/compat/0/README @@ -1,14 +1,9 @@ In Racket 5.0.99.4 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. +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.99.4, this implicit conversion has been generalized into -current-response/c and response/c. In the process, implicit conversion -has been completely removed from some internal plumbing AND the -response structures have been streamlined---primarily for efficiency. +After 5.0.99.4, this implicit conversion has been generalized into current-response/c and response/c. 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. +This document describes the incompatible changes and how to restore the old behavior when that is possible. --- Coercion behavior --- @@ -75,3 +70,10 @@ 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 --- + +k-url? +response-generator/c +expiration-handler/c diff --git a/collects/web-server/compat/0/servlet/servlet-structs.rkt b/collects/web-server/compat/0/servlet/servlet-structs.rkt new file mode 100644 index 0000000000..98327a3a88 --- /dev/null +++ b/collects/web-server/compat/0/servlet/servlet-structs.rkt @@ -0,0 +1,30 @@ +#lang racket/base +(require racket/contract + unstable/contract + web-server/http) + +(define current-response/c + (make-parameter any/c)) +(define response/c + (dynamic/c any/c current-response/c response?)) + +(define k-url? + string?) + +(define response-generator/c + (k-url? . -> . response/c)) + +(define expiration-handler/c + (or/c false/c + (request? . -> . response/c))) + +(define embed/url/c + ((request? . -> . any) . -> . string?)) + +(provide/contract + [current-response/c (parameter/c contract?)] + [response/c contract?] + [response-generator/c contract?] + [k-url? contract?] + [expiration-handler/c contract?] + [embed/url/c contract?]) diff --git a/collects/web-server/formlets/servlet.rkt b/collects/web-server/formlets/servlet.rkt index a90c145ebf..a4ac196bab 100644 --- a/collects/web-server/formlets/servlet.rkt +++ b/collects/web-server/formlets/servlet.rkt @@ -24,7 +24,7 @@ ,@(formlet-display f)))))))) (provide/contract - [embed-formlet (embed/url/c formlet*/c . -> . pretty-xexpr/c)]) + [embed-formlet (((request? . -> . any) . -> . string?) formlet*/c . -> . pretty-xexpr/c)]) (define (embed-formlet embed/url f) `(form ([action ,(embed/url diff --git a/collects/web-server/lang/web.rkt b/collects/web-server/lang/web.rkt index 88b967b260..b63528ff21 100644 --- a/collects/web-server/lang/web.rkt +++ b/collects/web-server/lang/web.rkt @@ -36,6 +36,9 @@ [initialize-servlet ((request? . -> . response/c) . -> . (request? . -> . response/c))] ;; Servlet Interface + [send/suspend ((string? . -> . response/c) . -> . request?)] + [send/suspend/dispatch ((((request? . -> . any/c) . -> . string?) . -> . response/c) + . -> . any/c)] [send/suspend/hidden ((url? list? . -> . response/c) . -> . request?)] [send/suspend/url ((url? . -> . response/c) . -> . request?)] [send/suspend/url/dispatch ((((request? . -> . any/c) . -> . url?) . -> . response/c) diff --git a/collects/web-server/managers/lru.rkt b/collects/web-server/managers/lru.rkt index 3ba71d23be..b6f90e24a2 100644 --- a/collects/web-server/managers/lru.rkt +++ b/collects/web-server/managers/lru.rkt @@ -4,11 +4,20 @@ (require "manager.rkt" web-server/servlet/servlet-structs) (provide/contract - [create-LRU-manager (expiration-handler/c number? number? (-> boolean?) - #:initial-count number? - #:inform-p (number? . -> . void) - . -> . manager?)] - [make-threshold-LRU-manager (expiration-handler/c number? . -> . manager?)]) + [create-LRU-manager + (-> + (or/c false/c + (request? . -> . response/c)) + number? number? (-> boolean?) + #:initial-count number? + #:inform-p (number? . -> . void) + manager?)] + [make-threshold-LRU-manager + (-> + (or/c false/c + (request? . -> . response/c)) + number? + manager?)]) ;; Utility (define (make-counter) diff --git a/collects/web-server/managers/manager.rkt b/collects/web-server/managers/manager.rkt index 1e860844d6..fe32edfb49 100644 --- a/collects/web-server/managers/manager.rkt +++ b/collects/web-server/managers/manager.rkt @@ -16,14 +16,23 @@ [struct manager ([create-instance ((-> void) . -> . number?)] [adjust-timeout! (number? number? . -> . void)] [clear-continuations! (number? . -> . void)] - [continuation-store! (number? any/c expiration-handler/c . -> . (list/c number? number?))] + [continuation-store! + (-> + number? any/c + (or/c false/c + (request? . -> . response/c)) + (list/c number? number?))] [continuation-lookup (number? number? number? . -> . any/c)] [continuation-peek (number? number? number? . -> . any/c)])] [struct (exn:fail:servlet-manager:no-instance exn:fail) ([message string?] [continuation-marks continuation-mark-set?] - [expiration-handler expiration-handler/c])] + [expiration-handler + (or/c false/c + (request? . -> . response/c))])] [struct (exn:fail:servlet-manager:no-continuation exn:fail) ([message string?] [continuation-marks continuation-mark-set?] - [expiration-handler expiration-handler/c])]) + [expiration-handler + (or/c false/c + (request? . -> . response/c))])]) diff --git a/collects/web-server/managers/none.rkt b/collects/web-server/managers/none.rkt index b4ed6bb26d..0651651e49 100644 --- a/collects/web-server/managers/none.rkt +++ b/collects/web-server/managers/none.rkt @@ -3,7 +3,11 @@ (require "manager.rkt") (require web-server/servlet/servlet-structs) (provide/contract - [create-none-manager (expiration-handler/c . -> . manager?)]) + [create-none-manager + (-> + (or/c false/c + (request? . -> . response/c)) + manager?)]) (define-struct (none-manager manager) (instance-expiration-handler)) (define (create-none-manager diff --git a/collects/web-server/managers/timeouts.rkt b/collects/web-server/managers/timeouts.rkt index f06fb38ea7..3a13f8a07b 100644 --- a/collects/web-server/managers/timeouts.rkt +++ b/collects/web-server/managers/timeouts.rkt @@ -5,7 +5,12 @@ (require web-server/private/timer web-server/servlet/servlet-structs) (provide/contract - [create-timeout-manager (expiration-handler/c number? number? . -> . manager?)]) + [create-timeout-manager + (-> + (or/c false/c + (request? . -> . response/c)) + number? number? + manager?)]) ;; Utility (define (make-counter) diff --git a/collects/web-server/scribblings/contracts.scrbl b/collects/web-server/scribblings/contracts.scrbl index a1ee371398..9a1b4bff11 100644 --- a/collects/web-server/scribblings/contracts.scrbl +++ b/collects/web-server/scribblings/contracts.scrbl @@ -22,39 +22,4 @@ This allows Web applications to customize the Web Server's handling of responses always receives @racket[response?] structures. } -@defthing[k-url? contract?]{ -Equivalent to @racket[string?]. - -Example: @racket["http://localhost:8080/servlets;1*1*20131636/examples/add.rkt"]} - -@defthing[response-generator/c contract?]{ -Equivalent to @racket[(k-url? . -> . response/c)]. - -Example: @racketblock[(lambda (k-url) - (response/xexpr - `(html - (body - (a ([href ,k-url]) - "Click Me to Invoke the Continuation!")))))] -} - -@defthing[expiration-handler/c contract?]{ -Equivalent to @racket[(or/c false/c (request? . -> . response/c))]. - -Typically @racket[#f] uses the default expiration handler, which displays an error message. - -Example: @racketblock[(lambda (req) - (response/xexpr - `(html (head (title "Expired")) - (body (h1 "Expired") - (p "This URL has expired. " - "Please return to the home page.")))))] -} - -@defthing[embed/url/c contract?]{ -Equivalent to @racket[((request? . -> . any) . -> . string?)]. - -This is what @racket[send/suspend/dispatch] gives to its function argument. -} - } diff --git a/collects/web-server/scribblings/formlets.scrbl b/collects/web-server/scribblings/formlets.scrbl index 11c8c94898..a49845a716 100755 --- a/collects/web-server/scribblings/formlets.scrbl +++ b/collects/web-server/scribblings/formlets.scrbl @@ -450,7 +450,7 @@ A few utilities are provided for using @tech{formlet}s in Web applications. processing stage of @racket[f]. } -@defproc[(embed-formlet [embed/url embed/url/c] +@defproc[(embed-formlet [embed/url ((request? . -> . any) . -> . string?)] [f (formlet/c any/c ...)]) xexpr/c]{ Like @racket[send/formlet], but for use with @racket[send/suspend/dispatch]. diff --git a/collects/web-server/scribblings/managers.scrbl b/collects/web-server/scribblings/managers.scrbl index 1fd362e029..771af9f766 100644 --- a/collects/web-server/scribblings/managers.scrbl +++ b/collects/web-server/scribblings/managers.scrbl @@ -23,7 +23,10 @@ the users and implementers of managers. @defstruct[manager ([create-instance ((-> void) . -> . number?)] [adjust-timeout! (number? number? . -> . void)] [clear-continuations! (number? . -> . void)] - [continuation-store! (number? any/c expiration-handler/c . -> . (list/c number? number?))] + [continuation-store! (number? any/c + (or/c false/c + (request? . -> . response/c)) + . -> . (list/c number? number?))] [continuation-lookup (number? number? number? . -> . any/c)] [continuation-peek (number? number? number? . -> . any/c)])]{ @racket[create-instance] is called to initialize a instance, to hold the @@ -51,13 +54,17 @@ the users and implementers of managers. } @defstruct[(exn:fail:servlet-manager:no-instance exn:fail) - ([expiration-handler expiration-handler/c])]{ + ([expiration-handler + (or/c false/c + (request? . -> . response/c))])]{ This exception should be thrown by a manager when an instance is looked up that does not exist. } @defstruct[(exn:fail:servlet-manager:no-continuation exn:fail) - ([expiration-handler expiration-handler/c])]{ + ([expiration-handler + (or/c false/c + (request? . -> . response/c))])]{ This exception should be thrown by a manager when a continuation is looked up that does not exist. } @@ -72,7 +79,10 @@ the users and implementers of managers. This module defines a manager constructor: -@defproc[(create-none-manager (instance-expiration-handler expiration-handler/c)) +@defproc[(create-none-manager + (instance-expiration-handler + (or/c false/c + (request? . -> . response/c)))) manager?]{ This manager does not actually store any continuation or instance data. You could use it if you know your servlet does not use the continuation @@ -97,9 +107,12 @@ Web Language. (See @secref["stateless"].) This module defines a manager constructor: -@defproc[(create-timeout-manager [instance-exp-handler expiration-handler/c] - [instance-timeout number?] - [continuation-timeout number?]) +@defproc[(create-timeout-manager + [instance-exp-handler + (or/c false/c + (request? . -> . response/c))] + [instance-timeout number?] + [continuation-timeout number?]) manager?]{ Instances managed by this manager will be expired @racket[instance-timeout] seconds after the last time it is accessed. If an expired instance is @@ -130,7 +143,9 @@ deployments of the @web-server . This module defines a manager constructor: @defproc[(create-LRU-manager - [instance-expiration-handler expiration-handler/c] + [instance-expiration-handler + (or/c false/c + (request? . -> . response/c))] [check-interval integer?] [collect-interval integer?] [collect? (-> boolean?)] @@ -163,7 +178,9 @@ This module defines a manager constructor: The recommended usage of this manager is codified as the following function: @defproc[(make-threshold-LRU-manager - [instance-expiration-handler expiration-handler/c] + [instance-expiration-handler + (or/c false/c + (request? . -> . response/c))] [memory-threshold number?]) manager?]{ This creates an LRU manager with the following behavior: diff --git a/collects/web-server/scribblings/web.scrbl b/collects/web-server/scribblings/web.scrbl index 46e8f16f3f..7b460ab495 100644 --- a/collects/web-server/scribblings/web.scrbl +++ b/collects/web-server/scribblings/web.scrbl @@ -160,8 +160,10 @@ functions of interest for the servlet developer. Calls @racket[send/forward] with @racket[redirect-to], passing @racket[hs] as the headers. } -@defthing[current-servlet-continuation-expiration-handler (parameter/c expiration-handler/c)]{ - Holds the @racket[expiration-handler/c] to be used when a continuation +@defthing[current-servlet-continuation-expiration-handler + (parameter/c (or/c false/c + (request? . -> . response/c)))]{ + Holds the expiration handler to be used when a continuation captured in this context is expired, then looked up. Example: diff --git a/collects/web-server/servlet/servlet-structs.rkt b/collects/web-server/servlet/servlet-structs.rkt index 98327a3a88..304ca64de0 100644 --- a/collects/web-server/servlet/servlet-structs.rkt +++ b/collects/web-server/servlet/servlet-structs.rkt @@ -8,23 +8,6 @@ (define response/c (dynamic/c any/c current-response/c response?)) -(define k-url? - string?) - -(define response-generator/c - (k-url? . -> . response/c)) - -(define expiration-handler/c - (or/c false/c - (request? . -> . response/c))) - -(define embed/url/c - ((request? . -> . any) . -> . string?)) - (provide/contract [current-response/c (parameter/c contract?)] - [response/c contract?] - [response-generator/c contract?] - [k-url? contract?] - [expiration-handler/c contract?] - [embed/url/c contract?]) + [response/c contract?]) diff --git a/collects/web-server/servlet/web.rkt b/collects/web-server/servlet/web.rkt index da1744e5e1..cd2e0fa8c9 100644 --- a/collects/web-server/servlet/web.rkt +++ b/collects/web-server/servlet/web.rkt @@ -36,16 +36,19 @@ ;; ******************************************************************************** (provide/contract - [current-servlet-continuation-expiration-handler (parameter/c expiration-handler/c)] + [current-servlet-continuation-expiration-handler + (parameter/c + (or/c false/c + (request? . -> . response/c)))] [redirect/get (() (#:headers (listof header?)) . ->* . request?)] [redirect/get/forget (() (#:headers (listof header?)) . ->* . request?)] [adjust-timeout! (number? . -> . void?)] [clear-continuation-table! (-> void?)] [send/back (response/c . -> . void?)] [send/finish (response/c . -> . void?)] - [send/forward (response-generator/c . -> . request?)] - [send/suspend (response-generator/c . -> . request?)] - [send/suspend/dispatch ((embed/url/c . -> . response/c) . -> . any/c)] + [send/forward ((string? . -> . response/c) . -> . request?)] + [send/suspend ((string? . -> . response/c) . -> . request?)] + [send/suspend/dispatch ((((request? . -> . any) . -> . string?) . -> . response/c) . -> . any/c)] [send/suspend/url ((url? . -> . response/c) . -> . request?)] [send/suspend/url/dispatch ((((request? . -> . any/c) . -> . url?) . -> . response/c) . -> . any/c)])