Browse Source

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.
Allen Luce 8 years ago
parent
commit
4b298416ea
2 changed files with 26 additions and 1 deletions
  1. 23 1
      parse.go
  2. 3 0
      parse_test.go

+ 23 - 1
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) {

+ 3 - 0
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