|
|
|
|
@ -18,6 +18,7 @@
|
|
|
|
|
"../utils/url-base64.rkt" |
|
|
|
|
"define-recordable-struct.rkt" |
|
|
|
|
racket/string |
|
|
|
|
racket/list |
|
|
|
|
racket/match |
|
|
|
|
racket/contract |
|
|
|
|
syrup) |
|
|
|
|
@ -171,28 +172,17 @@
|
|
|
|
|
(define (error-not-an-ocapn-url something-else) |
|
|
|
|
(error 'not-an-ocapn-url "Not an OCapN URL: ~a" something-else)) |
|
|
|
|
|
|
|
|
|
(define (string-rsplit-once str find-char) |
|
|
|
|
(define (list-rsplit-once lst elem-to-find match-func) |
|
|
|
|
(for/fold ([left-side '()] |
|
|
|
|
[right-side '()]) |
|
|
|
|
([elem lst]) |
|
|
|
|
(if (match-func elem elem-to-find) |
|
|
|
|
(values (append left-side |
|
|
|
|
(if (null? left-side) '() (list elem)) |
|
|
|
|
right-side) |
|
|
|
|
'()) |
|
|
|
|
(values left-side (append right-side (list elem)))))) |
|
|
|
|
|
|
|
|
|
(let*-values ([(chars) (string->list str)] |
|
|
|
|
[(left-side right-side) (list-rsplit-once chars find-char char=?)]) |
|
|
|
|
(values (list->string left-side) |
|
|
|
|
(list->string right-side)))) |
|
|
|
|
(define (url-host->transport-parts url-host) |
|
|
|
|
(let* ((url-host-length (string-length url-host)) |
|
|
|
|
(transport-str (last (string-split url-host "."))) |
|
|
|
|
(address (substring url-host 0 (- url-host-length (string-length transport-str) 1)))) |
|
|
|
|
(values (string->symbol transport-str) address))) |
|
|
|
|
|
|
|
|
|
(define/contract (url->ocapn-machine ocapn-url) |
|
|
|
|
(-> url? ocapn-machine?) |
|
|
|
|
(let*-values ([(host) (url-host ocapn-url)] |
|
|
|
|
[(address transport) (string-rsplit-once host #\.)]) |
|
|
|
|
(ocapn-machine (string->symbol transport) address #f))) |
|
|
|
|
[(transport address) (url-host->transport-parts host)]) |
|
|
|
|
(ocapn-machine transport address #f))) |
|
|
|
|
|
|
|
|
|
(define (url->ocapn-struct ocapn-url) |
|
|
|
|
(unless (and (string? (url-scheme ocapn-url)) |
|
|
|
|
|