Source code for kiel.protocol.request

import binascii
import hashlib
import os
import socket
import struct

from six import BytesIO

from kiel.constants import CLIENT_ID, API_VERSION, API_KEYS

from .part import Part
from .primitives import Int16, Int32, String


machine_hash = hashlib.md5()
machine_hash.update(socket.gethostname().encode("UTF-8"))
machine_bytes = machine_hash.digest()[0:4]

#: Seed value for correlation IDs, based on the machine name and PID
last_id = (int(binascii.hexlify(machine_bytes), 16) + os.getpid() & 0xffffff)


[docs]def generate_correlation_id(): """ Creates a new ``correlation_id`` for requests. Increments the ``last_id`` value so each generated ID is unique for this machine and process. """ global last_id last_id += 1 return last_id
[docs]class Request(Part): """ Base class for all requests sent to brokers. A specialized subclass of ``Part`` with attributes for correlating responses and prefacing payloads with client/api metadata. """ api = None def __init__(self, **kwargs): super(Request, self).__init__(**kwargs) self.client_id = CLIENT_ID self.api_key = API_KEYS[self.api] self.api_version = API_VERSION self.correlation_id = generate_correlation_id()
[docs] def serialize(self): """ Returns a bytesring representation of the request instance. Prefaces the output with certain information:: api_key => Int16 api_version => Int16 correlation_id => Int32 client_id => String Since this is a ``Part`` subclass the rest is a matter of appending the result of a ``render()`` call. """ buff = BytesIO() preamble_parts = ( ("api_key", Int16), ("api_version", Int16), ("correlation_id", Int32), ("client_id", String), ) preamble_format, data = self.render(preamble_parts) payload_format, payload_data = self.render() format = "".join(["!", preamble_format, payload_format]) data.extend(payload_data) buff.write(struct.pack(format, *data)) return buff.getvalue()