Allow omission of end option for range reads
authorFelix Geisendörfer <felix@debuggable.com>
Tue, 5 Apr 2011 21:37:40 +0000 (23:37 +0200)
committerRyan Dahl <ry@tinyclouds.org>
Wed, 13 Apr 2011 16:46:28 +0000 (09:46 -0700)
Problem: Sometimes it is useful to read a file from a certain position
to it's end. The current implementation was already perfectly capable
of this, but decided to throw an error when the user tried to omit
the end option. The only way to do this, was to pass {end: Infinity}.

Solution: Automatically assume {end: Infinity} when omitted, and remove
the previous exception thrown. Also updated the docs.

closes #801.

doc/api/fs.markdown
lib/fs.js
test/simple/test-fs-read-stream.js

index 6d7cd78..506883b 100644 (file)
@@ -367,7 +367,7 @@ Returns a new ReadStream object (See `Readable Stream`).
 
 `options` can include `start` and `end` values to read a range of bytes from
 the file instead of the entire file.  Both `start` and `end` are inclusive and
-start at 0.  When used, both the limits must be specified always.
+start at 0.
 
 An example to read the last 10 bytes of a file which is 100 bytes long:
 
index 0f2318d..ab169fb 100644 (file)
--- a/lib/fs.js
+++ b/lib/fs.js
@@ -799,11 +799,12 @@ var ReadStream = fs.ReadStream = function(path, options) {
 
   if (this.encoding) this.setEncoding(this.encoding);
 
-  if (this.start !== undefined || this.end !== undefined) {
-    if (this.start === undefined || this.end === undefined) {
-      this.emit('error', new Error('Both start and end are needed ' +
-                                   'for range streaming.'));
-    } else if (this.start > this.end) {
+  if (this.start !== undefined) {
+    if (this.end === undefined) {
+      this.end = Infinity;
+    }
+
+    if (this.start > this.end) {
       this.emit('error', new Error('start must be <= end'));
     } else {
       this._firstRead = true;
index 188c95d..5362389 100644 (file)
@@ -121,19 +121,19 @@ file4.addListener('end', function(data) {
   assert.equal(contentRead, 'yz');
 });
 
-try {
+var file5 = fs.createReadStream(rangeFile, {bufferSize: 1, start: 1});
+file5.data = '';
+file5.addListener('data', function(data) {
+  file5.data += data.toString('utf-8');
+});
+file5.addListener('end', function() {
+  assert.equal(file5.data, 'yz\n');
+});
+
+
+assert.throws(function() {
   fs.createReadStream(rangeFile, {start: 10, end: 2});
-  assert.fail('Creating a ReadStream with incorrect range limits must throw.');
-} catch (e) {
-  assert.equal(e.message, 'start must be <= end');
-}
-
-try {
-  fs.createReadStream(rangeFile, {start: 2});
-  assert.fail('Creating a ReadStream with a only one range limits must throw.');
-} catch (e) {
-  assert.equal(e.message, 'Both start and end are needed for range streaming.');
-}
+}, /start must be <= end/);
 
 var stream = fs.createReadStream(rangeFile, { start: 0, end: 0 });
 stream.data = '';