[racket] webserver mapping servlets to path
Hi jGc,
It is actually simpler than Noel suggests. Scroll down...
2011/4/16 J G Cho <gcho at fundingmatters.com>:
> To those familiar with Web Server,
>
> I am a bit lost trying to map servlets to paths. e.g.:
>
> servlet1.rkt should requests to http://localhost:8080/app1
> servlet2.rkt should requests to http://localhost:8080/app2
>
> etc.
>
> First, I tried the following:
>
> (require "servlet1.rkt" "servlet2.rkt") ; they export servlet1-start
> and servlet2-start
>
> (define-values (blog-dispatch blog-url)
> (dispatch-rules
> [("app1") servlet1-start]
> [("app2") servlet2-start]
> [else say-hello]))
This line says that for _all other requests_ say-hello will respond.
>
> (define (say-hello req)
> (response/xexpr
> `(html (head (title "Hello world!"))
> (body (p "Hey out there!")))))
>
> (define (start request)
> (blog-dispatch 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/../../multi-serve" "htdocs"))
> #:servlet-regexp #rx"")
This last line says that the servlet will handle all requests that match #rx"".
These two together mean that the servlet handles all requests and
say-hello handles everything that doesn't match app1 or app2. Thus,
"static file requests" never make it to the file dispatcher that is
created with serve/servlet.
I suggest that you change start so it is explicitly rejects handling
those requests with (next-dispatcher). One way to do that is to remove
the 'else' case from the dispatch-rules.
Jay
>
>
> It sort of works but the PROBLEM with the above is, requests for
> static files are dispatched to say-hello. QUESTION: Is there a way to
> write a handler to serve static files? So I can replace say-hello with
> such procedure. (I think putting the Web Server behind Apache might
> work but have not tested it yet. Have Apache serve the static files
> first...)
>
> Second, I tried the following:
>
> (define (dispatch request)
> (define paths (map path/param-path (url-path (request-uri request))))
> (define 2nd-path (if (< (length paths) 2)
> ""
> (second paths)))
> (cond
> [(equal? "app1" 2nd-path) (servlet1-start request)]
> [(equal? "app2" 2nd-path) (servlet2-start request)]
> [else (say-hello request)]))
>
> (define (say-hello request)
> (response/xexpr
> `(html (head (title "Hello world!"))
> (body (p "How is it going?")))))
>
> (define (start request)
> (dispatch 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/../../multi-serve" "htdocs"))
> #:servlet-path "/servlets")
>
> It does handle the static files but now the PROBLEM is that the server
> thinks http://localhost:8080/servlets/app1 is static file not found on
> the system instead of passing it to this servlet.
>
> I would be very grateful if some one knows a solution or a better way
> to go about it.
>
> jGc
> _________________________________________________
> 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