@masx200/koa-range
Version:
range request implementation for koa
254 lines (233 loc) • 7.53 kB
JavaScript
var fs = require("fs");
var request = require("supertest");
var should = require("should");
var route = require("koa-route");
var range = require("../");
var Koa = require("koa");
var app = new Koa();
var rawbody = new Buffer(1024);
var rawFileBuffer = fs.readFileSync("./README.md") + "";
app.use(range);
app.use(
route.get("/", async function (ctx) {
ctx.body = rawbody;
})
);
app.use(
route.post("/", async function (ctx) {
ctx.status = 200;
})
);
app.use(
route.get("/json", async function (ctx) {
ctx.body = { foo: "bar" };
})
);
app.use(
route.get("/string", async function (ctx) {
ctx.body = "koa-range";
})
);
app.use(
route.get("/stream", async function (ctx) {
ctx.body = fs.createReadStream("./README.md");
})
);
app.use(
route.get("/empty", async function (ctx) {
ctx.body = undefined;
ctx.status = 304;
})
);
app.on("error", function (err) {
throw err;
});
describe("normal requests", function () {
it("should return 200 without range", function (done) {
request(app.listen())
.get("/")
.expect("Accept-Ranges", "bytes")
.expect(200)
.end(done);
});
it("should return 200 when method not GET", function (done) {
request(app.listen())
.post("/")
.set("range", "bytes=0-300")
.expect("Accept-Ranges", "bytes")
.expect(200)
.end(done);
});
});
describe("range requests", function () {
it("should return 206 with partial content", function (done) {
request(app.listen())
.get("/")
.set("range", "bytes=0-299")
.expect("Content-Length", "300")
.expect("Accept-Ranges", "bytes")
.expect("Content-Range", "bytes 0-299/1024")
.expect(206)
.end(done);
});
it("should return 200 when using oversized end", function (done) {
request(app.listen())
.get("/")
.set("range", "bytes=0-1024") // 1025 bytes in total > 1024
.expect("Content-Length", "1024")
.expect("Accept-Ranges", "bytes")
.expect("Content-Range", "bytes 0-1023/1024")
.expect(200)
.end(done);
});
it("should return 206 with partial content when using oversized end", function (done) {
request(app.listen())
.get("/")
.set("range", "bytes=1000-1024")
.expect("Content-Length", "24")
.expect("Accept-Ranges", "bytes")
.expect("Content-Range", "bytes 1000-1023/1024")
.expect(206)
.end(done);
});
it("should return 400 with PUT", function (done) {
request(app.listen())
.put("/")
.set("range", "bytes=0-299")
.expect("Accept-Ranges", "bytes")
.expect(400)
.end(done);
});
it("should return 416 with invalid range", function (done) {
request(app.listen())
.get("/")
.set("range", "bytes=400-300")
.expect("Accept-Ranges", "bytes")
.expect(416)
.end(done);
});
it("should return 416 with invalid range", function (done) {
request(app.listen())
.get("/")
.set("range", "bytes=x-300")
.expect("Accept-Ranges", "bytes")
.expect(416)
.end(done);
});
it("should return 416 with invalid range", function (done) {
request(app.listen())
.get("/")
.set("range", "bytes=400-x")
.expect("Accept-Ranges", "bytes")
.expect(416)
.end(done);
});
it("should return 416 with invalid range", function (done) {
request(app.listen())
.get("/")
.set("range", "bytes")
.expect("Accept-Ranges", "bytes")
.expect(416)
.end(done);
});
});
describe("range requests with stream", function () {
it("should return 206 with partial content", function (done) {
request(app.listen())
.get("/stream")
.set("range", "bytes=0-99")
.expect("Transfer-Encoding", "chunked")
.expect("Accept-Ranges", "bytes")
.expect("Content-Range", "bytes 0-99/*")
.expect(206)
.end(function (err, res) {
should.not.exist(err);
res.text.should.equal(rawFileBuffer.slice(0, 100));
done();
});
});
it("should return 206 with open ended range", function (done) {
request(app.listen())
.get("/stream")
.set("range", "bytes=0-")
.expect("Transfer-Encoding", "chunked")
.expect(200)
.end(function (err, res) {
should.not.exist(err);
res.text.should.startWith(rawFileBuffer.slice(0, 300));
done();
});
});
});
describe("range requests with json", function () {
it("should return 206 with partial content", function (done) {
request(app.listen())
.get("/json")
.set("range", "bytes=0-5")
.expect("Accept-Ranges", "bytes")
.expect("Content-Range", "bytes 0-5/13")
.expect("Content-Length", "6")
.expect(206)
.end(function (err, res) {
should.not.exist(err);
res.text.should.equal('{"foo"');
done();
});
});
it("should return 206 with single byte range", function (done) {
request(app.listen())
.get("/json")
.set("range", "bytes=2-2")
.expect("Accept-Ranges", "bytes")
.expect("Content-Range", "bytes 2-2/13")
.expect("Content-Length", "1")
.expect(206)
.end(function (err, res) {
should.not.exist(err);
res.text.should.equal("f");
done();
});
});
});
describe("range requests with string", function () {
it("should return 206 with partial content", function (done) {
request(app.listen())
.get("/string")
.set("range", "bytes=0-5")
.expect("Accept-Ranges", "bytes")
.expect("Content-Range", "bytes 0-5/9")
.expect("Content-Length", "6")
.expect(206)
.end(function (err, res) {
should.not.exist(err);
res.text.should.equal("koa-ra");
done();
});
});
it("should return 206 with open ended range", function (done) {
request(app.listen())
.get("/string")
.set("range", "bytes=3-")
.expect("Accept-Ranges", "bytes")
.expect("Content-Range", "bytes 3-8/9")
.expect("Content-Length", "6")
.expect(206)
.end(function (err, res) {
should.not.exist(err);
res.text.should.equal("-range");
done();
});
});
});
describe("range requests with empty body", function () {
it("should return 304", function (done) {
request(app.listen())
.get("/empty")
.set("range", "bytes=1-")
.expect(304)
.end(function (err, res) {
should.not.exist(err);
done();
});
});
});