Ejemplo n.º 1
0
def _pack_pid(val) -> bytes:
    data = bytes([TAG_PID_EXT]) + \
           _pack_atom(val.node_name_) + \
           util.to_u32(val.id_) + \
           util.to_u32(val.serial_) + \
           bytes([val.creation_])
    return data
Ejemplo n.º 2
0
def _pack_ref(val) -> bytes:
    data = bytes([TAG_NEWER_REF_EXT]) \
           + util.to_u16(len(val.id_) // 4) \
           + _pack_atom(val.node_name_) \
           + util.to_u32(val.creation_) \
           + val.id_
    return data
Ejemplo n.º 3
0
 def _send_name(self):
     """ Create and send first welcome packet. """
     pkt = b'n' + \
           bytes([dist_protocol.DIST_VSN, dist_protocol.DIST_VSN]) + \
           util.to_u32(self.get_node().node_opts_.dflags_) + \
           bytes(self.node_name_, "latin-1")
     LOG.info("send_name %s (name=%s)", pkt, self.node_name_)
     self._send_packet2(pkt)
Ejemplo n.º 4
0
def _pack_tuple(val, encode_hook):
    if len(val) < 256:
        data = bytes([TAG_SMALL_TUPLE_EXT, len(val)])
    else:
        data = bytes([TAG_LARGE_TUPLE_EXT]) + util.to_u32(len(val))

    for item in val:
        data += term_to_binary_2(item, encode_hook)

    return data
Ejemplo n.º 5
0
def _pack_list(lst, tail, encode_hook):
    if len(lst) == 0:
        return bytes([TAG_NIL_EXT])

    data = b''
    for item in lst:
        data += term_to_binary_2(item, encode_hook)

    tail = term_to_binary_2(tail, encode_hook)
    return bytes([TAG_LIST_EXT]) + util.to_u32(len(lst)) + data + tail
Ejemplo n.º 6
0
def _pack_str(val):
    str_bytes = bytes(val, "utf8")
    len_str_bytes = len(str_bytes)
    len_val = len(val)

    if _can_be_a_bytestring(val) and len_str_bytes <= 65535:
        # same length as byte length
        header = bytes([TAG_STRING_EXT]) + util.to_u16(len_str_bytes)
        return header + str_bytes
    else:
        # contains unicode characters! must be encoded as a list of ints
        header = bytes([TAG_LIST_EXT]) + util.to_u32(len_val)
        elements = [_pack_int(ord(ch)) for ch in val]
        return header + b''.join(elements) + bytes([TAG_NIL_EXT])
Ejemplo n.º 7
0
def _pack_int(val: int):
    if 0 <= val < 256:
        return bytes([TAG_SMALL_INT, val])
    size = val.bit_length()
    if size <= 32:
        return bytes([TAG_INT]) + util.to_i32(val)
    # we get here we're packing smal or large big
    sign = 0 if 0 <= val else 1
    if sign:
        val *= -1  # switch to positive value
    size = int(size / 8) + 1
    if size < 256:
        hdr = bytes([TAG_SMALL_BIG_EXT, size, sign])
    else:
        hdr = bytes([TAG_LARGE_BIG_EXT]) + util.to_u32(size) + bytes([sign])

    data = val.to_bytes(size, 'little')
    return hdr + data
Ejemplo n.º 8
0
    def _send_challenge_reply(self, challenge: int):
        digest = self.make_digest(challenge, self.get_node().get_cookie())
        self.my_challenge_ = int(random.random() * 0x7fffffff)

        pkt = b'r' + util.to_u32(self.my_challenge_) + digest
        return self._send_packet2(pkt)
Ejemplo n.º 9
0
def _pack_binary(data, last_byte_bits):
    if last_byte_bits == 8:
        return bytes([TAG_BINARY_EXT]) + util.to_u32(len(data)) + data

    return bytes([TAG_BIT_BINARY_EXT]) + util.to_u32(len(data)) + \
           bytes([last_byte_bits]) + data
Ejemplo n.º 10
0
def _pack_dict(val: dict, encode_hook) -> bytes:
    data = bytes([TAG_MAP_EXT]) + util.to_u32(len(val))
    for k in val.keys():
        data += term_to_binary_2(k, encode_hook)
        data += term_to_binary_2(val[k], encode_hook)
    return data