57 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Scheme
		
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Scheme
		
	
	
	
| ;; Request-handlers for scheme web server
 | |
| 
 | |
| ;; general request-handler-combinator:
 | |
| ;; predicate: path x request --> boolean
 | |
| ;; if #t, handler is called
 | |
| ;; if #f, default-handler is called
 | |
| (define (make-request-handler predicate handler default-handler)
 | |
|   (lambda (path req)
 | |
|     (if (predicate path req)
 | |
| 	(handler path req)
 | |
| 	(default-handler path req))))
 | |
| 
 | |
| ;; same as make-request-handler except that the predicate is only
 | |
| ;; called with the path:
 | |
| ;; predicate: path --> boolean
 | |
| (define (make-path-handler predicate handler default-handler)
 | |
|   (make-request-handler
 | |
|    (lambda (path req) (predicate path)) handler default-handler))
 | |
| 
 | |
| ;; selects handler according to host-field of http-request
 | |
| (define (make-hostname-handler hostname handler default-handler)
 | |
|     (make-request-handler 
 | |
|      (lambda (path req)
 | |
|        ;; we expect only one host-header-field
 | |
|        (string=? hostname (string-trim (get-header (request:headers req) 'host))))
 | |
|      handler default-handler))
 | |
| 
 | |
| ;; selects handler according to path-prefix
 | |
| ;; if path-prefix matches, handler is called without the path-prefix
 | |
| (define (make-path-prefix-handler path-prefix handler default-handler)
 | |
|   (lambda (path req)
 | |
|     (if (string=? path-prefix (car path))
 | |
| 	(handler (cdr path) req)
 | |
| 	(default-handler path req))))
 | |
| 
 | |
| ;;; (alist-path-dispatcher handler-alist default-handler) -> handler
 | |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | |
| ;;; This function creates a table-driven path-handler that dispatches off
 | |
| ;;; of the car of the request path. The handler uses the car to index into
 | |
| ;;; a path-handler alist. If it finds a hit, it recurses using the table's
 | |
| ;;; path-handler. If no hits, it handles the path with a default handler.
 | |
| ;;; An alist handler is passed the tail of the original path; the
 | |
| ;;; default handler gets the entire original path.
 | |
| ;;;
 | |
| ;;; This procedure is how you say: "If the first element of the URL's
 | |
| ;;; path is 'foo', do X; if it's 'bar', do Y; otherwise, do Z." 
 | |
| 
 | |
| (define (alist-path-dispatcher handler-alist default-handler)
 | |
|   (fold-right 
 | |
|    (lambda (handler-pair default-handler)
 | |
|      (make-path-prefix-handler
 | |
|       (car handler-pair)
 | |
|       (cdr handler-pair)
 | |
|       default-handler))
 | |
|    default-handler
 | |
|    handler-alist))
 |