Hello world/Web server: Difference between revisions

Content added Content deleted
(Added Common Lisp header)
(→‎{{header|Common Lisp}}: Added the Common Lisp example)
Line 206: Line 206:


=={{header|Common Lisp}}==
=={{header|Common Lisp}}==

Here's the example with a pre-built server:

<lang lisp>(ql:quickload :hunchentoot)
(defpackage :hello-web (:use :cl :hunchentoot))
(in-package :hello-web)

(define-easy-handler (hello :uri "/") () "Goodbye, World!")

(defparameter *server* (hunchentoot:start (make-instance 'hunchentoot:easy-acceptor :port 8080)))</lang>

----

Here's an example of doing everything manually

<lang lisp>(ql:quickload :usocket)
(defpackage :hello-web-manual (:use :cl :usocket))
(in-package :hello-web-manual)

(defun crlf (&optional (stream *standard-output*))
(write-char #\return stream)
(write-char #\linefeed stream)
(values))

(defun ln (string &optional (stream *standard-output*))
(write-string string stream)
(crlf stream))

(defun read-all (stream)
(loop for char = (read-char-no-hang stream nil :eof)
until (or (null char) (eq char :eof)) collect char into msg
finally (return (values msg char))))

(defun serve (port &optional (log-stream *standard-output*))
(let ((connections (list (socket-listen "127.0.0.1" port :reuse-address t))))
(unwind-protect
(loop (loop for ready in (wait-for-input connections :ready-only t)
do (if (typep ready 'stream-server-usocket)
(push (socket-accept ready) connections)
(let* ((stream (socket-stream ready)))
(read-all stream)
(format log-stream "Got message...~%")
(mapc (lambda (line) (ln line stream))
(list "HTTP/1.1 200 OK"
"Content-Type: text/plain; charset=UTF-8"
""
"Hello world!"))
(socket-close ready)
(setf connections (remove ready connections))))))
(loop for c in connections do (loop while (socket-close c))))))

(serve 8080)</lang>


=={{header|D}}==
=={{header|D}}==