From 4b298416eae16ab7b57c1a5eba86270a77165b72 Mon Sep 17 00:00:00 2001 From: Allen Luce Date: Thu, 6 Jul 2017 00:55:11 +0000 Subject: [PATCH] Add a case to catch Unix-like but 0 link count list line I happened upon this with hostedftp.com: -r-------- 0 user group 65222236 Feb 24 00:39 UABlacklistingWeek8.csv Otherwise a fine Unix-like list line, but link count is 0 for some reason. That company wasn't able to tell me why. --- parse.go | 24 +++++++++++++++++++++++- parse_test.go | 3 +++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/parse.go b/parse.go index 076062a..2f5fd74 100644 --- a/parse.go +++ b/parse.go @@ -13,6 +13,7 @@ var listLineParsers = []func(line string) (*Entry, error){ parseRFC3659ListLine, parseLsListLine, parseDirListLine, + parseHostedFTPLine, } var dirTimeFormats = []string{ @@ -99,7 +100,7 @@ func parseLsListLine(line string) (*Entry, error) { } if err := e.setSize(fields[2]); err != nil { - return nil, err + return nil, errUnsupportedListLine } if err := e.setTime(fields[4:7]); err != nil { return nil, err @@ -180,6 +181,27 @@ func parseDirListLine(line string) (*Entry, error) { return e, nil } +// parseHostedFTPLine parses a directory line in the non-standard format used +// by hostedftp.com +// -r-------- 0 user group 65222236 Feb 24 00:39 UABlacklistingWeek8.csv +// (The link count is inexplicably 0) +func parseHostedFTPLine(line string) (*Entry, error) { + // Has the first field a length of 10 bytes? + if strings.IndexByte(line, ' ') != 10 { + return nil, errUnsupportedListLine + } + + scanner := newScanner(line) + fields := scanner.NextFields(9) + if fields[1] == "0" { // Set link count to 1 and attempt to parse as Unix. + fields[1] = "1" + newLine := strings.Join(fields, " ") + return parseLsListLine(newLine) + } + return nil, errUnsupportedListLine + +} + // parseListLine parses the various non-standard format returned by the LIST // FTP command. func parseListLine(line string) (*Entry, error) { diff --git a/parse_test.go b/parse_test.go index ab44c38..2c042c5 100644 --- a/parse_test.go +++ b/parse_test.go @@ -56,6 +56,9 @@ var listTests = []line{ {"drwxr-xr-x 3 110 1002 3 Dec 02 2009 spaces dir name", "spaces dir name", 0, EntryTypeFolder, time.Date(2009, time.December, 2, 0, 0, 0, 0, time.UTC)}, {"-rwxr-xr-x 3 110 1002 1234567 Dec 02 2009 file name", "file name", 1234567, EntryTypeFile, time.Date(2009, time.December, 2, 0, 0, 0, 0, time.UTC)}, {"-rwxr-xr-x 3 110 1002 1234567 Dec 02 2009 foo bar ", " foo bar ", 1234567, EntryTypeFile, time.Date(2009, time.December, 2, 0, 0, 0, 0, time.UTC)}, + + // Odd link count from hostedftp.com + {"-r-------- 0 user group 65222236 Feb 24 00:39 RegularFile", "RegularFile", 65222236, EntryTypeFile, time.Date(thisYear, time.February, 24, 0, 39, 0, 0, time.UTC)}, } // Not supported, we expect a specific error message