110 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Factor
		
	
	
| ! Copyright (C) 2008, 2010 Slava Pestov.
 | |
| ! See http://factorcode.org/license.txt for BSD license.
 | |
| USING: namespaces assocs kernel sequences accessors hashtables
 | |
| urls db.types db.tuples math.parser fry logging combinators
 | |
| html.templates.chloe.syntax
 | |
| http http.server http.server.filters http.server.redirection
 | |
| furnace.cache
 | |
| furnace.sessions
 | |
| furnace.utilities
 | |
| furnace.redirection ;
 | |
| IN: furnace.asides
 | |
| 
 | |
| TUPLE: aside < server-state
 | |
| session method url post-data ;
 | |
| 
 | |
| : <aside> ( id -- aside )
 | |
|     aside new-server-state ;
 | |
| 
 | |
| aside "ASIDES" {
 | |
|     { "session" "SESSION" BIG-INTEGER +not-null+ }
 | |
|     { "method" "METHOD" { VARCHAR 10 } }
 | |
|     { "url" "URL" URL }
 | |
|     { "post-data" "POST_DATA" FACTOR-BLOB }
 | |
| } define-persistent
 | |
| 
 | |
| CONSTANT: aside-id-key "__a"
 | |
| 
 | |
| TUPLE: asides < server-state-manager ;
 | |
| 
 | |
| : <asides> ( responder -- responder' )
 | |
|     asides new-server-state-manager ;
 | |
| 
 | |
| SYMBOL: aside-id
 | |
| 
 | |
| : get-aside ( id -- aside )
 | |
|     dup [ aside get-state ] when check-session ;
 | |
| 
 | |
| : request-aside-id ( request -- id )
 | |
|     aside-id-key swap request-params at string>number ;
 | |
| 
 | |
| : request-aside ( request -- aside )
 | |
|     request-aside-id get-aside ;
 | |
| 
 | |
| : set-aside ( aside -- )
 | |
|     [ id>> aside-id set ] when* ;
 | |
| 
 | |
| : init-asides ( asides -- )
 | |
|     asides set
 | |
|     request get request-aside
 | |
|     set-aside ;
 | |
| 
 | |
| M: asides call-responder*
 | |
|     [ init-asides ] [ call-next-method ] bi ;
 | |
| 
 | |
| : touch-aside ( aside -- )
 | |
|     asides get touch-state ;
 | |
| 
 | |
| : begin-aside ( url -- )
 | |
|     f <aside>
 | |
|         swap >>url
 | |
|         session get id>> >>session
 | |
|         request get method>> >>method
 | |
|         request get post-data>> >>post-data
 | |
|     [ touch-aside ] [ insert-tuple ] [ set-aside ] tri ;
 | |
| 
 | |
| : end-aside-post ( aside -- response )
 | |
|     request [
 | |
|         clone
 | |
|             over post-data>> >>post-data
 | |
|             over url>> >>url
 | |
|     ] change
 | |
|     [ [ post-data>> params>> params set ] [ url>> url set ] bi ]
 | |
|     [ url>> path>> split-path asides get responder>> call-responder ] bi ;
 | |
| 
 | |
| \ end-aside-post DEBUG add-input-logging
 | |
| 
 | |
| ERROR: end-aside-in-get-error ;
 | |
| 
 | |
| : move-on ( id -- response )
 | |
|     post-request? [ end-aside-in-get-error ] unless
 | |
|     dup method>> {
 | |
|         { "GET" [ url>> <redirect> ] }
 | |
|         { "HEAD" [ url>> <redirect> ] }
 | |
|         { "POST" [ end-aside-post ] }
 | |
|     } case ;
 | |
| 
 | |
| : end-aside ( default -- response )
 | |
|     aside-id get aside-id off get-aside [ move-on ] [ <redirect> ] ?if ;
 | |
| 
 | |
| M: asides link-attr ( tag responder -- )
 | |
|     drop
 | |
|     "aside" optional-attr {
 | |
|         { "none" [ aside-id off ] }
 | |
|         { "begin" [ url get begin-aside ] }
 | |
|         { "current" [ ] }
 | |
|         { f [ ] }
 | |
|     } case ;
 | |
| 
 | |
| M: asides modify-query ( query asides -- query' )
 | |
|     drop
 | |
|     aside-id get [
 | |
|         aside-id-key associate assoc-union
 | |
|     ] when* ;
 | |
| 
 | |
| M: asides modify-form ( asides -- xml/f )
 | |
|     drop
 | |
|     aside-id get
 | |
|     aside-id-key
 | |
|     hidden-form-field ;
 |