1 ! Copyright (C) 2008, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: namespaces assocs kernel sequences accessors hashtables
4 urls db.types db.tuples math.parser fry logging combinators
5 html.templates.chloe.syntax
6 http http.server http.server.filters http.server.redirection
13 TUPLE: aside < server-state
14 session method url post-data ;
16 : <aside> ( id -- aside )
17 aside new-server-state ;
20 { "session" "SESSION" BIG-INTEGER +not-null+ }
21 { "method" "METHOD" { VARCHAR 10 } }
23 { "post-data" "POST_DATA" FACTOR-BLOB }
26 CONSTANT: aside-id-key "__a"
28 TUPLE: asides < server-state-manager ;
30 : <asides> ( responder -- responder' )
31 asides new-server-state-manager ;
35 : get-aside ( id -- aside )
36 dup [ aside get-state ] when check-session ;
38 : request-aside-id ( request -- id )
39 aside-id-key swap request-params at string>number ;
41 : request-aside ( request -- aside )
42 request-aside-id get-aside ;
44 : set-aside ( aside -- )
45 [ id>> aside-id set ] when* ;
47 : init-asides ( asides -- )
49 request get request-aside-id
53 M: asides call-responder*
54 [ init-asides ] [ call-next-method ] bi ;
56 : touch-aside ( aside -- )
57 asides get touch-state ;
59 : begin-aside ( url -- )
62 session get id>> >>session
63 request get method>> >>method
64 request get post-data>> >>post-data
65 [ touch-aside ] [ insert-tuple ] [ set-aside ] tri ;
67 : end-aside-post ( aside -- response )
70 over post-data>> >>post-data
73 [ [ post-data>> params>> params set ] [ url>> url set ] bi ]
74 [ url>> path>> split-path asides get responder>> call-responder ] bi ;
76 \ end-aside-post DEBUG add-input-logging
78 ERROR: end-aside-in-get-error ;
80 : move-on ( id -- response )
81 post-request? [ end-aside-in-get-error ] unless
83 { "GET" [ url>> <redirect> ] }
84 { "HEAD" [ url>> <redirect> ] }
85 { "POST" [ end-aside-post ] }
88 : end-aside ( default -- response )
89 aside-id get aside-id off get-aside [ move-on ] [ <redirect> ] ?if ;
91 M: asides link-attr ( tag -- )
93 "aside" optional-attr {
94 { "none" [ aside-id off ] }
95 { "begin" [ url get begin-aside ] }
100 M: asides modify-query ( query asides -- query' )
103 aside-id-key associate assoc-union
106 M: asides modify-form ( asides -- )