def take_while_not(self, stopsymbol, typecast=None): try: stopsymbol_position = self._str.index(stopsymbol, self._position) except ValueError: raise _PhpUnserializationError("No `%s`" % stopsymbol, self.get_rest()) result = self._str[self._position : stopsymbol_position] self._position = stopsymbol_position + 1 if typecast is None: return result else: return typecast(result)
def unserialize(self): t = self.take() if t == "N": self.await(";") return None self.await(":") if t == "i": return self.take_while_not(";", int) if t == "d": return self.take_while_not(";", float) if t == "b": return bool(self.take_while_not(";", int)) if t == "s": size = self.take_while_not(":", int) self.await('"') result = self.take(size) self.await('";', 2) return result if t == "a": size = self.take_while_not(":", int) return self.parse_hash_core(size) if t == "O": object_name_size = self.take_while_not(":", int) self.await('"') object_name = self.take(object_name_size) self.await('":', 2) object_length = self.take_while_not(":", int) php_class = PHP_Class(object_name) members = self.parse_hash_core(object_length) if members: for php_name, value in members.items(): php_class.set_item(php_name, value) return php_class raise _PhpUnserializationError("Unknown type `%s`" % t, self.get_rest())
def unserialize(self): t = self.take() if t == 'N': self.await(';') return None self.await(':') if t == 'i': return self.take_while_not(';', int) if t == 'd': return self.take_while_not(';', float) if t == 'b': return bool(self.take_while_not(';', int)) if t == 's': size = self.take_while_not(':', int) self.await('"') result = self.take(size) self.await('";', 2) return result if t == 'a': size = self.take_while_not(':', int) return self.parse_hash_core(size) if t == 'O': object_name_size = self.take_while_not(':', int) self.await('"') object_name = self.take(object_name_size) self.await('":', 2) object_length = self.take_while_not(':', int) php_class = PHP_Class(object_name) members = self.parse_hash_core(object_length) if members: for php_name, value in members.items(): php_class.set_item(php_name, value) return php_class raise _PhpUnserializationError('Unknown type `%s`' % t, self.get_rest())
) raise PhpSerializationError("PHP serialize: cannot encode `%s`" % struct) class Unserializator(object): def __init__(self, s): self._position = 0 self._str = s def await(self, symbol, n=1): # result = self.take(len(symbol)) result = self._str[self._position : self._position + n] self._position += n if result != symbol: raise _PhpUnserializationError("Next is `%s` not `%s`" % (result, symbol), self.get_rest()) def take(self, n=1): result = self._str[self._position : self._position + n] self._position += n return result def take_while_not(self, stopsymbol, typecast=None): try: stopsymbol_position = self._str.index(stopsymbol, self._position) except ValueError: raise _PhpUnserializationError("No `%s`" % stopsymbol, self.get_rest()) result = self._str[self._position : stopsymbol_position] self._position = stopsymbol_position + 1 if typecast is None: return result