ArnaudBuchholz/gpf-js

View on GitHub
src/http/helpers.js

Summary

Maintainability
A
0 mins
Test Coverage
/**
 * @file HTTP helpers
 * @since 0.2.1
 */
/*#ifndef(UMD)*/
"use strict";
/*global _gpfArrayForEach*/ // Almost like [].forEach (undefined are also enumerated)
/*global _gpfRegExpForEach*/ // Executes the callback for each match of the regular expression
/*exported _GPF_HTTP_METHODS*/ // HTTP Methods
/*exported _gpfHttpGenGetResponse*/ // Generates a function that extracts response from the http object
/*exported _gpfHttpGenSend*/ // Generates a function that implements the http send logic
/*exported _gpfHttpGenSetHeaders*/ // Generates a function that transmit headers to the http object
/*exported _gpfHttpParseHeaders*/ // Parse HTTP response headers
/*#endif*/

/**
 * @namespace gpf.http
 * @description Root namespace for http specifics
 * @since 0.2.1
 */
gpf.http = {};

/**
 * Http methods
 * @since 0.2.1
 */
var _GPF_HTTP_METHODS = {
    GET: "GET",
    POST: "POST",
    PUT: "PUT",
    OPTIONS: "OPTIONS",
    DELETE: "DELETE",
    HEAD: "HEAD"
};

var _gpfHttpHeadersParserRE = new RegExp("([^:\\s]+)\\s*: ?([^\\r]*)", "gm"),
    _GPF_HTTP_HELPERS_HEADER_NAME = 1,
    _GPF_HTTP_HELPERS_HEADER_VALUE = 2;

/**
 * Parse HTTP response headers
 *
 * @param {String} headers Response headers
 * @return {Object} headers dictionary
 * @since 0.2.1
 */
function _gpfHttpParseHeaders (headers) {
    var result = {};
    _gpfArrayForEach(_gpfRegExpForEach(_gpfHttpHeadersParserRE, headers), function (match) {
        result[match[_GPF_HTTP_HELPERS_HEADER_NAME]] = match[_GPF_HTTP_HELPERS_HEADER_VALUE];
    });
    return result;
}

/**
 * Generates a function that transmit headers to the http object
 *
 * @param {String} methodName Name of the method to call
 * @return {Function} Method to set the headers
 * @gpf:closure
 * @since 0.2.1
 */
function _gpfHttpGenSetHeaders (methodName) {
    return function (httpObj, headers) {
        if (headers) {
            Object.keys(headers).forEach(function (headerName) {
                httpObj[methodName](headerName, headers[headerName]);
            });
        }
    };
}

/**
 * Generates a function that implements the http send logic
 *
 * @param {String} methodName Name of the method to call
 * @return {Function} Method to trigger the send
 * @gpf:closure
 * @since 0.2.1
 */
function _gpfHttpGenSend (methodName) {
    return function (httpObj, data) {
        if (data) {
            httpObj[methodName](data);
        } else {
            httpObj[methodName]();
        }
    };
}

/**
 * Generates a function that extracts response from the http object
 *
 * @param {String} status Name of the status property
 * @param {String} getAllResponseHeaders Name of the getAllResponseHeaders method
 * @param {String} responseText Name of the responseText property
 * @return {Function} Method to generate response
 * @gpf:closure
 * @since 0.2.7
 */
function _gpfHttpGenGetResponse (status, getAllResponseHeaders, responseText) {
    return function (httpObj) {
        return {
            status: httpObj[status],
            headers: _gpfHttpParseHeaders(httpObj[getAllResponseHeaders]()),
            responseText: httpObj[responseText]
        };
    };
}