X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=scratchy.git;a=blobdiff_plain;f=burrower.scm;h=2886a07d75f1ee211f2e3eaca2edbe7294d2e6cd;hp=4d00253086b5bb7c3b6ad02037c9c293d8b0ae72;hb=42a6a2732ebb0484460f089ca87acfe74d7fbb6b;hpb=d7925f64bd746c0cdb935654a335a9c8443dd422 diff --git a/burrower.scm b/burrower.scm index 4d00253..2886a07 100644 --- a/burrower.scm +++ b/burrower.scm @@ -18,14 +18,14 @@ ;;; Global constants -(define gopher-index-file-name "index") +(define gopher-index-filename "index") (define burrower-version "1.0.0") (define burrower-footer (conc "\n" "--------------------------------------------------\n" - "This gopher hole was dug using Burrower v" burrower-version "\n" + "This gopher hole was dug using Burrower v" burrower-version ".\n" "Powered by Chicken Scheme!")) ;;; Server loop @@ -38,6 +38,7 @@ (define-record config root-dir host port display-footer) (define (run-server config) + (set-buffering-mode! (current-output-port) #:line) (print "Gopher server listening on port " (config-port config) " ...") (let ((listener (tcp-listen (config-port config)))) (let server-loop () @@ -91,7 +92,7 @@ ((or (= (string-length l) 0) (string-suffix? "/" l)) 1) ((has-suffix? l ".txt" ".org" ".md") 0) ((has-suffix? l ".png" ".jpg" ".gif" ".bmp" ".tif" ".tga") 'I) - ((has-suffix? l "?.scm") 7) + ((has-suffix? l "?.scm" "%3f.scm") 7) ((has-prefix? l "url:" "/url:") 'h) (else 9)))) @@ -109,12 +110,17 @@ ((h) (serve-url selector config)) (else (serve-binary-file selector config))))) +(define (legal-filename? filename config) + (and (string-prefix? (config-root-dir config) + (normalize-pathname filename)) + (regular-file? filename))) + (define (serve-directory selector config) - (let ((file-name (make-pathname (list (config-root-dir config) selector) - gopher-index-file-name))) - (if (regular-file? file-name) + (let ((filename (make-pathname (list (config-root-dir config) selector) + gopher-index-filename))) + (if (legal-filename? filename config) (begin - (with-input-from-file file-name + (with-input-from-file filename (lambda () (let loop ((c (peek-char))) (if (eof-object? c) @@ -128,24 +134,27 @@ (serve-info-records (read-line))) (loop (peek-char))))))) (if (config-display-footer config) - (serve-info-records burrower-footer))) + (serve-info-records burrower-footer)) + (print ".\r")) (error "Index file not found.")))) (define (serve-text-file selector config) - (let ((file-name (make-pathname (config-root-dir config) selector))) - (if (regular-file? file-name) - (with-input-from-file file-name - (lambda () - (for-each - (lambda (line) - (print line "\r")) - (read-lines)))) - (error "File not found." file-name)))) + (let ((filename (make-pathname (config-root-dir config) selector))) + (if (legal-filename? filename config) + (begin + (with-input-from-file filename + (lambda () + (for-each + (lambda (line) + (print line "\r")) + (read-lines)))) + (print ".\r")) + (error "File not found." filename)))) (define (serve-binary-file selector config) - (let ((file-name (make-pathname (config-root-dir config) selector))) - (if (regular-file? file-name) - (with-input-from-file file-name + (let ((filename (make-pathname (config-root-dir config) selector))) + (if (legal-filename? filename config) + (with-input-from-file filename (lambda () (let loop ((b (read-byte))) (if (eof-object? b) @@ -153,13 +162,14 @@ (begin (write-byte b) (loop (read-byte))))))) - (error "File not found." file-name)))) + (error "File not found." filename)))) (define (serve-query selector arguments config) - (let ((file-name (make-pathname (config-root-dir config) selector))) - (if (and (regular-file? file-name) + (let ((filename (make-pathname (config-root-dir config) + (string-translate* selector '(("%3f" . "?")))))) + (if (and (legal-filename? filename config) (= (length arguments) 1)) - (with-input-from-file file-name + (with-input-from-file filename (lambda () (serve-info-records (with-selector-dir @@ -172,12 +182,18 @@ (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"))) + "Redirection" + "" + "" + "

If you are seeing this page, your gopher browser does not " + "properly support URL directory entries or cannot follow such " + "links.

" + "

If you are viewing this page using a web browser, you should " + "be redirected shortly. Otherwise, you can manually open the " + "the follwing url:\n" + "\n" + "" url "\n" + ""))) ;;; Index rendering @@ -291,9 +307,9 @@ (config-port-set! config (string->number (caddr args)))) (run-server config))))))) -(main) +;; (main) -;; (define (test) -;; (run-server (make-config "gopher-root" "localhost" 70 #t))) +(define (test) + (run-server (make-config "gopher-root" "localhost" 70 #t))) ;; (test)