Changeset 18609 in project


Ignore:
Timestamp:
06/23/10 21:56:58 (11 years ago)
Author:
Mario Domenech Goulart
Message:

awful: support for HTTP redirection via `redirect-to'.

Location:
release/4/awful/trunk
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • release/4/awful/trunk/awful.scm

    r18585 r18609  
    1818   ajax ajax-link periodical-ajax login-form define-login-trampoline
    1919   enable-web-repl enable-session-inspector awful-version load-apps
    20    link form
     20   link form redirect-to
    2121
    2222   ;; Required by the awful server
     
    7878(define session-cookie-name (make-parameter "awful-cookie"))
    7979
    80 ;; Parameters for internal use
     80;; Parameters for internal use (but exported, since they are internally used by other eggs)
    8181(define http-request-variables (make-parameter #f))
    8282(define db-connection (make-parameter #f))
     
    8484(define sid (make-parameter #f))
    8585(define db-enabled? (make-parameter #f))
     86
     87;; Parameters for internal use and not exported
     88(define %redirect (make-parameter #f))
    8689
    8790;; db-support parameters (set by awful-<db> eggs)
     
    115118      (or (read-cookie (session-cookie-name)) ($ 'sid))
    116119      ($ 'sid)))
     120
     121(define (redirect-to new-uri)
     122  ;; Just set the `%redirect' internal parameter, so `run-resource' is
     123  ;; able to know where to redirect.
     124  (%redirect new-uri))
     125
    117126
    118127;;; Javascript
     
    247256(define (run-resource proc path)
    248257  (let ((out (->string (proc path))))
    249     (with-headers `((content-type text/html)
    250                     (content-length ,(string-length out)))
    251                   (lambda ()
    252                     (write-logged-response)
    253                     (unless (eq? 'HEAD (request-method (current-request)))
    254                       (display out (response-port (current-response))))))))
     258    (if (%redirect) ;; redirection
     259        (with-headers `((location ,(%redirect)))
     260                      (lambda ()
     261                        (%redirect #f)
     262                        (send-status 302 "Found")))
     263        (with-headers `((content-type text/html)
     264                        (content-length ,(string-length out)))
     265                      (lambda ()
     266                        (write-logged-response)
     267                        (unless (eq? 'HEAD (request-method (current-request)))
     268                          (display out (response-port (current-response)))))))))
    255269
    256270(define (resource-ref path vhost-root-path #!optional check-existence)
     
    338352                                    (contents given-path)
    339353                                    (contents)))))
    340                           (if no-template
    341                               contents
    342                               ((page-template)
    343                                contents
    344                                css: (or css (page-css))
    345                                title: title
    346                                doctype: (or doctype (page-doctype))
    347                                headers: (++ (if (or no-ajax (not (ajax-library)) (not (enable-ajax)))
    348                                                 ""
    349                                                 (<script> type: "text/javascript"
    350                                                           src: (ajax-library)))
    351                                             (or headers "")
    352                                             (if (or no-ajax
    353                                                     (not (enable-ajax))
    354                                                     (not (ajax-library)))
    355                                                 (if (string-null? (page-javascript))
     354                          (if (%redirect)
     355                              #f ;; no need to do anything.  Let run-resource perform the redirection
     356                              (if no-template
     357                                  contents
     358                                  ((page-template)
     359                                   contents
     360                                   css: (or css (page-css))
     361                                   title: title
     362                                   doctype: (or doctype (page-doctype))
     363                                   headers: (++ (if (or no-ajax (not (ajax-library)) (not (enable-ajax)))
    356364                                                    ""
    357365                                                    (<script> type: "text/javascript"
     366                                                              src: (ajax-library)))
     367                                                (or headers "")
     368                                                (if (or no-ajax
     369                                                        (not (enable-ajax))
     370                                                        (not (ajax-library)))
     371                                                    (if (string-null? (page-javascript))
     372                                                        ""
     373                                                        (<script> type: "text/javascript"
     374                                                                  (maybe-compress-javascript
     375                                                                   (page-javascript)
     376                                                                   no-javascript-compression)))
     377                                                    (<script> type: "text/javascript"
    358378                                                              (maybe-compress-javascript
    359                                                                (page-javascript)
    360                                                                no-javascript-compression)))
    361                                                 (<script> type: "text/javascript"
    362                                                           (maybe-compress-javascript
    363                                                            (++ "$(document).ready(function(){"
    364                                                                (page-javascript) "});")
    365                                                            no-javascript-compression))))
    366                                charset: (or charset (page-charset))))))
     379                                                               (++ "$(document).ready(function(){"
     380                                                                   (page-javascript) "});")
     381                                                               no-javascript-compression))))
     382                               charset: (or charset (page-charset)))))))
    367383                      ((page-template) ((page-access-denied-message) path)))
    368384                  ((page-template)
  • release/4/awful/trunk/awful.wiki

    r18608 r18609  
    10101010The {{event}} keyword parameter syntax is the same for {{ajax}}'s {{event}} mandatory parameter.
    10111011
     1012
     1013==== Redirection
     1014
     1015<procedure>(redirect-to uri)</procedure>
     1016
     1017Perform an HTTP redirection (code 302) to the given {{uri}}.  To be used from {{define-page}} contents.  Example:
     1018
     1019<enscript highlight=scheme>
     1020(use awful)
     1021
     1022;; / -> /foo
     1023(define-page "/"
     1024  (lambda ()
     1025    (redirect-to "/foo")))
     1026
     1027(define-page "/foo"
     1028  (lambda ()
     1029    "foo"))
     1030</enscript>
     1031
     1032The example above shows a redirection from {{/}} to {{/foo}}.  Redirections can also be performed when the origin path is a regular expression:
     1033
     1034<enscript highlight=scheme>
     1035(use awful)
     1036
     1037;; /bar.* -> /foo
     1038(define-page (regexp "/bar.*")
     1039  (lambda (_)
     1040    (redirect-to "/foo")))
     1041
     1042(define-page "/foo"
     1043  (lambda ()
     1044    "foo"))
     1045</enscript>
    10121046
    10131047
     
    12561290; 0.24:
    12571291* initial support for storing session identifiers in cookies.  Added the {{enable-cookies}} and {{session-cookie-name}} parameters.  By default, cookies-sessions are enabled by default (relevant only when using sessions, of course). '''Warning''': if your code relies on the availability of session identifiers in the query string or in the request body for whatever reason, it will break.
     1292* support for HTTP redirection via {{redirect-to}}.
    12581293
    12591294; 0.23:
  • release/4/awful/trunk/tests/client.scm

    r18476 r18609  
    4848(delete-file* "a")
    4949
     50;; Redirections
     51(test "bar" (get "/foo"))
     52(test "D" (get "/ra"))
     53
    5054(test-end "awful")
  • release/4/awful/trunk/tests/server.scm

    r18476 r18609  
    66
    77(define-page "a" (lambda () "a"))
     8
     9;; Redirections
     10(define-page "/foo"
     11  (lambda ()
     12    (redirect-to "/bar")))
     13
     14(define-page "/bar"
     15  (lambda ()
     16    "bar"))
     17
     18(define-page "/ra" (cut redirect-to "/rb"))
     19(define-page "/rb" (cut redirect-to "/rc"))
     20(define-page "/rc" (cut redirect-to "/rd"))
     21(define-page "/rd" (lambda () "D"))
Note: See TracChangeset for help on using the changeset viewer.