;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; u8vector<->number procedures shamlessly stolen from the 9p egg. ;; These vectors are in reverse network byte ordering because the 9p protocol ;; expects them that way. (ie, little endian) (define (u8vector->number v) (let loop ((i (u8vector-length v)) (num 0)) (if (zero? i) num (loop (sub1 i) (+ (arithmetic-shift num 8) (u8vector-ref v (sub1 i))))))) (define (number->u8vector size number) (let ((v (make-u8vector size 0))) (let loop ((i size) (num number)) (if (zero? i) (if (zero? num) v ;; Internal error (error (sprintf "Number too large: ~A can't be split into an u8vector of ~A entries" number size))) (begin (u8vector-set! v (- size i) (inexact->exact (modulo num 256))) ; XXX (loop (sub1 i) (quotient num 256))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (u8vectors->base64 . vecs) (if (= 1 (length vecs)) (base64-encode (blob->string (u8vector->blob/shared (car vecs)))) (u8vectors->base64 (list->u8vector (flatten (map u8vector->list vecs)))))) (define (base64->u8vectors str . subu8ranges) (let ((vec (blob->u8vector (string->blob (base64-decode str))))) (if (> (length subu8ranges) 0) (apply values (map (lambda (x) (subu8vector vec (car x) (cadr x))) subu8ranges)) vec))) (define (decode-cookie cookie) (base64->u8vectors cookie '(0 4) '(4 12) '(12 24))) (define encode-cookie u8vectors->base64) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;