X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=scratchy.git;a=blobdiff_plain;f=burrower.scm;h=4d00253086b5bb7c3b6ad02037c9c293d8b0ae72;hp=69fafbc4169da3907c6c0ae1b318afe98e12fecd;hb=d7925f64bd746c0cdb935654a335a9c8443dd422;hpb=4bb715363eff4e534a3ccbb1981401118dfa234d diff --git a/burrower.scm b/burrower.scm index 69fafbc..4d00253 100644 --- a/burrower.scm +++ b/burrower.scm @@ -28,7 +28,6 @@ "This gopher hole was dug using Burrower v" burrower-version "\n" "Powered by Chicken Scheme!")) - ;;; Server loop ;; We don't yet use worker threads here to handle requests, @@ -69,12 +68,22 @@ ;;; Selector type inference -(define (has-suffix? selector . suffixes) - (if (null? suffixes) +(define (true-for-one? predicate values) + (if (null? values) #f - (if (string-suffix? (car suffixes) selector) + (if (predicate (car values)) #t - (apply has-suffix? selector (cdr suffixes))))) + (true-for-one? predicate (cdr values))))) + +(define (has-suffix? selector . suffixes) + (true-for-one? (lambda (suffix) + (string-suffix? suffix selector)) + suffixes)) + +(define (has-prefix? selector . prefixes) + (true-for-one? (lambda (prefix) + (string-prefix? prefix selector)) + prefixes)) (define (infer-selector-type selector) (let ((l (string-downcase selector))) @@ -83,6 +92,7 @@ ((has-suffix? l ".txt" ".org" ".md") 0) ((has-suffix? l ".png" ".jpg" ".gif" ".bmp" ".tif" ".tga") 'I) ((has-suffix? l "?.scm") 7) + ((has-prefix? l "url:" "/url:") 'h) (else 9)))) @@ -96,6 +106,7 @@ ((1) (serve-directory selector config)) ((0) (serve-text-file selector config)) ((7) (serve-query selector arguments config)) + ((h) (serve-url selector config)) (else (serve-binary-file selector config))))) (define (serve-directory selector config) @@ -158,6 +169,17 @@ (error "Invalid query." selector arguments)))) +(define (serve-url selector config) + (let ((url (substring selector 4))) + (print + "If you are seeing this page, your gopher browser does not\r\n" + "properly support URL directory entries or cannot follow such\r\n" + "links. To view the link you requested, use a web browser to\r\n" + "open the follwing url:\r\n" + "\r\n" + url "\r\n"))) + + ;;; Index rendering (define (serve-info-records string) @@ -177,7 +199,9 @@ (('shell command) (serve-shell-command command dir-selector config)) (('eval expression) (serve-expression expression dir-selector config)) (('url display-string url) - (print #\h display-string "\tURL:" url "\tfake\t80\r")) + (print #\h display-string "\tURL:" url + "\t" (config-host config) + "\t" (config-port config) "\r")) ((type display-string selector host port) (print type display-string "\t" selector "\t" host "\t" port "\r")) ((type display-string selector host)