diff --git a/collects/web-server/http/request.ss b/collects/web-server/http/request.ss index 58c3bf7c59..8917ec1757 100644 --- a/collects/web-server/http/request.ss +++ b/collects/web-server/http/request.ss @@ -1,4 +1,4 @@ -#lang scheme/base +#lang scheme (require mzlib/contract mzlib/plt-match net/url @@ -147,48 +147,49 @@ ;; read-bindings&post-data/raw: connection symbol url (listof header?) -> (values (or/c (listof binding?) string?) (or/c bytes? false/c?)) (define (read-bindings&post-data/raw conn meth uri headers) - (match meth - ['get + (cond + [(bytes-ci=? #"GET" meth) (values (map (match-lambda [(list-rest k v) (make-binding:form (string->bytes/utf-8 (symbol->string k)) (string->bytes/utf-8 v))]) (url-query uri)) #f)] - ['post - (define content-type (headers-assq* #"Content-Type" headers)) - (define in (connection-i-port conn)) - (cond - [(and content-type (regexp-match FILE-FORM-REGEXP (header-value content-type))) - => (match-lambda - [(list _ content-boundary) - (values - (map (match-lambda - [(struct mime-part (headers contents)) - (define rhs (header-value (headers-assq* #"Content-Disposition" headers))) - (match (list (regexp-match #"filename=(\"([^\"]*)\"|([^ ;]*))" rhs) - (regexp-match #"[^e]name=(\"([^\"]*)\"|([^ ;]*))" rhs)) - [(list #f #f) - (network-error 'reading-bindings "Couldn't extract form field name for file upload")] - [(list #f (list _ _ f0 f1)) - (make-binding:form (or f0 f1) (apply bytes-append contents))] - [(list (list _ _ f00 f01) (list _ _ f10 f11)) - (make-binding:file (or f10 f11) (or f00 f01) headers (apply bytes-append contents))])]) - (read-mime-multipart content-boundary in)) - #f)])] - [else - (match (headers-assq* #"Content-Length" headers) - [(struct header (_ value)) - (cond - [(string->number (bytes->string/utf-8 value)) - => (lambda (len) - (let ([raw-bytes (read-bytes len in)]) - (values (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 (parse-bindings raw-bytes) raw-bytes))])])] + [(bytes-ci=? #"POST" meth) + (local + [(define content-type (headers-assq* #"Content-Type" headers)) + (define in (connection-i-port conn))] + (cond + [(and content-type (regexp-match FILE-FORM-REGEXP (header-value content-type))) + => (match-lambda + [(list _ content-boundary) + (values + (map (match-lambda + [(struct mime-part (headers contents)) + (define rhs (header-value (headers-assq* #"Content-Disposition" headers))) + (match (list (regexp-match #"filename=(\"([^\"]*)\"|([^ ;]*))" rhs) + (regexp-match #"[^e]name=(\"([^\"]*)\"|([^ ;]*))" rhs)) + [(list #f #f) + (network-error 'reading-bindings "Couldn't extract form field name for file upload")] + [(list #f (list _ _ f0 f1)) + (make-binding:form (or f0 f1) (apply bytes-append contents))] + [(list (list _ _ f00 f01) (list _ _ f10 f11)) + (make-binding:file (or f10 f11) (or f00 f01) headers (apply bytes-append contents))])]) + (read-mime-multipart content-boundary in)) + #f)])] + [else + (match (headers-assq* #"Content-Length" headers) + [(struct header (_ value)) + (cond + [(string->number (bytes->string/utf-8 value)) + => (lambda (len) + (let ([raw-bytes (read-bytes len in)]) + (values (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 (parse-bindings raw-bytes) raw-bytes))])]))] [meth (values empty #f)]))