Fixing the handling of request bodies on non-POST methods

This commit is contained in:
Jay McCarthy 2011-09-13 08:57:51 -06:00
parent 9a034c44ad
commit 78151e073b
3 changed files with 28 additions and 9 deletions

View File

@ -1990,6 +1990,7 @@ path/s is either such a string or a list of them.
"collects/tests/utils/gui.rkt" drdr:command-line (gracket-text "-t" *)
"collects/tests/web-server" responsible (jay)
"collects/tests/web-server/pr/length.rkt" drdr:command-line #f
"collects/tests/web-server/pr/methods.rkt" drdr:command-line #f
"collects/tests/web-server/run-all-tests.rkt" drdr:timeout 300
"collects/tests/web-server/servlet-env/env.rkt" drdr:command-line (mzc *)
"collects/tests/web-server/servlet-env/insta.rkt" drdr:command-line (mzc "-k" *)

View File

@ -0,0 +1,22 @@
#lang racket
(require web-server/servlet-env
web-server/http/xexpr
web-server/http/request-structs
web-server/dispatch)
(define-values (app-dispatch app-url)
(dispatch-rules
[("") index]
[else index]))
(define (index req)
(response/xexpr `(html (p ,(bytes->string/utf-8 (request-method req)))
(p ,(cond ((bytes? (request-post-data/raw req))
(bytes->string/utf-8 (request-post-data/raw req)))
(else "No request body"))))))
(serve/servlet app-dispatch
#:port 8000
#:servlet-regexp #rx""
#:command-line? #t)

View File

@ -209,15 +209,14 @@
[(struct header (_ value))
(cond
[(string->number (bytes->string/utf-8 value))
=> (lambda (len)
=> (lambda (len)
(let ([raw-bytes (read-bytes len in)])
(values (delay (parse-bindings raw-bytes)) raw-bytes)))]
[else
(network-error 'read-bindings "Post request contained a non-numeric content-length")])]
[#f
(let ([raw-bytes (apply bytes-append (read-to-eof in))])
(values (delay (parse-bindings raw-bytes)) raw-bytes))])]))]
[(bytes-ci=? #"PUT" meth)
(values (delay empty) #f)])]))]
[meth
(local
[(define content-type (headers-assq* #"Content-Type" headers))
(define in (connection-i-port conn))]
@ -228,12 +227,9 @@
(let ([raw-bytes (read-bytes len in)])
(values (delay empty) raw-bytes)))]
[else
(network-error 'read-bindings "Put request contained a non-numeric content-length")])]
(network-error 'read-bindings "Non-GET/POST request contained a non-numeric content-length")])]
[#f
(let ([raw-bytes (apply bytes-append (read-to-eof in))])
(values (delay empty) raw-bytes))]))]
[meth
(values (delay empty) #f)]))
(values (delay empty) #f)]))]))
;; parse-bindings : bytes? -> (listof binding?)
(define (parse-bindings raw)