aboutsummaryrefslogtreecommitdiff
path: root/weeb/main.scm
diff options
context:
space:
mode:
Diffstat (limited to 'weeb/main.scm')
-rw-r--r--weeb/main.scm86
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)

© 2015 - 2026 Jakob L. Kreuze