Browse Source

use exact integer parsing for znc.in/playback

tags/v2.10.0-rc1
Shivaram Lingamneni 2 years ago
parent
commit
197a9d4b5e
2 changed files with 15 additions and 3 deletions
  1. 5
    0
      irc/misc_test.go
  2. 10
    3
      irc/znc.go

+ 5
- 0
irc/misc_test.go View File

@@ -12,6 +12,11 @@ func TestZncTimestampParser(t *testing.T) {
12 12
 	assertEqual(zncWireTimeToTime("1558338348.988"), time.Unix(1558338348, 988000000).UTC(), t)
13 13
 	assertEqual(zncWireTimeToTime("1558338348.9"), time.Unix(1558338348, 900000000).UTC(), t)
14 14
 	assertEqual(zncWireTimeToTime("1558338348"), time.Unix(1558338348, 0).UTC(), t)
15
+	assertEqual(zncWireTimeToTime("1558338348.99999999999999999999999999999"), time.Unix(1558338348, 999999999).UTC(), t)
16
+	assertEqual(zncWireTimeToTime("1558338348.999999999111111111"), time.Unix(1558338348, 999999999).UTC(), t)
17
+	assertEqual(zncWireTimeToTime("1558338348.999999991111111111"), time.Unix(1558338348, 999999991).UTC(), t)
15 18
 	assertEqual(zncWireTimeToTime(".988"), time.Unix(0, 988000000).UTC(), t)
19
+	assertEqual(zncWireTimeToTime("0"), time.Unix(0, 0).UTC(), t)
16 20
 	assertEqual(zncWireTimeToTime("garbage"), time.Unix(0, 0).UTC(), t)
21
+	assertEqual(zncWireTimeToTime(""), time.Unix(0, 0).UTC(), t)
17 22
 }

+ 10
- 3
irc/znc.go View File

@@ -51,11 +51,18 @@ func zncWireTimeToTime(str string) (result time.Time) {
51 51
 		secondsPortion = str
52 52
 	} else {
53 53
 		secondsPortion = str[:dot]
54
-		fracPortion = str[dot:]
54
+		fracPortion = str[dot+1:]
55 55
 	}
56 56
 	seconds, _ := strconv.ParseInt(secondsPortion, 10, 64)
57
-	fraction, _ := strconv.ParseFloat(fracPortion, 64)
58
-	return time.Unix(seconds, int64(fraction*1000000000)).UTC()
57
+	// truncate to nanosecond resolution if necessary
58
+	if len(fracPortion) > 9 {
59
+		fracPortion = fracPortion[:9]
60
+	}
61
+	fracSeconds, _ := strconv.ParseInt(fracPortion, 10, 64)
62
+	for i := 0; i < (9 - len(fracPortion)); i++ {
63
+		fracSeconds *= 10
64
+	}
65
+	return time.Unix(seconds, fracSeconds).UTC()
59 66
 }
60 67
 
61 68
 func timeToZncWireTime(t time.Time) (result string) {

Loading…
Cancel
Save