Keeps the lease alive by streaming keep alive requests from the client
        to the server and streaming keep alive responses from the server to
        the client.

        :returns: Response header.
        :rtype: instance of :class:`txaioetcd.Header`

def refresh(self):
        """
        Keeps the lease alive by streaming keep alive requests from the client
        to the server and streaming keep alive responses from the server to
        the client.

        :returns: Response header.
        :rtype: instance of :class:`txaioetcd.Header`
        """
        if self._expired:
            raise Expired()

        obj = {
            # ID is the lease ID for the lease to keep alive.
            u'ID': self.lease_id,
        }
        data = json.dumps(obj).encode('utf8')

        url = u'{}/v3alpha/lease/keepalive'.format(self._client._url).encode()
        response = yield treq.post(url, data, headers=self._client._REQ_HEADERS)

        obj = yield treq.json_content(response)

        if u'result' not in obj:
            raise Exception('bogus lease refresh response (missing "result") in {}'.format(obj))

        ttl = obj[u'result'].get(u'TTL', None)
        if not ttl:
            self._expired = True
            raise Expired()

        header = Header._parse(obj[u'result'][u'header']) if u'header' in obj[u'result'] else None

        self._expired = False

        returnValue(header)