diff --git a/collects/web-server/scribblings/web.scrbl b/collects/web-server/scribblings/web.scrbl index 8bd0ee3afc..ce10c94e1e 100644 --- a/collects/web-server/scribblings/web.scrbl +++ b/collects/web-server/scribblings/web.scrbl @@ -5,6 +5,7 @@ @(require (for-label web-server/servlet/web web-server/servlet/servlet-structs web-server/http + racket/list net/url)) @defmodule[web-server/servlet/web]{The @@ -141,17 +142,17 @@ functions of interest for the servlet developer. ] } -@defproc[(redirect/get) +@defproc[(redirect/get [#:headers hs (listof header?) empty]) request?]{ - Calls @racket[send/suspend] with @racket[redirect-to]. + Calls @racket[send/suspend] with @racket[redirect-to], passing @racket[hs] as the headers. This implements the Post-Redirect-Get pattern. Use this to prevent the @onscreen["Refresh"] button from duplicating effects, such as adding items to a database. } -@defproc[(redirect/get/forget) +@defproc[(redirect/get/forget [#:headers hs (listof header?) empty]) request?]{ - Calls @racket[send/forward] with @racket[redirect-to]. + 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)]{ diff --git a/collects/web-server/servlet/web.rkt b/collects/web-server/servlet/web.rkt index be48218cc1..355929d159 100644 --- a/collects/web-server/servlet/web.rkt +++ b/collects/web-server/servlet/web.rkt @@ -36,8 +36,8 @@ (provide/contract [current-servlet-continuation-expiration-handler (parameter/c expiration-handler/c)] - [redirect/get (-> request?)] - [redirect/get/forget (-> request?)] + [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?)] @@ -139,14 +139,13 @@ ;; ************************************************************ ;; HIGHER-LEVEL EXPORTS -(define ((make-redirect/get send/suspend)) - (send/suspend (lambda (k-url) (redirect-to k-url temporarily)))) +(define ((make-redirect/get send/suspend) #:headers [hs empty]) + (send/suspend (lambda (k-url) (redirect-to k-url temporarily #:headers hs)))) ; redirect/get : -> request (define redirect/get (make-redirect/get send/suspend)) (define redirect/get/forget (make-redirect/get send/forward)) - (define (with-errors-to-browser send/finish-or-back thunk) (with-handlers ([exn:fail? (lambda (exn) (send/finish-or-back