private HTTPExchange createExchangeAndSend(AbstractBody request) {
        assertLocked();

        HTTPResponse response = httpSender.send(cmParams, request);
        HTTPExchange exch = new HTTPExchange(request, response);
        exchanges.add(exch);
        notEmpty.signalAll();

        // If no timeout is scheduled, begin one.
        if(timeoutFuture == null)
            resetTimeout();

        return exch;
    }