1.1.0 • Published 1 year ago

byteranges v1.1.0

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

byteranges

A JavaScript multipart/byteranges parser library.

Overview

This library parses multipart/byteranges response body of HTTP range requests.

The Range HTTP request header indicates the part of a document that the server should return. Several parts can be requested with one Range header at once, and the server may send back these ranges in a multipart document.

Install

npm install byteranges

Usage

const { parse, getContentRange, BodyPart } = require('../build/byteranges');
const http = require('http');

http.get('http://www.columbia.edu/~fdc/picture-of-something.jpg', {
    headers: {
        Range: 'bytes=1-10,101-150'
    }
}, res => {
    const { statusCode } = res;
    if (statusCode !== 206) {
        res.resume();
        return;
    }

    const chunks = [];
    res.on('data', chunk => {
        chunks.push(chunk);
    });
    res.on('end', () => {
        const body = Buffer.concat(chunks);
        const contentType = res.headers['content-type'];

        if (!/multipart\/byteranges/i.test(contentType)) {
            const range = getContentRange(res.headers['content-range']);
            const part = new BodyPart(range, body, contentType);
            console.log(JSON.stringify(part));
            return;
        }

        const match = /boundary=(\w+)/i.exec(contentType);
        if (match === null) {
            return;
        }

        const boundary = match[1];
        const parts = parse(body, boundary);
        console.log(JSON.stringify(parts));
    });
});

Using superagent:

const { parse, getContentRange, BodyPart } = require('../build/byteranges');
const superagent = require('superagent');

superagent
    .get('http://www.columbia.edu/~fdc/picture-of-something.jpg')
    .set('Range', 'bytes=1-10,101-150')
    .buffer(true)
    .parse(superagent.parse['application/octet-stream'])
    .end((err, res) => {
        if (err) {
            console.log(err);
            return;
        }

        if (res.status !== 206) {
            return;
        }

        const contentType = res.headers['content-type'];
        if (!/multipart\/byteranges/i.test(contentType)) {
            const range = getContentRange(res.headers['content-range']);
            const part = new BodyPart(range, res.body, contentType);
            console.log(JSON.stringify(part));
            return;
        }

        const match = /boundary=(\w+)/i.exec(contentType);
        if (match !== null) {
            const boundary = match[1];
            const parts = parse(res.body, boundary);
            console.log(JSON.stringify(parts));
        }
    });
1.1.0

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago