'Send the protobuf to the server.
Args:
rdf_value: The RDFvalue to return.
request_id: The id of the request this is a response to.
response_id: The id of this response.
priority: The priority of this message, used to jump the scheduling queue.
session_id: The session id of the flow.
message_type: The contents of this message, MESSAGE, STATUS, ITERATOR or
RDF_VALUE.
name: The name of the client action that sends this response.
require_fastpoll: If set, this will set the client to fastpoll mode after
sending this message.
ttl: The time to live of this message.
blocking: If the output queue is full, block until there is space.
task_id: The task ID that the request was queued at. We send this back to
the server so it can de-queue the request.
Raises:
RuntimeError: An object other than an RDFValue was passed for sending.'

def SendReply(self, rdf_value=None, request_id=None, response_id=None, priority=None, session_id='W:0', message_type=None, name=None, require_fastpoll=None, ttl=None, blocking=True, task_id=None):

    if (not isinstance(rdf_value, rdfvalue.RDFValue)):
        raise RuntimeError('Sending    objects    other    than    RDFValues    not    supported.')
    message = rdf_flows.GrrMessage(session_id=session_id, task_id=task_id, name=name, response_id=response_id, request_id=request_id, priority=priority, require_fastpoll=require_fastpoll, ttl=ttl, type=message_type)
    if rdf_value:
        message.payload = rdf_value
    serialized_message = message.SerializeToString()
    self.ChargeBytesToSession(session_id, len(serialized_message))
    if (message.type == rdf_flows.GrrMessage.Type.STATUS):
        rdf_value.network_bytes_sent = self.sent_bytes_per_flow[session_id]
        del self.sent_bytes_per_flow[session_id]
        message.payload = rdf_value
    try:
        self.QueueResponse(message, priority=message.priority, blocking=blocking)
    except Queue.Full:
        if (not blocking):
            raise
        logging.info('Queue    is    full,    dropping    messages.')
