Changeset 5248 in project for mime/trunk/mime.scm


Ignore:
Timestamp:
07/29/07 19:16:31 (14 years ago)
Author:
hans
Message:

version 1.3: factored out mime-get-attributes from mime-parse-content-type, added a missing backslash in mime-parse-version regexp

File:
1 edited

Legend:

Unmodified
Added
Removed
  • mime/trunk/mime.scm

    r5246 r5248  
    4848 (usual-integrations)
    4949 (uses mime:quoted-printable)
    50  (export mime-parse-version mime-parse-content-type
    51         mime-decode-word
     50 (export mime-token-chars mime-parse-version mime-get-attributes
     51         mime-parse-content-type mime-decode-word
    5252         mime-parse-message mime-retrieve-body
    5353         mime-body->string mime-body->file
     
    7272;;
    7373
     74(define mime-token-chars
     75  (char-set-difference
     76   (ucs-range->char-set #x21 #x7f)
     77   (char-set #\( #\) #\< #\> #\@ #\, #\; #\: #\\ #\" #\/ #\[ #\] #\? #\=)))
     78
    7479;; returns list of major and minor versions in integers
    7580(define mime-parse-version
    76   (let ((re-version (regexp "^([0-9]+)\.([0-9]+)$")))
     81  (let ((re-version (regexp "^([0-9]+)\\.([0-9]+)$")))
    7782    (lambda (field)
    7883      (and field
     
    8388                   (else #f)))))))
    8489
    85 ;; returns (<type> <subtype> (<attribute> . <value>) ...)
    86 (define (mime-parse-content-type field)
    87   (define token-chars
    88     (char-set-difference
    89      (ucs-range->char-set #x21 #x7f)
    90      (char-set #\( #\) #\< #\> #\@ #\, #\; #\: #\\ #\" #\/ #\[ #\] #\? #\=)))
     90;; reads attributes in the form ;attr1=val1;attr2=val2;... from input
     91;; and returns them as alist
     92(define (mime-get-attributes input)
    9193  (define cs-quote (char-set #\"))
    9294  (define (get-attributes input r)
    9395    (cond ((and-let* (((eqv? #\; (rfc822-next-token input '())))
    94                       (attr (rfc822-next-token input `(,token-chars)))
     96                      (attr (rfc822-next-token input `(,mime-token-chars)))
    9597                      ((string? attr))
    9698                      ((eqv? #\= (rfc822-next-token input '())))
    9799                      (val  (rfc822-next-token
    98100                             input
    99                              `(,token-chars
     101                             `(,mime-token-chars
    100102                               (,cs-quote . ,rfc822-quoted-string))))
    101103                      ((string? val)))
     
    103105           => (lambda (p) (get-attributes input (cons p r))))
    104106          (else (reverse! r))))
    105 
     107  (get-attributes input '()))
     108
     109;; returns (<type> <subtype> (<attribute> . <value>) ...)
     110(define (mime-parse-content-type field)
    106111  (and field
    107112       (call-with-input-string field
    108113         (lambda (input)
    109            (let* ((type    (rfc822-next-token input `(,token-chars)))
     114           (let* ((type    (rfc822-next-token input `(,mime-token-chars)))
    110115                  (slash   (rfc822-next-token input '()))
    111                   (subtype (rfc822-next-token input `(,token-chars))))
     116                  (subtype (rfc822-next-token input `(,mime-token-chars))))
    112117             (and (string? type)
    113118                  (eqv? #\/ slash)
     
    115120                  (cons* (string-downcase type)
    116121                         (string-downcase subtype)
    117                          (get-attributes input '()))))
    118            ))))
     122                         (mime-get-attributes input))))))))
    119123
    120124;; decode rfc2047-encoded word, i.e. "=?...?="
Note: See TracChangeset for help on using the changeset viewer.