X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=rags.scm;h=b60a1215b8274f9ed6d9eef53272c91d2175dc74;hb=e7fdd07ebdf69cc9565345e1f20b429b42fcc3f9;hp=c3ac60a1ef9ee4ae4fb1f2bfdf0fb188a86dc5eb;hpb=aaf0af208b551e46ded385334e40e8cde6b0d90f;p=rags.git diff --git a/rags.scm b/rags.scm index c3ac60a..b60a121 100644 --- a/rags.scm +++ b/rags.scm @@ -26,7 +26,15 @@ (define file-types '(("gmi" "text/gemini" "charset=utf-8") ("txt" "text/plain" "charset=utf-8") - ("xml" "text/xml" "charset=utf-8"))) + ("csv" "text/csv" "charset=utf-8") + ("html" "text/html" "charset=utf-8") + ("xml" "text/xml" "charset=utf-8") + ("pdf" "application/pdf") + ("zip" "application/zip") + ("jpg" "image/jpeg") + ("jpeg" "image/jpeg") + ("png" "image/png") + ("mp3" "audio/mpeg"))) (define (process-request config request-line) (let ((uri (uri-normalize-path-segments (absolute-uri request-line)))) @@ -44,6 +52,8 @@ ((and (document-path-directory? config uri) (uri-lacks-trailing-slash? uri)) (redirect-permanent (uri-with-trailing-slash uri))) + ((document-script? config uri) + (serve-script config uri)) (else (serve-document config uri))))) @@ -53,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))))) @@ -62,6 +75,12 @@ (define (document-available? config uri) (file-exists? (document-path config uri))) +(define (document-script? config uri) + (let ((path (document-path config uri))) + (and (file-exists? path) + (file-executable? path) + (equal? (pathname-extension path) "scm")))) + (define (document-path-directory? config uri) (directory-exists? (document-path-raw config uri))) @@ -74,18 +93,25 @@ (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))))) @@ -131,6 +157,15 @@ (close-output-port out-port)))))) (else (error "Unknown element type.")))) +(define (serve-script config uri) + ;; Scripts are responsible for the entire response, including header + (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)) (result 'none))