Changeset 29234 in project


Ignore:
Timestamp:
06/26/13 11:11:54 (7 years ago)
Author:
Ivan Raikov
Message:

cgi: fixes to multipart decoding

Location:
release/4/cgi/trunk
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • release/4/cgi/trunk/environment.scm

    r29090 r29234  
    170170                   (value      (abnf:bind-consumed->string
    171171                                (abnf:alternatives token quoted-string)))
    172                    (parameter  (abnf:bind-consumed-strings->list
    173                                 (abnf:concatenation
    174                                  attribute
    175                                  (abnf:drop-consumed (abnf.char #\=)) value)))
     172                   (parameter  (lambda (sk fk inp)
     173                                 ((abnf:bind-consumed-strings->list
     174                                   (abnf:concatenation
     175                                    attribute
     176                                    (abnf:drop-consumed (abnf.char #\=))
     177                                    value)) sk fk inp)))
    176178                   (media-type (abnf:concatenation
    177179                                (abnf:bind-consumed-strings->list 'type type)
     
    180182                                (abnf:repetition
    181183                                 (abnf:concatenation
    182                                   (abnf:drop-consumed (abnf.char #\;)) parameter))))
     184                                  (abnf:drop-consumed
     185                                   (abnf:concatenation
     186                                    (abnf.char #\;)
     187                                    (abnf:repetition
     188                                     (abnf.set (char-set #\space #\tab)))
     189                                    ))
     190                                  parameter))))
    183191                   )
    184192
  • release/4/cgi/trunk/protocol.scm

    r29124 r29234  
    1616         request-inputs request-body
    1717         input-value input-ct input-filename
     18
    1819         simple-input->string
    1920         simple-input->charlist
    2021         simple-input->number
     22
    2123         DocumentResponse
    2224         LocalRedirResponse
     
    143145
    144146(define (position s b)
    145   (let ((sb (string->byte-blob s)))
     147  (let ((sb (if (string? s) (string->byte-blob s) s)))
    146148    (byte-blob-find sb b)
    147149    ))
     
    253255
    254256
    255 (define (multipart-boundary inp)
    256   (match (position "boundary=" inp)
    257          ((_ (bndeqn))
    258           (byte-blob-char-cdr (byte-blob-char-trim (lambda (c) (not (char=? #\= c))) bndeqn)))
    259          (else #f)))
    260 
    261257
    262258(define (multipart-decode ps inp)
    263   (let ((boundary (string-append "--" (multipart-boundary ps)))
    264         (skipbnd   (lambda (x) (byte-blob-char-trim x (lambda (c) (not (char=? c #\newline)))))))
    265     (match-let (((_ (contents . rest)) (position boundary inp)))
    266                (let loop ((rest rest) (ax (list (skipbnd contents))))
    267                  (match-let (((pref suff) (position boundary rest)))
    268                     (if (or (byte-blob-empty? pref) (byte-blob-empty? suff))
    269                         (list (reverse ax) suff)
    270                         (loop (skipbnd suff) (cons pref ax)))
    271                     ))
    272                ))
     259  (print "ps = " ps)
     260  (let ((boundary (alist-ref "boundary" ps string=?)))
     261    (print "boundary = " boundary)
     262    (if (not boundary) (list '() inp)
     263        (let ((boundary1 (string->byte-blob (car boundary)))
     264              (skipbnd  (lambda (x) (byte-blob-char-trim x (lambda (c) (not (char=? c #\newline)))))))
     265          (print "position boundary = " (position boundary1 inp))
     266          (match-let (((_ (contents . rest)) (position boundary1 inp)))
     267                     (print "contents = " contents)
     268                     (let loop ((rest rest) (ax (list (skipbnd contents))))
     269                       (match-let (((pref suff) (position boundary1 rest)))
     270                                  (if (or (byte-blob-empty? pref) (byte-blob-empty? suff))
     271                                      (list (reverse ax) suff)
     272                                      (loop (skipbnd suff) (cons pref ax)))
     273                                  ))
     274                     ))
     275        ))
    273276  )
    274277
     
    277280
    278281(define (decode-body ctype inp)
     282  (print "ctype = " ctype)
    279283  (match ctype
    280          ((('type "multipart") ('subtype "form-data") ps)
    281           (multipart-decode ps inp))
     284         ((('type "multipart") ('subtype "form-data") . ps)
     285          (list (list) (multipart-decode ps inp)))
    282286         ((('type "application") ('subtype "x-www-form-urlencoded"))
    283287          (list (form-input inp) (byte-blob-empty)))
  • release/4/cgi/trunk/tests/fileform.html

    r29125 r29234  
    55  <body>
    66    <h1>Please choose a file</h1>
    7     <form action="/cgi-bin/processfileform" method="POST"
     7    <form action="/cgi-bin/fileform" method="POST"
    88          enctype="multipart/form-data">
    99      <p>Your name: <input type="text" name="name" /></p>
    10       <p>File to Upload: <input type="file" name="file" /></p>
     10      <p>File to Upload: <input type="file" name="file">Upload</input></p>
    1111    </form>
    1212  </body>
Note: See TracChangeset for help on using the changeset viewer.