anchor.diff:     (external-format-in :initarg :external-format-in :reader socket-external-format-in)
      (external-format-out :initarg :external-format-out :reader socket-external-format-out)
      (binary-p :initarg :binaryp :accessor socket-binary-p)
  -   (close-after-drain-p :initform nil :accessor socket-close-after-drain-p)))
  +   (close-after-drain-p :initform nil :accessor socket-close-after-drain-p)
  +   (readingp :initform nil :accessor socket-reading-p)
  +   (writingp :initform nil :accessor socket-writing-p)))
   (defun make-socket (driver &key
                       (buffer-size *max-buffer-size*)
                       (external-format-in *default-external-format*)
  
positive.code: (defun finish-close (socket)
    (when-let (evbase (and (slot-boundp socket 'internal-socket)
                           (socket-event-base socket)))
      (iolib:remove-fd-handlers evbase
                               (iolib:socket-os-fd (socket-internal-socket socket))
                               :write t)
      (when-let (server (socket-server socket))
        (remhash socket (server-connections server)))
      (close (socket-internal-socket socket) :abort t)
  
negative.code: 
  ;;; Reading
  (defun socket-paused-p (socket)
    (not (socket-reading-p socket)))
  
  (defun socket-pause (socket &key timeout)
    (unless (socket-paused-p socket)
      (iolib:remove-fd-handlers (socket-event-base socket)
                                (iolib:socket-os-fd (socket-internal-socket socket))
                                :read t)
      (setf (socket-reading-p socket) nil))
    (when timeout
      (add-timer (curry #'socket-resume socket) timeout :one-shot t)))
  
  (defun socket-resume (socket)
    (when (socket-paused-p socket)
      (iolib:set-io-handler (socket-event-base socket)
                            (iolib:socket-os-fd (socket-internal-socket socket))
                            :read (lambda (&rest ig)
                                    (declare (ignore ig))
                                    ;; NOTE - The redundant errors are there for reference.
                                    (handler-bind (((or iolib:socket-connection-reset-error
                                                        end-of-file
                                                        error)
                                                    (lambda (e)
                                                      (on-socket-error (socket-driver socket) socket e))))
                                      (restart-case
                                          (let* ((buffer (socket-read-buffer socket))
                                                 (bytes-read
                                                  (nth-value
                                                   1 (iolib:receive-from (socket-internal-socket socket) :buffer buffer))))
                                            (when (zerop bytes-read)
                                              (error 'end-of-file))
                                            (incf (socket-bytes-read socket) bytes-read)
                                            (let ((data (if (socket-binary-p socket)
                                                            (subseq buffer 0 bytes-read)
                                                            (flex:octets-to-string buffer
                                                                                   :start 0
                                                                                   :end bytes-read
                                                                                   :external-format (socket-external-format-in socket)))))
                                              (on-socket-data (socket-driver socket) socket data)))
                                        (continue () nil)
                                        (drop-connection () (close socket :abort t))))))
      (setf (socket-reading-p socket) t)))
  
  ;;; Writing
  (defun content->buffer (socket content)
  