'Request the roster from the server.
:param block: Specify if the roster request will block until a
response is received, or a timeout occurs.
Defaults to ``True``.
:param timeout: The length of time (in seconds) to wait for a response
before continuing if blocking is used.
Defaults to
:attr:`~sleekxmpp.xmlstream.xmlstream.XMLStream.response_timeout`.
:param callback: Optional reference to a stream handler function. Will
be executed when the roster is received.
Implies ``block=False``.'

def get_roster(self, block=True, timeout=None, callback=None):

    iq = self.Iq()
    iq[u'type'] = u'get'
    iq.enable(u'roster')
    if (u'rosterver' in self.features):
        iq[u'roster'][u'ver'] = self.client_roster.version
    if ((not block) or (callback is not None)):
        block = False
        if (callback is None):
            callback = (lambda resp: self.event(u'roster_update', resp))
        else:
            orig_cb = callback
            def wrapped(resp):
                self.event(u'roster_update', resp)
                orig_cb(resp)
            callback = wrapped
    response = iq.send(block, timeout, callback)
    if block:
        self.event(u'roster_update', response)
        return response
