diff --git a/swift/common/utils.py b/swift/common/utils.py index 787c3c2363..c78572f402 100644 --- a/swift/common/utils.py +++ b/swift/common/utils.py @@ -939,11 +939,16 @@ class Timestamp(object): :param delta: deca-microsecond difference from the base timestamp param, an int """ + if isinstance(timestamp, bytes): + timestamp = timestamp.decode('ascii') if isinstance(timestamp, six.string_types): - parts = timestamp.split('_', 1) - self.timestamp = float(parts.pop(0)) - if parts: - self.offset = int(parts[0], 16) + base, base_offset = timestamp.partition('_')[::2] + self.timestamp = float(base) + if '_' in base_offset: + raise ValueError('invalid literal for int() with base 16: ' + '%r' % base_offset) + if base_offset: + self.offset = int(base_offset, 16) else: self.offset = 0 else: diff --git a/test/unit/common/test_utils.py b/test/unit/common/test_utils.py index af0bf9e967..c90a03a5f6 100644 --- a/test/unit/common/test_utils.py +++ b/test/unit/common/test_utils.py @@ -183,6 +183,7 @@ class TestTimestamp(unittest.TestCase): def test_invalid_input(self): self.assertRaises(ValueError, utils.Timestamp, time.time(), offset=-1) + self.assertRaises(ValueError, utils.Timestamp, '123.456_78_90') def test_invalid_string_conversion(self): t = utils.Timestamp.now() @@ -390,6 +391,8 @@ class TestTimestamp(unittest.TestCase): expected = '1402436408.91203_00000000000000f0' test_values = ( '1402436408.91203_000000f0', + u'1402436408.91203_000000f0', + b'1402436408.91203_000000f0', '1402436408.912030000_0000000000f0', '1402436408.912029_000000f0', '1402436408.91202999999_0000000000f0',