1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors namespaces sequences arrays kernel
4 assocs assocs.lib hashtables math.parser urls combinators
5 html.elements html.templates.chloe.syntax db.types db.tuples
6 http http.server http.server.filters
7 furnace furnace.cache furnace.sessions furnace.redirection ;
10 TUPLE: aside < server-state session method url post-data ;
12 : <aside> ( id -- aside )
13 aside new-server-state ;
17 { "session" "SESSION" BIG-INTEGER +not-null+ }
18 { "method" "METHOD" { VARCHAR 10 } +not-null+ }
19 { "url" "URL" URL +not-null+ }
20 { "post-data" "POST_DATA" FACTOR-BLOB }
23 TUPLE: asides < server-state-manager ;
25 : <asides> ( responder -- responder' )
26 asides new-server-state-manager ;
28 : begin-aside* ( -- id )
30 session get id>> >>session
34 [ post-data>> >>post-data ]
36 [ asides get touch-state ] [ insert-tuple ] [ id>> ] tri ;
38 : end-aside-post ( aside -- response )
41 over post-data>> >>post-data
44 url>> path>> split-path
45 asides get responder>> call-responder ;
47 ERROR: end-aside-in-get-error ;
49 : get-aside ( id -- aside )
50 dup [ aside get-state ] when
51 dup [ dup session>> session get id>> = [ drop f ] unless ] when ;
53 : end-aside* ( url id -- response )
54 post-request? [ end-aside-in-get-error ] unless
57 { "GET" [ url>> <redirect> ] }
58 { "HEAD" [ url>> <redirect> ] }
59 { "POST" [ end-aside-post ] }
61 ] [ <redirect> ] ?if ;
65 : aside-id-key "__a" ;
68 begin-aside* aside-id set ;
70 : end-aside ( default -- response )
71 aside-id [ f ] change end-aside* ;
73 : request-aside-id ( request -- aside-id )
74 aside-id-key swap request-params at string>number ;
76 M: asides call-responder*
78 request get request-aside-id aside-id set
81 M: asides link-attr ( tag -- )
83 "aside" optional-attr {
84 { "none" [ aside-id off ] }
85 { "begin" [ begin-aside ] }
90 M: asides modify-query ( query responder -- query' )
92 aside-id get [ aside-id-key associate assoc-union ] when* ;
94 M: asides modify-form ( responder -- )
95 drop aside-id get aside-id-key hidden-form-field ;