diff options
author | Jon Skeet <jonskeet@google.com> | 2016-01-15 11:39:27 +0000 |
---|---|---|
committer | Jon Skeet <jonskeet@google.com> | 2016-01-15 11:39:27 +0000 |
commit | 1fc485928fc7a6483b700867f1a6cb2acfa8da5d (patch) | |
tree | 7175437a631dcefc48d1bf91f0bbe81c632295e2 /csharp/src/Google.Protobuf/JsonParser.cs | |
parent | c74676f07037acca34e9df0fb868b29afae15ac9 (diff) | |
download | protobuf-1fc485928fc7a6483b700867f1a6cb2acfa8da5d.tar.gz protobuf-1fc485928fc7a6483b700867f1a6cb2acfa8da5d.tar.bz2 protobuf-1fc485928fc7a6483b700867f1a6cb2acfa8da5d.zip |
Fixes to JSON timestamp/duration representations
Diffstat (limited to 'csharp/src/Google.Protobuf/JsonParser.cs')
-rw-r--r-- | csharp/src/Google.Protobuf/JsonParser.cs | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/csharp/src/Google.Protobuf/JsonParser.cs b/csharp/src/Google.Protobuf/JsonParser.cs index 0d997a0a..db601c57 100644 --- a/csharp/src/Google.Protobuf/JsonParser.cs +++ b/csharp/src/Google.Protobuf/JsonParser.cs @@ -854,28 +854,24 @@ namespace Google.Protobuf try { - long seconds = long.Parse(secondsText, CultureInfo.InvariantCulture); + long seconds = long.Parse(secondsText, CultureInfo.InvariantCulture) * multiplier; int nanos = 0; if (subseconds != "") { // This should always work, as we've got 1-9 digits. int parsedFraction = int.Parse(subseconds.Substring(1)); - nanos = parsedFraction * SubsecondScalingFactors[subseconds.Length]; + nanos = parsedFraction * SubsecondScalingFactors[subseconds.Length] * multiplier; } - if (seconds >= Duration.MaxSeconds) + if (!Duration.IsNormalized(seconds, nanos)) { - // Allow precisely 315576000000 seconds, but prohibit even 1ns more. - if (seconds > Duration.MaxSeconds || nanos > 0) - { - throw new InvalidProtocolBufferException("Invalid Duration value: " + token.StringValue); - } + throw new InvalidProtocolBufferException($"Invalid Duration value: {token.StringValue}"); } - message.Descriptor.Fields[Duration.SecondsFieldNumber].Accessor.SetValue(message, seconds * multiplier); - message.Descriptor.Fields[Duration.NanosFieldNumber].Accessor.SetValue(message, nanos * multiplier); + message.Descriptor.Fields[Duration.SecondsFieldNumber].Accessor.SetValue(message, seconds); + message.Descriptor.Fields[Duration.NanosFieldNumber].Accessor.SetValue(message, nanos); } catch (FormatException) { - throw new InvalidProtocolBufferException("Invalid Duration value: " + token.StringValue); + throw new InvalidProtocolBufferException($"Invalid Duration value: {token.StringValue}"); } } |