This is the first checked-in completely working version. It contains
nearly all concepts and simple implementations thereof needed to get a simple HTTP/0.9 "compliant" server working (there are some hacks needed that we don't yet provide, since the correct things will be added shortly, like complete HTTP/1.1 request parsing. The hacks needed are provided as part of the basic HTTP/0.9 server demo in src/test/basic-demo.cl). Further work is needed to clean up some things, Entity and Resource handling needs to be implemented right and less "naive" (the current implementations are just simple place-holders to get things up and running). Connections need to have knowledge of client identity (passed from the driver, this is implementation-specific stuff). Logging needs to be implemented (probably as server mixins). Condition handling needs to generate better responses for HTTP/0.9, and the division between condition handling and normal handling needs to be documented/rethought. Content generation is totally missing currently and needs to be implemented. If this is all in place, an HTTP/1.0 conforming server should be possible, and after porting the drivers to ACL and LW, we can make a first release.
This commit is contained in:
43
src/main/connection.cl
Normal file
43
src/main/connection.cl
Normal file
@ -0,0 +1,43 @@
|
||||
;;;; CLASH --- The Common Lisp Adaptable Simple HTTP server
|
||||
;;;; This is copyrighted software. See documentation for terms.
|
||||
;;;;
|
||||
;;;; connection.cl --- Object to identify a connection.
|
||||
;;;;
|
||||
;;;; Checkout Tag: $Name$
|
||||
;;;; $Id$
|
||||
|
||||
(in-package :CLASH)
|
||||
|
||||
;;;; %File Description:
|
||||
;;;;
|
||||
;;;;
|
||||
;;;;
|
||||
|
||||
(defconstant +connection-states+
|
||||
'(:fresh
|
||||
:read-request :processing-request :write-response :idle
|
||||
:finished :closed)
|
||||
"List of states that a connection can be in.")
|
||||
|
||||
(defclass connection ()
|
||||
((state :initarg :stage :initform :fresh :accessor connection-state)))
|
||||
|
||||
(defgeneric connection-stream (connection))
|
||||
|
||||
(defgeneric close-connection (connection))
|
||||
|
||||
(defmethod close-connection :after ((connection connection))
|
||||
(setf (connection-state connection) :closed))
|
||||
|
||||
(defclass simple-connection (connection)
|
||||
((stream :initarg :stream :reader connection-stream)))
|
||||
|
||||
(defmethod close-connection ((connection simple-connection))
|
||||
(handler-case
|
||||
(close (connection-stream connection))
|
||||
(error (condition)
|
||||
#-CLASH-DEBUG nil
|
||||
#+CLASH-DEBUG
|
||||
(format t "~&;;; At ~D Error closing connection ~A:~%;;; ~A~&"
|
||||
(get-internal-real-time)
|
||||
connection condition))))
|
||||
Reference in New Issue
Block a user