Mashape/mockbin

View on GitHub
lib/utils.js

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
const pkg = require("../package.json");

const utils = {
    objectToArray: (obj) => {
        if (!obj || typeof obj !== "object") {
            return [];
        }

        const results = Object.keys(obj).reduce((results, name) => {
            results.push({
                name: name,
                value: obj[name],
            });

            return results;
        }, []);

        return results;
    },

    getReqHeaderSize: (req) => {
        const keys = Object.keys(req.headers);

        const values = keys.map((key) => req.headers[key]);

        const headers =
            req.method +
            req.url +
            req.versionMajor +
            req.versionMinor +
            keys.join() +
            values.join();

        // startline: [method] [url] HTTP/1.1\r\n = 12
        // endline: \r\n = 2
        // every header + \r\n = * 2
        return Buffer.from(headers).length + keys.length * 2 + 12 + 2;
    },

    createHar: (req) => ({
        log: {
            version: "1.2",
            creator: {
                name: "mockbin.com",
                version: pkg.version,
            },
            entries: [
                {
                    startedDateTime: new Date().toISOString(),
                    clientIPAddress: req.ip,
                    request: {
                        method: req.method,
                        url: `${req.forwarded.proto}://${req.hostname}${req.originalUrl}`,
                        httpVersion: "HTTP/1.1",
                        // TODO, add cookie details
                        cookies: utils.objectToArray(req.cookies),
                        headers: utils.objectToArray(req.headers),
                        queryString: utils.objectToArray(req.query),
                        // TODO
                        postData: {
                            mimeType: req.contentType
                                ? req.contentType
                                : "application/octet-stream",
                            text: req.body,
                            params: [],
                        },
                        headersSize: utils.getReqHeaderSize(req),
                        bodySize: req.rawBody.length,
                    },
                },
            ],
        },
    }),

    createSimpleHar: (req) => ({
        startedDateTime: new Date().toISOString(),
        clientIPAddress: req.ip,
        method: req.method,
        url: `${req.forwarded.proto}://${req.hostname}${req.originalUrl}`,
        httpVersion: "HTTP/1.1",
        // TODO, add cookie details
        cookies: req.cookies,
        headers: req.headers,
        queryString: req.query,
        // TODO
        postData: {
            mimeType: req.contentType ? req.contentType : "application/octet-stream",
            text: req.body,
            params: [],
        },
        headersSize: utils.getReqHeaderSize(req),
        bodySize: req.rawBody.length,
    }),
};

module.exports = utils;