Skip to content

Commit 6cab1a9

Browse files
committed
Extract parse listing away into parse-listing module
1 parent f3dafa9 commit 6cab1a9

File tree

4 files changed

+5
-89
lines changed

4 files changed

+5
-89
lines changed

lib/jsftp.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ var Net = require("net");
1111
var EventEmitter = require("events").EventEmitter;
1212
var es = require("event-stream");
1313
var ResponseParser = require("ftp-response-parser");
14+
var ListingParser = require("parse-listing");
1415
var Utils = require("./utils");
1516
var util = require("util");
1617
var fs = require("fs");
@@ -575,7 +576,8 @@ Ftp.prototype.ls = function(filePath, callback) {
575576
if (err) {
576577
return callback(err);
577578
}
578-
callback(null, Utils.parseEntry(entries.text || entries));
579+
580+
ListingParser.parseFtpEntries(entries.text || entries, callback);
579581
}
580582

581583
if (this.useList) {

lib/utils.js

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,4 @@
1-
var Parser = require("parse-listing");
2-
var async = require("async");
3-
4-
var RE_RES = /^(\d\d\d)\s(.*)/;
5-
var RE_MULTI = /^(\d\d\d)-/;
6-
var RE_SERVER_RESPONSE = /^(\d\d\d)(.*)/;
7-
81
var Utils = module.exports = {
9-
/**
10-
* Parse raw output of a file listing, trying in to clean up broken listings
11-
* in the process
12-
* @param {String} listing Raw file listing coming from a 'list' or 'stat'
13-
* @returns {Object[]}
14-
*/
15-
parseEntry: function(listing) {
16-
var t, parsedEntry;
17-
var i = 0;
18-
var parsed = [];
19-
var splitEntries = listing.split(/\r\n|\n/);
20-
async.eachSeries(splitEntries, function(entry, next) {
21-
function _next() {
22-
i += 1;
23-
next();
24-
}
25-
26-
// Some servers include an official code-multiline sign at the beginning
27-
// of every string. We must strip it if that's the case.
28-
if (RE_MULTI.test(entry))
29-
entry = entry.substr(3);
30-
31-
entry = entry.trim();
32-
33-
// Filter file-listing results from 'STAT' command, since they include
34-
// server responses before and after the file listing.
35-
// Issue: https://github.com/sergi/jsftp/issues/3
36-
if (RE_SERVER_RESPONSE.test(entry) ||
37-
RE_RES.test(entry) || RE_MULTI.test(entry)) {
38-
return _next();
39-
}
40-
41-
parsedEntry = Parser.parseEntry(entry);
42-
if (parsedEntry === null) {
43-
if (splitEntries[i + 1]) {
44-
t = Parser.parseEntry(entry + splitEntries[i + 1]);
45-
if (t !== null) {
46-
splitEntries[i + 1] = entry + splitEntries[i + 1];
47-
return _next();
48-
}
49-
}
50-
51-
if (splitEntries[i - 1] && parsed.length > 0) {
52-
t = Parser.parseEntry(splitEntries[i - 1] + entry);
53-
if (t !== null) {
54-
parsed[parsed.length - 1] = t;
55-
}
56-
}
57-
}
58-
else if (parsedEntry) {
59-
parsed.push(parsedEntry);
60-
}
61-
_next();
62-
});
63-
64-
return parsed;
65-
},
66-
672
getPasvPort: function(text) {
683
var RE_PASV = /([-\d]+,[-\d]+,[-\d]+,[-\d]+),([-\d]+),([-\d]+)/;
694
var match = RE_PASV.exec(text);

package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "jsftp",
33
"id": "jsftp",
4-
"version": "1.1.1",
4+
"version": "1.2.0",
55
"description": "A sane FTP client implementation for NodeJS",
66
"keywords": [ "ftp", "protocol", "files", "server", "client", "async" ],
77
"author": "Sergi Mansilla <sergi.mansilla@gmail.com> (http://sergimansilla.com)",
@@ -15,8 +15,7 @@
1515
},
1616
"dependencies": {
1717
"event-stream": "~3.0.14",
18-
"parse-listing": "~1.0.0",
19-
"async": "~0.2.9",
18+
"parse-listing": "~1.1.0",
2019
"once": "~1.3.0"
2120
},
2221
"devDependencies": {

test/jsftp_test.js

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -274,26 +274,6 @@ describe("jsftp test suite", function() {
274274
});
275275
});
276276

277-
it("test listing with bad line breaks", function(next) {
278-
var badStr = "\
279-
213-Status follows:\r\n\
280-
-rw-r--r-- 1 0 0 105981956 Dec 20 18:07 GAT\r\n\
281-
SBY.MPG\r\n\
282-
-rw-r--r-- 1 0 0 74450948 Jan 17 18:16 GIJO.MPG\r\n\
283-
drwxr-xr-x 3 0 0 4096 Apr 16 2011 bourd\n\
284-
arie\r\n\
285-
drwxr-xr-x 2 0 0 4096 Apr 16 2011 denton\r\n\
286-
213 End of status";
287-
288-
var entries = Utils.parseEntry(badStr);
289-
assert.equal("GATSBY.MPG", entries[0].name);
290-
assert.equal("GIJO.MPG", entries[1].name);
291-
assert.equal("bourdarie", entries[2].name);
292-
assert.equal("denton", entries[3].name);
293-
294-
next();
295-
});
296-
297277
it("test passive listing of current directory", function(next) {
298278
ftp.list(remoteCWD, function(err, res) {
299279
assert.ok(!err, err);

0 commit comments

Comments
 (0)