anchor.diff:     (headers ((reply a)) :accessorp t)
      (write-headers ((reply a)))
      (headers-written-p ((reply a)) :accessorp t)
  +   (keep-alive-p ((reply a)) :accessorp t)
  +   (http-server ((reply a)))
      (socket ((reply a))))
     (:prefix reply-))
   
  
positive.code:   ((driver :initarg :driver :accessor http-server-driver)
     (connections :initform (make-hash-table) :accessor http-server-connections)))
  
  (defmethod on-server-connection ((driver http-server-driver) socket)
    (setf (gethash socket (http-server-connections driver))
          (cons (make-instance 'request
                               :socket socket
                               :external-format (server-external-format-in *server*))
                (make-instance 'reply :socket socket))))
  
  (defmethod on-socket-data ((driver http-server-driver) data
                             &aux
  
negative.code:   ((headers :accessor reply-headers :initform nil)
     (status :accessor reply-status :initform 200)
     (socket :reader reply-socket :initarg :socket)
     (headers-written-p :accessor reply-headers-written-p :initform nil)
     (http-server :reader reply-http-server :initarg :http-server)
     (keep-alive-p :accessor reply-keep-alive-p :initform nil)))
  
  (defmethod close ((reply reply) &key abort)
    (unless (or (reply-headers-written-p reply) abort)
      (write-headers reply))
    (if (reply-keep-alive-p reply)
        ;; TODO - reuse request/reply objects by reinitializing?
        ;;        (use shared-initialize with t for slots)
        (progn
          (write-sequence +crlf+ (reply-socket reply))
          (new-request (reply-http-server reply)
                       (reply-socket reply)))
        (close (reply-socket reply) :abort abort)))
  
  (defun reply-headers* ()
    (reply-headers *reply*))
  