[racket] I did not expect this code to work but it did. So now I am a bit puzzled by how dispatch-rule work with K-URL.
URLs generated by send/suspend (and friends) are totally intercepted
by the server and your app doesn't have a change to stand in between
them. I consider this a feature, because you don't need to coordinate
different parts of the app. If you wanted to do that, you'd have to
write a dispatcher to sit outside the servlet dispatcher.
Jay
2011/4/23 J G Cho <gcho at fundingmatters.com>:
> At the bottom of this email is a code that I did not think would work but it
> did. (The code is a combination of get-number and count-dot-com
> tutorial. I first ask the user to type in a number. If it's 42, then
> count-dot-com is evaluated. If not 42, it keeps asking for a number.
> (To run it, you might have to change the
> path to htdocs.))
>
> Steps:
>
> 1) URL /secret presents a form.
> 2) The above step does recur until 42 is submitted.
> 3) Then it evaluates the code from count-dot-com example with 42 as
> initial value.
> 4) + and - works as in the solo tutorial: At this point, URL looks
> something like
> http://localhost:8080/secret;((%22k%22%20.%20%22(3%20105%2097509303)%22))
>
> At step 4, I expected the dispatch rule to intercept it and go into get-number
> routine (i.e. Step 1) but it does not.
>
> QUESTION: Is the dispatch rule called and it's smart enough to
> hand it off? Or because of K-URL, dispatch rule is bypassed entirely
> by the server?
>
> Thanks in advance.
>
> jGc
>
> The code:
>
> #lang racket
>
> (require web-server/servlet
> web-server/servlet-env
> web-server/dispatch)
>
> (define-values (handle-if-url-match hanlder->url)
> (dispatch-rules
> [("") say-hello]
> [("secret") (make-guarded-dispatcher reveal-secret)]))
>
> (define (say-hello req)
> (response/xexpr
> `(html (head (title "Hello world!"))
> (body (p "Hey out there!")))))
>
> (define (reveal-secret req)
> (count-dot-com 42))
>
> (define (count-dot-com i)
> (count-dot-com
> (send/suspend/dispatch
> (λ (embed/url)
> (response/xexpr
> `(html
> (head (title "Count!"))
> (body (h2 (a ([href ,(embed/url
> (λ (req)
> (sub1 i)))])
> "-")
> (form ([action ,(embed/url
> (λ (req)
> (count-dot-com (sub1 i))))]
> [method "POST"])
> (input ([type "submit"]
> [value "-"]))))
> (h1 ,(number->string i))
> (h2 (a ([href ,(embed/url
> (λ (req)
> (add1 i)))])
> "+")
> (form ([action ,(embed/url
> (λ (req)
> (count-dot-com (add1 i))))]
> [method "POST"])
> (input ([type "submit"]
> [value "+"])))))))))))
>
>
> (define (make-guarded-dispatcher next-dispatcher)
> (define (guarded-dispatcher req)
> (define (get-number label)
> (define query
> (send/suspend
>
> (λ (k-url)
> (response/xexpr
> `(html (head (title "Enter a number"))
> (body
> (form ([action ,k-url])
> ,label
> (input ([name "number"]))
> (input ([type "submit"])))))))))
>
> (string->number (extract-binding/single 'number
> (request-bindings query))))
> (define n (get-number "secret number"))
> (if (= 42 n)
> (next-dispatcher req)
> (guarded-dispatcher req)))
>
> guarded-dispatcher)
>
>
> (define (start request)
> (handle-if-url-match request))
>
> (serve/servlet start
> #:command-line? #t
> #:launch-browser? #t
> #:quit? #t
> #:listen-ip #f
> #:port 8080
> #:log-file "log"
> #:extra-files-paths (list (build-path
> "/Users/..../addhoc" "htdocs"))
> #:servlet-regexp #rx"")
>
> _________________________________________________
> For list-related administrative tasks:
> http://lists.racket-lang.org/listinfo/users
--
Jay McCarthy <jay at cs.byu.edu>
Assistant Professor / Brigham Young University
http://faculty.cs.byu.edu/~jay
"The glory of God is Intelligence" - D&C 93