Node.js: how to use curl to get the HTTP headers from a URL

Node.js: how to use curl to get the HTTP headers from a URL

In this tutorial we will see how to get HTTP headers from a URL using curl and Node.js.

In this tutorial we will see how to get HTTP headers from a URL using curl and Node.js.

The curl command must be executed from the shell and its output must be transformed into a literal object having as properties and values respectively the name and the value of each HTTP header.

We can define the following class:

'use strict';

const util = require('util');
const exec = util.promisify(require('child_process').exec);
const validator = require('validator');

class cURL {
    constructor(url) {
        this.url = url;
    }

    validate() {
        return typeof this.url === 'string' && validator.isURL(this.url);
    }

    parseHeaders(output) {
        if(!output || output.length === 0) {
            return null;
        }
        const lines = output.split(/\r\n/);
        let headers = {};
        lines.forEach(line => {
           let values = line.split(/:\s/);
           if(values.length === 2 && typeof values[0] === 'string' && typeof values[1] === 'string') {
               let [key, value] = values;
               headers[key] = value.trim();
           }
        });
        return headers;
    }

    async getHeaders() {
        if(!this.validate()) {
            throw new Error('Invalid parameter.');
        }
        const cmd = `curl -I ${this.url}`;

        try {
            const { stdout, stderr } = await exec(cmd);
            return this.parseHeaders(stdout);
        } catch(err) {
            return err;
        }
    }
}

module.exports = cURL;

The command to run from the shell is curl -I <URL>. The URL must be validated and if it passes this validation it can be used with the core exec() method which in this example returns a Promise using the promisify() utility method.

The command output is formatted on multiple lines. In each line the header name is separated from its value by the pattern :[space], so we can use this pattern to separate lines and headers and to create the literal object returned by the main method of the class.

Example of use:

'use strict';

const curl = require('./lib/cURL');
const curlRequest = new curl('https://gabrieleromanato.com');

(async() => {
    try {
        console.log(await curlRequest.getHeaders());
    } catch(err) {
        console.log(err);
    }
})();