def on_interest(self, name: FormalName, _param: InterestParam, _app_param: typing.Optional[BinaryStr]): # Get the name and segment number if Component.get_type(name[-1]) == Component.TYPE_SEGMENT: obj_name = Component.get_value(name[-2]) seg_no = Component.to_number(name[-1]) else: obj_name = Component.get_value(name[-1]) seg_no = 0 # Read the data # Git objects are small so we can read the whole object try: obj_type, data = self.repo.read_obj(bytes(obj_name)) except ValueError: logging.warning(f'Requested file {obj_name} does not exist in repo {self.repo.repo_name}') return # Extract the segment and calculate Name data_name = self.prefix + [Component.from_bytes(obj_name), Component.from_segment(seg_no)] start_pos = seg_no * SEGMENTATION_SIZE data_seg = data[start_pos:start_pos + SEGMENTATION_SIZE] packet_obj = SyncObject() packet_obj.obj_type = obj_type.encode() packet_obj.obj_data = data_seg wire = packet_obj.encode() final_block = (len(data) + SEGMENTATION_SIZE - 1) // SEGMENTATION_SIZE self.app.put_data(data_name, wire, freshness_period=3600000, final_block_id=Component.from_segment(final_block)) logging.debug(f'Responded {obj_name} segment {final_block} in repo {self.repo.repo_name}')
def test_app_param(): interest = ( b'\x05\x42\x07\x36\x08\x05local\x08\x03ndn\x08\x06prefix' b'\x02 \x47\x75\x6f\x21\xfe\x0e\xe2\x65\x14\x9a\xa2\xbe\x3c\x63\xc5\x38' b'\xa7\x23\x78\xe9\xb0\xa5\x8b\x39\xc5\x91\x63\x67\xd3\x5b\xda\x10' b'\x0c\x02\x0f\xa0\x24\x04\x01\x02\x03\x04') name, params, app_params, sig = parse_interest(interest) assert name == Name.from_str( '/local/ndn/prefix' '/params-sha256=47756f21fe0ee265149aa2be3c63c538a72378e9b0a58b39c5916367d35bda10' ) assert app_params == b'\x01\x02\x03\x04' assert not params.can_be_prefix assert not params.must_be_fresh assert params.nonce is None assert params.lifetime == 4000 assert params.hop_limit is None assert sig.signature_info is None algo = hashlib.sha256() algo.update(b'\x24\x04\x01\x02\x03\x04') assert Component.get_value(name[-1]) == algo.digest() algo = hashlib.sha256() for part in sig.digest_covered_part: algo.update(part) assert sig.digest_value_buf == algo.digest()
def decode_sql(name, catalog_prefix): #remove the prefix sql_name_component = name[len(Name.normalize(catalog_prefix))] # parse the sql_name_component sqls_tlv_model = SqlsTlvModel.parse( Component.get_value(sql_name_component).tobytes()) # from list of bytearray to list of string sqls = list(map(lambda x: x.tobytes().decode(), sqls_tlv_model.sqls)) return sqls
def decode_cmd_param_bytes(name) -> RepoCommandParameter: """ Decode the command interest and return a RepoCommandParameter object. Command interests have the format of: /<routable_repo_prefix>/insert/<cmd_param_blob>/<timestamp>/<random-value>/<SignatureInfo>/<SignatureValue> Throw RuntimeError on decoding failure. """ param_bytes = Component.get_value(name[-1]) return RepoCommandParameter.parse(param_bytes)
def test_number(): assert Component.from_segment(13) == b'!\x01\r' assert Component.from_byte_offset(13) == b'\x22\x01\r' assert Component.from_sequence_num(13) == b'%\x01\r' assert Component.from_version(13) == b'#\x01\r' timeval = 15686790223318112 comp = Component.from_timestamp(timeval) assert Component.get_type(comp) == 36 assert Component.get_value(comp) == b'\x00\x37\xbb\x0d\x76\xed\x4c\x60' assert Component.to_number(comp) == timeval
def decode_datainfo(name, node_recall_prefix): # get the datainfo name component datainfo_name_component = name[len(node_recall_prefix)] # parse the datainfo_name_component datainfo_tlv_model = DatainfoTlvModel.parse( Component.get_value(datainfo_name_component).tobytes()) # from bytearray to string (uint) data_name = datainfo_tlv_model.data_name.tobytes().decode() hash = datainfo_tlv_model.hash.tobytes().decode() desired_copies = datainfo_tlv_model.desired_copies return data_name, hash, desired_copies
def __init__(self, comp: Component = None) -> None: try: model = MetaDataModel.parse(bytes(Component.get_value(comp))) self.source = model.source self.tseqno = model.tseqno self.nulled = model.nulled self.nopcks = model.nopcks except (ValueError, TypeError, IndexError, DecodeError): self.source = b'' self.tseqno = 0 self.nulled = 0 self.nopcks = 0
def test_number(): assert Component.from_segment(13) == b'!\x01\r' assert Component.from_byte_offset(13) == b'\x22\x01\r' assert Component.from_sequence_num(13) == b'%\x01\r' assert Component.from_version(13) == b'#\x01\r' timeval = 15686790223318112 comp = Component.from_timestamp(timeval) assert Component.get_type(comp) == 36 assert Component.get_value(comp) == b'\x00\x37\xbb\x0d\x76\xed\x4c\x60' assert Component.to_number(comp) == timeval assert Component.to_str(Component.from_segment(13)) == 'seg=13' assert Component.to_str(Component.from_byte_offset(13)) == 'off=13' assert Component.to_str(Component.from_sequence_num(13)) == 'seq=13' assert Component.to_str(Component.from_version(13)) == 'v=13' assert Component.to_str( Component.from_timestamp(timeval)) == 't=15686790223318112' assert Component.from_str('seg=13') == b'!\x01\r' assert Component.from_str('off=13') == b'\x22\x01\r' assert Component.from_str('seq=13') == b'%\x01\r' assert Component.from_str('v=13') == b'#\x01\r' assert Component.from_str( 't=15686790223318112') == b'$\x08\x007\xbb\rv\xedL`'
def decode_cmd_param_bytes(name) -> CatalogCommandParameter: param_bytes = Component.get_value(name[-1]) return CatalogCommandParameter.parse(param_bytes)
def __init__(self, comp:Component=None) -> None: try: model:MetaDataModel = MetaDataModel.parse(bytes(Component.get_value(comp))) self.source, self.tseqno, self.nopcks = model.source, model.tseqno, model.nopcks except (ValueError,TypeError,IndexError,DecodeError): self.source, self.tseqno, self.nopcks = b'', 0, 0