diff options
Diffstat (limited to 'cgi-bin')
| -rwxr-xr-x | cgi-bin/guest_book.cgi | 46 | 
1 files changed, 35 insertions, 11 deletions
diff --git a/cgi-bin/guest_book.cgi b/cgi-bin/guest_book.cgi index b2baf4f..966093a 100755 --- a/cgi-bin/guest_book.cgi +++ b/cgi-bin/guest_book.cgi @@ -7,23 +7,47 @@  (define guest-book-json-file "cgi-bin/guest_book.json") +(define (decode-hex hex) +  (string (integer->char +           (string->number (string-append "#x" +                                          hex))))) + +(define (format-query-string item) +  (letrec ((decode-query +            (lambda (value) +              (let ((index (string-index value #\%)) +                    (value-length (string-length value))) +                (cond ((and index value-length) +                       (string-append (substring value 0 index) +                                      (decode-hex (substring value +                                                             (+ index 1) +                                                             (+ index 3))) +                                      (cond ((< index (- value-length 3)) +                                             (decode-query +                                              (substring value +                                                         (+ index 3) +                                                         value-length))) +                                            (else "")))) +                      (else value)))))) +    (decode-query (string-map (lambda (character) +                                (case character +                                  ((#\+) #\space) +                                  (else character))) +                              item)))) +  ;; Progress form data  (define (get-form) -  (let ((query (getenv "QUERY_STRING")) -        (form '())) +  (let ((query (getenv "QUERY_STRING")))      (cond ((= (string-length query) 0) #f)            (else -           (set! form (string-split query #\&)) -           (for-each -            (lambda (item) -              (set! item (string-split item #\=))) -            form) -           form)))) +           (map (lambda (item) +                  (let ((pairs (string-split item #\=))) +                    (set-cdr! pairs (format-query-string (cadr pairs))) +                    pairs)) +                (string-split query #\&))))))  (define (handle-fields) -  (let ((form (get-form))) -    (if form -        (display form)))) +  (display (get-form)))  ;; Display a guest in the guest book  (define (display-guest guest)  | 
