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:
1999-08-07 17:55:59 +00:00
parent 0a25f68f43
commit e1c4504ede
13 changed files with 898 additions and 7 deletions

43
src/main/connection.cl Normal file
View 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))))