1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel accessors combinators namespaces fry
4 io.servers.connection urls http http.server
5 http.server.redirection http.server.responses
6 http.server.filters furnace ;
7 IN: furnace.redirection
9 : <redirect> ( url -- response )
10 adjust-url request get method>> {
11 { "GET" [ <temporary-redirect> ] }
12 { "HEAD" [ <temporary-redirect> ] }
13 { "POST" [ <permanent-redirect> ] }
16 : >secure-url ( url -- url' )
21 : <secure-redirect> ( url -- response )
22 >secure-url <redirect> ;
24 TUPLE: redirect-responder to ;
26 : <redirect-responder> ( url -- responder )
27 redirect-responder boa ;
29 M: redirect-responder call-responder* nip to>> <redirect> ;
31 TUPLE: secure-only < filter-responder ;
33 C: <secure-only> secure-only
35 : secure-connection? ( -- ? ) url get protocol>> "https" = ;
37 : if-secure ( quot -- response )
39 { [ secure-connection? ] [ call ] }
40 { [ request get method>> "POST" = ] [ drop <400> ] }
41 [ drop url get <secure-redirect> ]
44 M: secure-only call-responder*
45 '[ _ _ call-next-method ] if-secure ;