def handle_deliver_sm(self, pdu): if pdu['header']['command_status'] == 'ESME_ROK': sequence_number = pdu['header']['sequence_number'] message_id = str(uuid.uuid4()) pdu_resp = DeliverSMResp(sequence_number, **self.defaults) self.send_pdu(pdu_resp) pdu_params = pdu['body']['mandatory_parameters'] delivery_report = self.config.delivery_report_re.search( pdu_params['short_message'] or '') if delivery_report: self.esme_callbacks.delivery_report( destination_addr=pdu_params['destination_addr'], source_addr=pdu_params['source_addr'], delivery_report=delivery_report.groupdict(), ) elif detect_multipart(pdu): redis_key = "%s#multi_%s" % ( self.r_prefix, multipart_key(detect_multipart(pdu))) log.msg("Redis multipart key: %s" % (redis_key)) value = json.loads(self.r_server.get(redis_key) or 'null') log.msg("Retrieved value: %s" % (repr(value))) multi = MultipartMessage(value) multi.add_pdu(pdu) completed = multi.get_completed() if completed: self.r_server.delete(redis_key) log.msg("Reassembled Message: %s" % (completed['message'])) # and we can finally pass the whole message on self.esme_callbacks.deliver_sm( destination_addr=completed['to_msisdn'], source_addr=completed['from_msisdn'], short_message=completed['message'], message_id=message_id, ) else: self.r_server.set(redis_key, json.dumps(multi.get_array())) else: decoded_msg = self._decode_message(pdu_params['short_message'], pdu_params['data_coding']) self.esme_callbacks.deliver_sm( destination_addr=pdu_params['destination_addr'], source_addr=pdu_params['source_addr'], short_message=decoded_msg, message_id=message_id, )
def load_multipart_message(self, redis_key): value = yield self.redis.get(redis_key) value = json.loads(value) if value else {} self.log.debug("Retrieved value: %s" % (repr(value))) returnValue(MultipartMessage(self._unhex_from_redis(value)))