-
Notifications
You must be signed in to change notification settings - Fork 30
/
Copy pathuser-extensions-resume.js
95 lines (77 loc) · 2.2 KB
/
user-extensions-resume.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
"use strict";
/*
The TFTP doesn't have any built-in mechanism for resuming a transfer, however,
with the user extensions it is possible. This example uses the extension
"offset". Only GET requests are allowed.
*/
var fs = require ("fs");
var tftp = require ("../lib");
var handleError = function (error){
console.error (error);
};
var server = tftp.createServer ({ denyPUT: true }, function (req, res){
var offset = 0;
if (req.stats.userExtensions.offset !== undefined){
offset = ~~req.stats.userExtensions.offset;
if (offset < 0){
return req.abort ("The offset must be a positive integer");
}
}
var file = this.root + "/" + req.file;
var abortError;
req.on ("error", function (error){
rs.destroy ();
handleError (error);
});
req.on ("abort", function (){
handleError (abortError);
});
var rs = fs.createReadStream (file, { start: offset })
.on ("error", function (error){
abortError = error;
req.abort (tftp.EIO);
});
fs.stat (file, function (error, stats){
if (error){
abortError = error;
return req.abort (tftp.EIO);
}
var size = stats.size - offset;
res.setSize (size < 0 ? 0 : size);
rs.pipe (res);
});
});
server.on ("error", function (error){
console.error (error);
});
server.on ("listening", doRequest);
server.listen ();
function doRequest (){
var clean = function (){
server.close ();
try{ fs.unlinkSync ("tmp1"); }catch (error){}
try{ fs.unlinkSync ("tmp2"); }catch (error){}
};
fs.writeFileSync ("tmp1", "0123456789");
fs.writeFileSync ("tmp2", "01234");
var client = tftp.createClient ();
//Get the content "56789" from tmp1 and append it to tmp2 which contains
//"01234"
var gs = client.createGetStream ("tmp1", { userExtensions: { offset: 5 } })
.on ("error", function (error){
console.error (error);
clean ();
});
var ws = fs.createWriteStream ("tmp2", { flags: "a" })
.on ("error", function (error){
console.error (error);
gs.abort (tftp.EIO);
clean ();
})
.on ("finish", function (){
console.log (fs.readFileSync ("tmp2", { encoding: "utf8" }));
//0123456789
clean ();
});
gs.pipe (ws);
};