[racket] Servlet static file paths, I just don't get it
Thanks a lot! That's what I was suspecting already.
But I still wonder how to do achieve what I want. how do I make
"http://my-server.com/lottery" respond to my lottery servlet, but every
other request to respond with respond-unknown *and also* show an
image file within respond-unknown? Is there no way to load a static
file (e.g. by relative path) within such a "catch all" handler?
I'm using a dispatcher because I want to later add lots of experimental
servlets, all of which should have easy urls (my-server/lottery,
my-server/test, etc.). Everything else should be handled by
respond-unknown. Do I have to use a static web page instead of
respond-unknown?
Best,
Erich
On Sat, 28 Sep 2013 21:57:21 -0600
Jay McCarthy <jay.mccarthy at gmail.com> wrote:
> Hi Erich,
>
> You have programmed your servlet to respond to all requests, including
> requests to URLs like "http://your-server.com/images/Sloth.png". If
> you go to that URL, you'll see that it shows you the result of
> respond-unknown.
>
> On Sat, Sep 28, 2013 at 4:05 PM, Erich Rast <erich at snafu.de> wrote:
> > This is driving me nuts, I just cannot find the place where my
> > servlet gets static files from. I run the following "server.scm" in
> > a directory in which there is also "htdocs/images/Sloth.png" but no
> > matter what combination of img src file paths and extra-file-paths
> > I try, respond-unknown does not want to display the Sloth.png when
> > I click run:
> >
> > #lang racket
> > (require web-server/web-server
> > web-server/dispatch
> > web-server/servlet-env
> > web-server/servlet)
> > (require "lottery/darkstar-lottery.scm")
> >
> > (define (respond-unknown req)
> > (response/xexpr '(html
> > (head (title "The 3-Toed Sloth"))
> > (body
> > (img ([src "images/Sloth.png"]))
> > (h1 "Under construction")))))
> >
> > (define-values (dispatch input-url)
> > (dispatch-rules
> > (("lottery") lottery-app)
> > (else respond-unknown)))
>
> You did it right here when you said that if you go to anything other
> than "/lottery" then you should run 'respond-unknown'
>
> If you look at section 5.1 of the documentation (the first section on
> dispatch-rules) that has this paragraph:
>
> "When you use web-server/dispatch with serve/servlet, you almost
> always want to use the #:servlet-regexp argument with the value "" to
> capture all top-level requests. However, make sure you don’t include
> an else in your rules if you are also serving static files, or else
> the filesystem server will never see the requests."
>
> The problem mentioned is exactly what you did.
>
> Jay
>
> >
> > (serve/servlet dispatch ; answers requests
> > #:servlet-path "" ; is the default URL
> > #:extra-files-paths (list (build-path
> > (current-directory) "htdocs"))
> > #:port 8080 ; is the port
> > #:servlet-regexp #rx"")
> >
> > How do I make the servlet serve the file "htdocs/images/Sloth.png"
> > relative to the servlet source directory and how do I address it in
> > the "img" tag? I tried absolute paths, too, but no luck.
> >
> > Best,
> >
> > Erich
> >
> > P.S. For completeness, the content of
> > lottery/darkstar-lottery.scm:
> >
> > #lang racket
> > (require web-server/servlet
> > web-server/servlet-env)
> > (provide lottery-app)
> >
> > (define (draw n total)
> > (sort
> > (take
> > (shuffle (for/list ((i (in-range total)))
> > (add1 i)))
> > n)
> > <))
> >
> > (define (stringify numbers)
> > (string-append
> > (apply string-append
> > (for/list ([n (in-list (reverse (cdr (reverse
> > numbers))))]) (format "~a, " n)))
> > (format "~a" (car (reverse numbers)))))
> >
> > (define (euromillions)
> > (define (draw-5-of-50)
> > (draw 5 50))
> > (define (draw-2-of-11)
> > (draw 2 11))
> > (format "The next lottery result is ~a with additional numbers
> > ~a." (stringify (draw-5-of-50))
> > (stringify (draw-2-of-11))))
> >
> > (define (lottery-app req)
> > (response/xexpr
> > `(html (head (title "Euromillions"))
> > (body (p ,(euromillions))))))
> >
> > ;(serve/servlet lottery-app
> > ; #:servlet-path "/lottery"
> > ; #:port 8080
> > ; #:command-line #t)
> > ____________________
> > Racket Users list:
> > http://lists.racket-lang.org/users
>
>
>