Cleaning up dispatch-servlets
svn: r12349
This commit is contained in:
parent
8a91afa69d
commit
411f6321fe
|
@ -21,8 +21,8 @@
|
|||
[make
|
||||
(->* (#:url->path url->path/c)
|
||||
(#:make-servlet-namespace make-servlet-namespace/c
|
||||
#:responders-servlet-loading (url? any/c . -> . response?)
|
||||
#:responders-servlet (url? any/c . -> . response?))
|
||||
#:responders-servlet-loading (url? any/c . -> . response?)
|
||||
#:responders-servlet (url? any/c . -> . response?))
|
||||
dispatcher/c)])
|
||||
|
||||
(define interface-version 'v1)
|
||||
|
@ -30,9 +30,7 @@
|
|||
#:make-servlet-namespace [make-servlet-namespace (make-make-servlet-namespace)]
|
||||
#:responders-servlet-loading [responders-servlet-loading servlet-loading-responder]
|
||||
#:responders-servlet [responders-servlet servlet-error-responder])
|
||||
|
||||
;; dispatch : connection request -> void
|
||||
(define (dispatch conn req)
|
||||
(lambda (conn req)
|
||||
(define uri (request-uri req))
|
||||
(with-handlers ([void (lambda (exn) (next-dispatcher))])
|
||||
(define-values (a-path url-servlet-path) (url->path uri))
|
||||
|
@ -50,7 +48,7 @@
|
|||
=> (lambda (ses) ses)]
|
||||
[else
|
||||
(let ()
|
||||
(define cust (make-custodian (current-server-custodian)))
|
||||
(define cust (make-servlet-custodian))
|
||||
(define ns (make-servlet-namespace
|
||||
#:additional-specs
|
||||
'(web-server/lang/web-cells
|
||||
|
@ -77,6 +75,4 @@
|
|||
conn
|
||||
(responders-servlet uri the-exn)
|
||||
(request-method req)))])
|
||||
(output-response conn ((session-servlet ses) req)))))))
|
||||
|
||||
dispatch)
|
||||
(output-response conn ((session-servlet ses) req))))))))
|
|
@ -145,69 +145,18 @@
|
|||
(define (make url->servlet
|
||||
#:responders-servlet-loading [responders-servlet-loading servlet-loading-responder]
|
||||
#:responders-servlet [responders-servlet servlet-error-responder])
|
||||
|
||||
;; servlet-content-producer: connection request -> void
|
||||
(define (servlet-content-producer conn req)
|
||||
(define meth (request-method req))
|
||||
(lambda (conn req)
|
||||
(define uri (request-uri req))
|
||||
(cond
|
||||
[(continuation-url? uri)
|
||||
=> (match-lambda
|
||||
[(list instance-id k-id salt)
|
||||
(invoke-servlet-continuation conn req instance-id k-id salt)])]
|
||||
[else
|
||||
(servlet-content-producer/path conn req uri)]))
|
||||
|
||||
;; servlet-content-producer/path: connection request url -> void
|
||||
(define (servlet-content-producer/path conn req uri)
|
||||
(define response
|
||||
(with-handlers ([exn:fail:filesystem:exists?
|
||||
(lambda (the-exn) (next-dispatcher))]
|
||||
[(lambda (x) #t)
|
||||
(lambda (the-exn) (responders-servlet-loading uri the-exn))])
|
||||
(call-with-continuation-prompt
|
||||
(lambda ()
|
||||
(define instance-custodian (make-servlet-custodian))
|
||||
(parameterize ([current-custodian instance-custodian]
|
||||
[exit-handler
|
||||
(lambda _
|
||||
(kill-connection! conn)
|
||||
(custodian-shutdown-all instance-custodian))])
|
||||
;; any resources (e.g. threads) created when the
|
||||
;; servlet is loaded should be within the dynamic
|
||||
;; extent of the servlet custodian
|
||||
(define the-servlet (url->servlet uri))
|
||||
(parameterize ([current-servlet the-servlet]
|
||||
[current-directory (servlet-directory the-servlet)]
|
||||
[current-namespace (servlet-namespace the-servlet)])
|
||||
(define manager (servlet-manager the-servlet))
|
||||
(parameterize ([current-execution-context (make-execution-context req)])
|
||||
(define instance-id ((manager-create-instance manager) (exit-handler)))
|
||||
(parameterize ([current-servlet-instance-id instance-id])
|
||||
(with-handlers ([(lambda (x) #t)
|
||||
(lambda (exn)
|
||||
(responders-servlet
|
||||
(request-uri req)
|
||||
exn))])
|
||||
((servlet-handler the-servlet) req)))))))
|
||||
servlet-prompt)))
|
||||
(output-response conn response))
|
||||
|
||||
(define (invoke-servlet-continuation conn req instance-id k-id salt)
|
||||
(define uri (request-uri req))
|
||||
(define the-servlet (url->servlet uri))
|
||||
(define manager (servlet-manager the-servlet))
|
||||
(define response
|
||||
(parameterize ([current-servlet the-servlet]
|
||||
[current-directory (servlet-directory the-servlet)]
|
||||
[current-servlet-instance-id instance-id]
|
||||
[current-custodian (servlet-custodian the-servlet)]
|
||||
[current-namespace (servlet-namespace the-servlet)]
|
||||
[exit-handler
|
||||
(lambda _
|
||||
(kill-connection! conn)
|
||||
(custodian-shutdown-all (servlet-custodian the-servlet)))])
|
||||
(with-handlers ([exn:fail:servlet-manager:no-instance?
|
||||
(define instance-custodian (make-servlet-custodian))
|
||||
(parameterize ([current-custodian instance-custodian]
|
||||
[exit-handler
|
||||
(lambda _
|
||||
(kill-connection! conn)
|
||||
(custodian-shutdown-all instance-custodian))])
|
||||
(define response
|
||||
(with-handlers ([exn:fail:filesystem:exists?
|
||||
(lambda (the-exn) (next-dispatcher))]
|
||||
[exn:fail:servlet-manager:no-instance?
|
||||
(lambda (the-exn)
|
||||
((exn:fail:servlet-manager:no-instance-expiration-handler the-exn) req))]
|
||||
[exn:fail:servlet-manager:no-continuation?
|
||||
|
@ -215,13 +164,37 @@
|
|||
((exn:fail:servlet-manager:no-continuation-expiration-handler the-exn) req))]
|
||||
[exn:fail:servlet:instance?
|
||||
(lambda (the-exn)
|
||||
(default-servlet-instance-expiration-handler req))])
|
||||
(parameterize ([current-execution-context (make-execution-context req)])
|
||||
(call-with-continuation-prompt
|
||||
(lambda ()
|
||||
(define kcb ((manager-continuation-lookup manager) instance-id k-id salt))
|
||||
((custodian-box-value kcb) req))
|
||||
servlet-prompt)))))
|
||||
(output-response conn response))
|
||||
|
||||
servlet-content-producer)
|
||||
(default-servlet-instance-expiration-handler req))]
|
||||
[(lambda (x) #t)
|
||||
(lambda (the-exn) (responders-servlet-loading uri the-exn))])
|
||||
(define the-servlet (url->servlet uri))
|
||||
(parameterize ([current-servlet the-servlet]
|
||||
[current-custodian (servlet-custodian the-servlet)]
|
||||
[current-directory (servlet-directory the-servlet)]
|
||||
[current-namespace (servlet-namespace the-servlet)])
|
||||
(define manager (servlet-manager the-servlet))
|
||||
(parameterize ([current-execution-context (make-execution-context req)])
|
||||
|
||||
(define-values (instance-id handler)
|
||||
(cond
|
||||
[(continuation-url? uri)
|
||||
=> (match-lambda
|
||||
[(list instance-id k-id salt)
|
||||
(values instance-id
|
||||
(custodian-box-value ((manager-continuation-lookup manager) instance-id k-id salt)))])]
|
||||
[else
|
||||
(values ((manager-create-instance manager) (exit-handler))
|
||||
(servlet-handler the-servlet))]))
|
||||
|
||||
(parameterize ([current-servlet-instance-id instance-id])
|
||||
(with-handlers ([(lambda (x) #t)
|
||||
(lambda (exn)
|
||||
(responders-servlet
|
||||
(request-uri req)
|
||||
exn))])
|
||||
(call-with-continuation-prompt
|
||||
(lambda ()
|
||||
(handler req))
|
||||
servlet-prompt)))))))
|
||||
|
||||
(output-response conn response))))
|
Loading…
Reference in New Issue
Block a user