Scripts now evaluated with cwd set to their location.
[rags.git] / rags.scm
index 177c7b5..b60a121 100644 (file)
--- a/rags.scm
+++ b/rags.scm
@@ -63,6 +63,9 @@
 (define (redirect-permanent new-uri)
   (print "30 " (uri->string new-uri) "\r"))
 
+(define (serve-query prompt)
+  (print "10 " prompt "\r"))
+
 (define (uri-lacks-trailing-slash? uri)
   (not (string-null? (last (uri-path uri)))))
 
     (if (directory-exists? path)
         (make-pathname path "index.gmi")
         path)))
+
+(define (ext->mime ext)
+  (let* ((mime-detected (assoc ext file-types)))
+    (cdr (if mime-detected
+             mime-detected
+             (assoc "txt" file-types)))))
+
+(define (serve-document-header mime)
+  (print "20 " (string-intersperse mime ";") "\r"))
     
 (define (serve-document config uri)
   (let* ((path (document-path config uri))
          (ext (pathname-extension path))
-         (mime-detected (assoc ext file-types))
-         (mime (if mime-detected mime-detected (assoc "txt" file-types)))
-         (mime-type (cadr mime)))
-    (print "20 " (string-intersperse (cdr mime) ";") "\r")
+         (mime (ext->mime ext)))
+    (serve-document-header mime)
     (cond 
      ((file-executable? path)
       (serve-text-dynamic path)) ; Binary-files can also be generated here, but the source is dynamic text
-     ((string-prefix? "text/" mime-type)
+     ((string-prefix? "text/" (car mime))
       (serve-text-plain path))
      (else (serve-binary path)))))
 
 
 (define (serve-script config uri)
   ;; Scripts are responsible for the entire response, including header
-  (let ((path (document-path config uri)))
-    (apply (eval (with-input-from-file path read))
-           (list uri))))
+  (let* ((path (document-path config uri))
+         (proc (eval (with-input-from-file path read))))
+    (with-current-working-directory
+     (pathname-directory (document-path config uri))
+     (lambda ()
+       (apply proc (list uri))))))
 
 (define (with-current-working-directory directory thunk)
   (let ((old-wd (current-directory))