unmarshal: support lowercase 'T' and 'Z' in date-time parsing (#601)

RFC3399 allows for lowercase 't' and 'z' in date-time values.

Fixes #600
This commit is contained in:
Cameron Moore
2021-09-25 12:02:23 -05:00
committed by GitHub
parent ee9b902222
commit 476492a85c
3 changed files with 11 additions and 4 deletions
+2 -2
View File
@@ -75,7 +75,7 @@ func parseDateTime(b []byte) (time.Time, error) {
panic("date time should have a timezone") panic("date time should have a timezone")
} }
if b[0] == 'Z' { if b[0] == 'Z' || b[0] == 'z' {
b = b[1:] b = b[1:]
zone = time.UTC zone = time.UTC
} else { } else {
@@ -127,7 +127,7 @@ func parseLocalDateTime(b []byte) (LocalDateTime, []byte, error) {
dt.LocalDate = date dt.LocalDate = date
sep := b[10] sep := b[10]
if sep != 'T' && sep != ' ' { if sep != 'T' && sep != ' ' && sep != 't' {
return dt, nil, newDecodeError(b[10:11], "datetime separator is expected to be T or a space") return dt, nil, newDecodeError(b[10:11], "datetime separator is expected to be T or a space")
} }
+2 -2
View File
@@ -887,9 +887,9 @@ byteLoop:
if i >= minOffsetOfTz { if i >= minOffsetOfTz {
hasTz = true hasTz = true
} }
case c == 'T' || c == ':' || c == '.': case c == 'T' || c == 't' || c == ':' || c == '.':
hasTime = true hasTime = true
case c == '+' || c == '-' || c == 'Z': case c == '+' || c == '-' || c == 'Z' || c == 'z':
hasTz = true hasTz = true
case c == ' ': case c == ' ':
if !seenSpace && i+1 < len(b) && isDigit(b[i+1]) { if !seenSpace && i+1 < len(b) && isDigit(b[i+1]) {
+7
View File
@@ -1752,6 +1752,13 @@ func TestIssue585(t *testing.T) {
require.Error(t, err) require.Error(t, err)
} }
// Support lowercase 'T' and 'Z'
func TestIssue600(t *testing.T) {
var v interface{}
err := toml.Unmarshal([]byte(`a=1979-05-27t00:32:00z`), &v)
require.NoError(t, err)
}
//nolint:funlen //nolint:funlen
func TestUnmarshalDecodeErrors(t *testing.T) { func TestUnmarshalDecodeErrors(t *testing.T) {
examples := []struct { examples := []struct {