- (case (infer-selector-type selector)
- ((1) (serve-directory selector config))
- ((0) (serve-text-file selector config))
- ((7) (serve-query selector arguments remote-ip config))
- (else (serve-binary-file selector config)))))
-
-(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)
+ (if (string-contains selector ":")
+ (let ((l (string-split selector ":")))
+ (serve-script (car l) (cdr l) config))
+ (case (infer-selector-type selector)
+ ((1) (serve-directory-file selector config))
+ ((7) (let ((l (string-split selector "?")))
+ (serve-script (car l) arguments config)))
+ ((0) (serve-text-file selector config))
+ ((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))
+ (file-exists? filename)
+ (not (directory-exists? filename))
+ (file-readable? filename)))
+
+(define (legal-script-filename? filename config)
+ (and (legal-filename? filename config)
+ (string-suffix? ".scm" filename)
+ (file-executable? filename)))
+
+(define (serve-directory-file selector config)
+ (let ((filename (make-pathname (list (config-root-dir config) selector)
+ gopher-index-filename)))
+ (if (legal-filename? filename config)