From: J G Cho (gcho at fundingmatters.com) Date: Sat Jun 25 22:42:37 EDT 2011 |
|
Yikes. I did read those documents before sometime ago when I started to learn about Racket. Without much comprehension! I really hoped to stay with WebApps part and stay oblivious to the internals of the Server. No such luck if I really want to take advantage of all the neat things it can do. Per your reply with links, I read them again trying to make sense of your sequencing dispatchers code. I think I can sorta get a feel for sequence:make and lift:make etc but ... Right now, I feel very comfortable 'hugging the shore' writing my little servlets. Stringing together my own custom dispatchers feel like taking a new sail boat out to uncharted big ocean. You see, I am still banging my head making my way around the documents on Racket HTTP Server, which is not the easiest to digest. First, the first sentence I read is "Web Server is just a configuration of a dispatching server." My reaction is, 'Huh? I've never heard such statement over the years doing web apps starting with Perl CGI, PHP, JSP, RoR, GAE to mention a few. The statement might be true but it's not helping me find my way around. Sounds more like zen koan or something experts utter that completely makes no sense to a beginner.' Second, I am trying out the file server example (from 3. Launching Servers). I made a file file-server.rkt by copying the code: #lang racket (require web-server/webserver web-server/dispatchers/filesystem-map) (define (start-file-server base) (serve #:dispatch (files:make #:url->path (make->url->path base) #:path->mime-type (lambda (path) #"application/octet-stream")) #:indices (list "index.html") #:port 8080)) (start-file-server (current-directory)) I am invoking it with path to /Racket5.1/bin/racket -t file-server.rkt (the way I start my servlets from command line when not using DrRacket). I am greeted with: default-load-handler: cannot open input file: "path to/Racket5.1/collects/web-server/webserver.rkt" (No such file or directory; errno=2) Either the example is wrong or the author has left out a small detail obvious to him but not so to this beginner. It's going to take a bit of blood/sweat/tears/scars... But on the other hand, the design seems very promising/exciting if I can get past the initial learning pains. Taking the auth checking code out of the procedures is such a huge gain! Thank you. On Sat, Jun 25, 2011 at 1:10 PM, Jay McCarthy <jay.mccarthy at gmail.com> wrote: > The Web server is set up as a pipeline of "dispatchers", which are > functions that accept the TCP connection and the HTTP request and > either write a response or refuse to handle the request. This chapter > of the documentation: > > http://docs.racket-lang.org/web-server-internal/dispatchers.html > > discusses all the dispatchers that make up the standard server. They > can be combined very easily to customize the server to do exactly what > you want. > > Launching a server with your custom dispatcher is as easy as using > serve/servlet or web-server/insta: > > http://docs.racket-lang.org/web-server-internal/web-server.html > > Jay > > 2011/6/25 J G Cho <gcho at fundingmatters.com>: >> Seems like an elegant approach but.... "dispatcher outside the >> servlet" goes over my head like an UFO over a crop duster. >> >> I guess I will have to dig deeper into how the server is put together. >> >> On Sat, Jun 25, 2011 at 1:23 AM, Jay McCarthy <jay.mccarthy at gmail.com> wrote: >>> I find it more convenient to setup a dispatcher outside the servlet >>> that checks for the authenticator, that way once it has passed that >>> part of the dispatch chain, security can be relied upon. Something >>> like... >>> >>> (serve/launch/wait >>> (sequence:make >>> (lift:make (lambda (req) (if (or (unsecured-url? req) >>> (authenticated? req)) (next-dispatcher) (display-error/login-page)))) >>> (dispatch/servlet ...))) >>> >>> Then the servlet code can basically ignore the authenticator. >>> >>> Jay >>> >>> 2011/6/24 J G Cho <gcho at fundingmatters.com>: >>>> Hello again, >>>> >>>> I am guessing my problem calls for macro (which is "beyond my pay >>>> scale") and I am hoping this is the right place. >>>> >>>> Anyway, after reading this >>>> http://docs.racket-lang.org/web-server/faq.html#(part._.What_special_considerations_are_there_for_security_with_the_.Web_.Server_) >>>> >>>> I am led to believe that I will be writing lots of code like this: >>>> >>>> (define (some-sensitive-content req) >>>> >>>> (if (user-is-legit req) ;check auth cookie >>>> (...what have you ...) >>>> (do-login-and-then-maybe-handle req))) >>>> >>>> So here is my first attemp at macro which sorta works: >>>> >>>> (define-syntax (guarded-handler stx) >>>> (syntax-case stx () >>>> [(_ name body) >>>> #'(begin (define (name req) >>>> (if (user-is-legit req) >>>> body >>>> (ask-login req))))])) >>>> >>>> (guarded-handler gated-content >>>> (response/xexpr >>>> `(html (head (title "Gated Content")) >>>> (body (p "Shhhhhhh") >>>> (p >>>> (a ([href "/logout "]) >>>> "Done")))))) >>>> >>>> What I would really like, however, is >>>> >>>> (guard (lambda (req) ...)) to transformed to: >>>> >>>> (lambda (req) >>>> (if (user-is-legit req) >>>> (...what have you ...) >>>> (do-login-and-then-maybe-handle req))) >>>> >>>> such that I can use it like: >>>> >>>> (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 >>>> (guard (λ (req) >>>> (sub1 i))))]) >>>> "-")) >>>> ... >>>> >>>> (define (count-dot-com i) >>>> (send/suspend/dispatch >>>> (λ (embed/url) >>>> (response/xexpr >>>> `(html >>>> (head (title "Count!")) >>>> (body (h2 (a ([href ,(embed/url >>>> >>>> (guard (λ (req) >>>> (count-dot-com (sub1 i))))]) >>>> "-") >>>> ... >>>> >>>> in addition to the first case like this: >>>> >>>> (define gated-content >>>> (guard (lambda (req) ...)) >>>> >>>> Seems simple enough but my naive macros (not shown here to protect my >>>> fragile ego) are failing. >>>> Any help/suggestion is greatly appreciated. >>>> >>>> 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 >>> >> > > > > -- > 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 >