[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.

From: J G Cho (gcho at fundingmatters.com)
Date: Sat Apr 23 16:38:16 EDT 2011

Thank you for the clarification.

I just wanted to clear up if that was the case or dispatcher somehow
smartly let it pass. Obviously the design seems 'clever/correct' to my
untrained eyes at this point. After all, it allows my code to work
without me having to let dispatcher some how make an exception.

On Sat, Apr 23, 2011 at 11:57 AM, Jay McCarthy <jay.mccarthy at gmail.com> wrote:
> 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
>



Posted on the users mailing list.