Changeset 29124 in project


Ignore:
Timestamp:
06/19/13 04:47:13 (8 years ago)
Author:
Ivan Raikov
Message:

cgi: basic functionality supporting x-www-form-urlencoded

File:
1 edited

Legend:

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

    r29114 r29124  
    1717         input-value input-ct input-filename
    1818         simple-input->string
     19         simple-input->charlist
     20         simple-input->number
    1921         DocumentResponse
    2022         LocalRedirResponse
     
    3840  input?
    3941  (value        input-value)
    40   (content-type input-ct)
    41   (filename     input-filename))
     42  (filename     input-filename)
     43  (content-type input-ct))
    4244
    4345
     
    298300
    299301(define (simple-input->string v)
    300   (cases input v
    301          (Input (val fn ct)
    302                 (match ct (("text" _ _)  val)
    303                        (else #f)))
     302  (match v
     303         (($ input val fn ct)
     304          (match ct (("text" _ _)  (list->string val))
     305                 (else #f)))
     306         (else #f)))
     307               
     308
     309(define (simple-input->charlist v)
     310  (match v
     311         (($ input val fn ct)
     312          (match ct (("text" _ _)  val)
     313                 (else #f)))
     314         (else #f)))
     315               
     316
     317(define (simple-input->number v)
     318  (match v
     319         (($ input val fn ct)
     320          (match ct (("text" "plain" _)  (string->number (list->string val)))
     321                 (else #f)))
    304322         (else #f)))
    305323               
     
    315333
    316334
    317 (define (uri-char-decode c)
    318   (match c
    319          ((#\% h1 h2)
    320           (integer->char (octet-decode h1 h2)))
    321          ((#\+)
    322           #\space)
    323          (else c)))
     335(define (uri-char-decode cs)
     336  (let recur ((cs cs) (ax '()))
     337    (if (null? cs) (reverse ax)
     338        (let ((c (car cs)))
     339          (let ((c1.rest
     340                 (match c
     341                        (#\%
     342                         (let ((h1 (cadr cs)) (h2 (caddr cs)))
     343                           (cons
     344                            (integer->char (octet-decode h1 h2))
     345                            (cdddr cs))))
     346                        (#\+
     347                         (cons #\space (cdr cs)))
     348                        (else cs))))
     349            (let ((c1 (car c1.rest))
     350                  (rest (cdr c1.rest)))
     351              (recur rest (cons c1 ax)))
     352            ))
     353        ))
     354  )
    324355                 
    325356 
     
    334365                   (cons
    335366                    (cons (string->symbol (list->string (uri-char-decode k)))
    336                           (list->string (if (null? v) v (uri-char-decode (cdr v)))))
     367                          (if (null? v) v (uri-char-decode (cdr v))))
    337368                    ax))
    338369            ))
Note: See TracChangeset for help on using the changeset viewer.