Ended up doing #lang racket
(require web-server/http web-server/http/bindings web-server/lang/web ;not web-server/servlet web-server/templates) For some reason, module+ main does not like #lang web-server. However, the code now fails with: Cannot stuff (kont #<procedure:...abort-resume.rkt:145:3>) into a URL because it contains non-serializable pieces. Convert #<procedure:next-text-handler> to a serializable struct Does this fall under 'serial->native' part of the documentation or do I need to make a serializable struct of txts argument? It's a just list of strings, which I thought would be harmless in this context. On Fri, Aug 24, 2012 at 10:21 PM, Jay McCarthy <jay.mccar...@gmail.com> wrote: > When you use > > #lang web-server > > You have to use > > web-server/lang/web --- > http://docs.racket-lang.org/web-server/stateless.html#(part._lang/web) > > rather than > > web-server/servlet/web (which you are getting from web-server/servlet) > > The problem is that your send/suspend/dispatch is the STATEFUL one, > not the STATELESS one and so there is no state instance available. > > Jay > > On Fri, Aug 24, 2012 at 8:38 AM, J G Cho <g...@fundingmatters.com> wrote: >> So I have a module that runs fine in a web server. However when I >> tried it in "stateless" server, it fails (msg: No instance for id: 1) >> with a very short stacke trace. I run it by itself using (module+ main >> ...) then it runs but it does not work as intended (more on this >> below). >> >> So here are "toy" versions of what my module does which produces >> similar behavior. >> >> First, the version that works (uses the attached file as template): >> >> #lang racket >> >> (require web-server/servlet >> web-server/templates) >> >> ;; insert into UI Template and then dish out HTML >> (define (form-template msg k-url output) >> (response/full >> 200 #"Okay" >> (current-seconds) TEXT/HTML-MIME-TYPE >> empty >> (list (string->bytes/utf-8 (include-template "ui.html"))))) >> >> (define (all-ups xs) >> (if (null? xs) >> "" >> (string-append (string-upcase (car xs)) >> "<br/>" >> (all-ups (cdr xs))))) >> >> (define (main-loop txts parser helper) >> (local [(define (response-generator embed/url) >> (form-template >> (helper (reverse txts)) >> (embed/url next-text-handler) >> (format "~a" (parser (reverse txts))))) >> >> (define (next-text-handler req) >> (main-loop (cons (extract-binding/single 'quote >> (request-bindings req)) >> txts) >> parser >> helper))] >> >> (send/suspend/dispatch response-generator))) >> >> (define (start initial-req) >> (main-loop '() >> (lambda (xs) >> (cond >> [(null? xs) "To undo, just go back (short-cut >> alt+left arrow)."] >> [else (all-ups xs)])) >> (lambda (xs) >> (cond >> [(null? xs) "Start:"] >> [else (format "Input ~a: ready for more." (add1 >> (length xs)))])))) >> >> (provide start) >> >> (module+ main >> (require web-server/servlet-env) >> >> (serve/servlet start >> #:quit? #t >> #:listen-ip #f >> #:log-file "debug.log" #:port 8082 #:launch-browser? #t >> #:log-format 'parenthesized-default >> #:servlet-path "/quotes")) >> >> Here is the version that does not work (main difference is in module+ area): >> >> #lang racket >> >> (require web-server/servlet >> web-server/templates) >> >> ;; insert into UI Template and then dish out HTML >> (define (form-template msg k-url output) >> (response/full >> 200 #"Okay" >> (current-seconds) TEXT/HTML-MIME-TYPE >> empty >> (list (string->bytes/utf-8 (include-template "ui.html"))))) >> >> (define (all-ups xs) >> (if (null? xs) >> "" >> (string-append (string-upcase (car xs)) >> "<br/>" >> (all-ups xs)))) >> >> (define (main-loop txts parser helper) >> (local [(define (response-generator embed/url) >> (form-template >> (helper (reverse txts)) >> (embed/url next-text-handler) >> (format "~a" (parser (reverse txts))))) >> >> (define (next-text-handler req) >> (main-loop (cons (extract-binding/single 'quote >> (request-bindings req)) >> txts) >> parser >> helper))] >> >> (send/suspend/dispatch response-generator))) >> >> (define (start initial-req) >> (main-loop '() >> (lambda (xs) >> (cond >> [(null? xs) "To undo, just go back (short-cut >> alt+left arrow)."] >> [else (all-ups xs)])) >> (lambda (xs) >> (cond >> [(null? xs) "Start:"] >> [else (format "Input ~a: ready for more." (add1 >> (length xs)))])))) >> >> (provide start) >> >> (module+ main >> (require web-server/servlet-env >> web-server/stuffers) >> >> (define stuffer >> (stuffer-chain >> serialize-stuffer >> (md5-stuffer (build-path (current-directory) "urls")))) >> >> (serve/servlet start >> #:quit? #t >> #:listen-ip #f >> #:log-file "debug.log" #:port 8082 #:launch-browser? #t >> #:log-format 'parenthesized-default >> #:stateless? #t #:stuffer stuffer >> #:servlet-path "/quotes")) >> >> The failed version seems to have no memory (ie the previous inputs are >> NOT available). >> >> How can I fix this? >> >> jGc >> >> ____________________ >> Racket Users list: >> http://lists.racket-lang.org/users >> > > > > -- > Jay McCarthy <j...@cs.byu.edu> > Assistant Professor / Brigham Young University > http://faculty.cs.byu.edu/~jay > > "The glory of God is Intelligence" - D&C 93 ____________________ Racket Users list: http://lists.racket-lang.org/users