        (dn evt val)))))
 
 (defn- exchange
-  [app dn conn opts]
-  (let [state   (atom (initial-exchange-state conn dn opts))
+  [app dn conn address-info opts]
+  (let [state   (atom (initial-exchange-state conn dn address-info opts))
         next-up (app (mk-downstream-fn state dn))]
     ;; Track the upstream
     (swap! state #(assoc % :upstream next-up))


(defrecord ExchangeState
    [connection
     upstream
     downstream
     next-up-fn

   #(stream-or-finalize-request state evt val %)))

(defn- handle-request
  [state _ [hdrs body :as request] current-state]
  (let [hdrs         (merge (.address-info current-state) hdrs)
        keepalive?   (keepalive-request? request)
        expects-100? (expecting-100? request)
        head?        (= "HEAD" (hdrs :request-method))
        chunked?     (= :chunked body)
