From 2cae173de9153ab87b16d722127754bac9a007c4 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Fri, 8 Feb 2008 16:59:45 +0100 Subject: first working server --- src/tekuti | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/src/tekuti b/src/tekuti index b70b64c..4b7409a 100755 --- a/src/tekuti +++ b/src/tekuti @@ -29,4 +29,59 @@ exec guile $GUILE_FLAGS -s $0 "$@" ;;; Code: -(top-repl) +(use-modules (ice-9 rdelim)) +(debug-enable 'backtrace) + +(define *host* "127.0.0.1") +(define *port* 8081) +(define *backlog* 5) + +(define *socket* (socket PF_INET SOCK_STREAM 0)) +(bind *socket* AF_INET (inet-aton *host*) *port*) +(listen *socket* *backlog*) + +(define (dbg fmt . args) + (apply format (current-error-port) fmt args)) + +(define (strip-headers socket) + (define (read-line*) + (let ((line (read-line socket))) + (if (eof-object? line) + (error "unexpected eof") + line))) + (let lp ((keys '()) (values '())) + (let ((k (read-line*))) + (if (string=? k "end") + (reverse (map cons keys values)) + (lp (cons k keys) (cons (read-line*) values)))))) + +(define (output-headers headers) + (for-each + (lambda (k v) + (format #t "~a\n~a\n" k v)) + (map car headers) (map cdr headers)) + (display "end\n")) + +(define (handle-request headers post-data) + (output-headers '(("Status" . "200 OK") + ("Content-Type" . "text/html"))) + (display "hello

hello world

")) + +(define (connection-received socket sockaddr) + (let ((headers (strip-headers socket)) + (post-data "")) ;; blocks: (read-delimited "" socket))) + (dbg "~a" headers) + (with-output-to-port socket + (lambda () + (handle-request headers post-data))) + (close-port socket))) + +(define (event-loop) + (pk 'listening) + (let ((pair (accept *socket*))) + (pk pair) + (connection-received (car pair) (cdr pair)) + (pk 'done) + (event-loop))) + +(event-loop) -- cgit v1.2.3-54-g00ecf