10 (define gopher-root "./gopher-root")
11 (define index-file-name "index")
12 (define gopher-server-hostname "egan.icytree.org")
13 (define gopher-server-port 70)
16 (let ((listener (tcp-listen gopher-server-port)))
17 (print "Gopher server listening on port " gopher-server-port " ...")
18 (let-values (((in-port out-port) (tcp-accept listener)))
19 (let* ((line (read-line in-port))
20 (selector (string-trim-both line)))
21 (let-values (((local-ip remote-ip) (tcp-addresses in-port)))
22 (print "Accepted connection from " remote-ip
23 " on " (seconds->string)))
24 (with-output-to-port out-port
27 (if (= (string-length selector) 0)
31 gopher-server-hostname
33 (print "... retrieved selector '" selector "'. Closing connection."))
34 (close-input-port in-port)
35 (close-output-port out-port))
39 ;;; Selector retrieval
41 (define (retrieve-selector selector gopher-root server-host server-port)
42 (if (string-suffix? "/" selector)
43 (retrieve-index-file (make-pathname gopher-root (make-pathname selector index-file-name))
46 (retrieve-text-file (make-pathname gopher-root selector)
50 (define (retrieve-index-file index-file-name server-host server-port)
51 (with-input-from-file index-file-name
57 (define (retrieve-text-file file-name server-host server-port)
58 (with-input-from-file file-name
67 (define entry-type car)
69 (define entry-name cadr)
71 (define (has-selector? entry) (>= (length entry) 3))
73 (define (entry-selector entry) (list-ref entry 2))
75 (define (has-host? entry) (>= (length entry) 4))
77 (define (entry-host entry) (list-ref entry 3))
79 (define (has-port? entry) (>= (length entry) 5))
81 (define (entry-port entry) (list-ref entry 4))
83 (define (render-entry entry default-selector default-host default-port)
84 (let ((name-string (entry-name entry)))
86 (lambda (name-string-line)
87 (print* (entry-type entry) name-string-line)
88 (print* "\t" (if (has-selector? entry)
89 (entry-selector entry)
91 (print* "\t" (if (has-host? entry)
94 (print* "\t" (if (has-port? entry)
98 (string-split name-string "\n" #t))))
100 (define (render-index index this-host this-port)
103 (if (eq? (entry-type entry) 'i)
104 (render-entry entry "fake.selector" "fake.host" 1)
105 (render-entry entry "" this-host this-port)))