diff options
Diffstat (limited to 'weeb/main.scm')
| -rw-r--r-- | weeb/main.scm | 86 |
1 files changed, 80 insertions, 6 deletions
diff --git a/weeb/main.scm b/weeb/main.scm index 4c7e69f..fa4e9fc 100644 --- a/weeb/main.scm +++ b/weeb/main.scm @@ -23,10 +23,85 @@ #:use-module (srfi srfi-11) ;; Temporary, probably #:use-module (weeb fcgi) #:use-module (weeb request) + #:use-module (weeb response) #:use-module (weeb router) #:use-module (weeb struct) #:export (weeb main)) +(define status-codes + '((100 . "Continue") + (101 . "Switching Protocols") + (102 . "Processing") + (200 . "OK") + (201 . "Created") + (202 . "Accepted") + (203 . "Non-Authoritative Information") + (204 . "No Content") + (205 . "Reset Content") + (206 . "Partial Content") + (207 . "Multi-Status") + (208 . "Already Reported") + (226 . "IM Used") + (300 . "Multiple Choices") + (301 . "Moved Permanently") + (302 . "Found") + (303 . "See Other") + (304 . "Not Modified") + (305 . "Use Proxy") + (306 . "Reserved") + (307 . "Temporary Redirect") + (308 . "Permanent Redirect") + (400 . "Bad Request") + (401 . "Unauthorized") + (402 . "Payment Required") + (403 . "Forbidden") + (404 . "Not Found") + (405 . "Method Not Allowed") + (406 . "Not Acceptable") + (407 . "Proxy Authentication Required") + (408 . "Request Timeout") + (409 . "Conflict") + (410 . "Gone") + (411 . "Length Required") + (412 . "Precondition Failed") + (413 . "Request Entity Too Large") + (414 . "Request-URI Too Long") + (415 . "Unsupported Media Type") + (416 . "Requested Range Not Satisfiable") + (417 . "Expectation Failed") + (422 . "Unprocessable Entity") + (423 . "Locked") + (424 . "Failed Dependency") + (426 . "Upgrade Required") + (428 . "Precondition Required") + (429 . "Too Many Requests") + (431 . "Request Header Fields Too Large") + (500 . "Internal Server Error") + (501 . "Not Implemented") + (502 . "Bad Gateway") + (503 . "Service Unavailable") + (504 . "Gateway Timeout") + (505 . "HTTP Version Not Supported") + (506 . "Variant Also Negotiates (Experimental)") + (507 . "Insufficient Storage") + (508 . "Loop Detected") + (510 . "Not Extended") + (511 . "Network Authentication Required"))) + +(define (write-response response) + (with-accessors (response code headers body) + (fcgi-display (format #f "Status: ~a ~a\r\n" code (assv-ref status-codes code))) + (let ((headers (if (assoc 'content-type headers) + headers + `((content-type . "text/html") ,@headers)))) + (fcgi-display + (string-join (map (match-lambda + ((key . value) (format #f "~a: ~a" key value))) + headers) + "\r\n"))) + (fcgi-display "\r\n\r\n") + (fcgi-display body))) + (define (receive-request) (define string->method (match-lambda @@ -51,13 +126,11 @@ (make-struct <request> method uri '() headers (fcgi-read)))) (define (show-headers request) - ;; TODO: Return a response object. (with-accessors (request headers) - (fcgi-display "Content-type: text/html\r\n\r\n") - (fcgi-display (format #f "~a" headers)))) + (format #f "~a" headers))) (define (show-message request message) - (fcgi-display (format #f "~a" message))) + (format #f "~a" message)) (define-router router ("/headers" (GET) show-headers) @@ -65,7 +138,8 @@ (define (run-server) (while (zero? (fcgi-accept)) - (let ((request (receive-request))) - (iter-routes request router)))) + (let* ((request (receive-request)) + (response (iter-routes request router))) + (write-response (any->response response))))) (run-server) |