Hi, starting a project of mine, I've setup a dispatch rule and a function to return the response. To make things simple, I've used response/output, with a lambda writing to the output-port. However, I've got the error:
response/output: contract violation expected: void? given: 11 in: the range of the 1st argument of (->* ((-> output-port? void?)) (#:code number? #:headers (listof header?) #:message bytes? #:mime-type (or/c bytes? #f) #:seconds number?) response?) contract from: <pkgs>/web-server-lib/web-server/http/response-structs.rkt blaming: /home/amatheus/Dropbox/focus/todagendas/teste.rkt (assuming the contract is correct) at: <pkgs>/web-server-lib/web-server/http/response-structs.rkt:41.2 context...: /usr/share/racket/collects/racket/contract/private/blame.rkt:143:0: raise-blame-error16 /usr/share/racket/pkgs/web-server-lib/web-server/http/response.rkt:115:12 So I've tried to use a response, with the same lambda, and it worked. From the error message, I changed the lambda to return (void) and then it worked. I think maybe the contract is wrong but frankly I don't understand much about contracts. I've setup some code that exposes the problem. Navigating to "/working" and "/fixed" works fine; navigating to "/not-working" exposes the problem. #lang racket (require web-server/dispatch web-server/servlet-env net/url web-server/http/request-structs web-server/http/response-structs) (define (not-working req) (response/output (λ (op) (write-bytes #"Hello world" op)))) (define (working req) (response 301 #"OK" (current-seconds) TEXT/HTML-MIME-TYPE empty (λ (op) (write-bytes #"Hello world" op)))) (define (fixed req) (response/output (λ (op) (write-bytes #"Hello world" op) (void)))) (define (url->request u) (make-request #"GET" (string->url u) empty (delay empty) #f "1.2.3.4" 80 "4.3.2.1")) (define-values (agenda-dispatch agenda-url) (dispatch-rules [("working") working] [("not-working") not-working] [("fixed") fixed])) (define (main) (serve/servlet agenda-dispatch #:servlet-regexp #rx"" #:servlet-path "")) (module+ main (main)) The contracts in response-structs.rkt: (provide/contract [struct response ([code number?] [message bytes?] [seconds number?] [mime (or/c false/c bytes?)] [headers (listof header?)] [output (output-port? . -> . void)])] [response/full (-> number? bytes? number? (or/c false/c bytes?) (listof header?) (listof bytes?) response?)] [response/output (->* ((-> output-port? void?)) (#:code number? #:message bytes? #:seconds number? #:mime-type (or/c bytes? #f) #:headers (listof header?)) response?)] [TEXT/HTML-MIME-TYPE bytes?]) Is the contract wrong or am I doing something weird? Thanks, André
____________________ Racket Users list: http://lists.racket-lang.org/users