[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
7.3.10.2 Inspecting the Request
The Hello World program above is a general greeter, responding to all URIs. To make a more exclusive greeter, we need to inspect the request object, and conditionally produce different results. So let’s load up the request, response, and URI modules, and do just that.
(use-modules (web server)) ; you probably did this already (use-modules (web request) (web response) (web uri)) (define (request-path-components request) (split-and-decode-uri-path (uri-path (request-uri request)))) (define (hello-hacker-handler request body) (if (equal? (request-path-components request) '("hacker")) (values '((content-type . (text/plain))) "Hello hacker!") (not-found request))) (run-server hello-hacker-handler)
Here we see that we have defined a helper to return the components of
the URI path as a list of strings, and used that to check for a request
to /hacker/
. Then the success case is just as before – visit
http://localhost:8080/hacker/
in your browser to check.
You should always match against URI path components as decoded by
split-and-decode-uri-path
. The above example will work for
/hacker/
, //hacker///
, and /h%61ck%65r
.
But we forgot to define not-found
! If you are pasting these
examples into a REPL, accessing any other URI in your web browser will
drop your Guile console into the debugger:
<unnamed port>:38:7: In procedure module-lookup: <unnamed port>:38:7: Unbound variable: not-found Entering a new prompt. Type `,bt' for a backtrace or `,q' to continue. scheme@(guile-user) [1]>
So let’s define the function, right there in the debugger. As you probably know, we’ll want to return a 404 response.
;; Paste this in your REPL (define (not-found request) (values (build-response #:code 404) (string-append "Resource not found: " (uri->string (request-uri request))))) ;; Now paste this to let the web server keep going: ,continue
Now if you access http://localhost/foo/
, you get this error
message. (Note that some popular web browsers won’t show
server-generated 404 messages, showing their own instead, unless the 404
message body is long enough.)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated on April 20, 2013 using texi2html 5.0.