react / wstein / node_modules / jest-cli / node_modules / jsdom / node_modules / request / lib / har.js
81141 views'use strict'12var fs = require('fs')3var qs = require('querystring')4var validate = require('har-validator')5var util = require('util')67function Har (request) {8this.request = request9}1011Har.prototype.reducer = function (obj, pair) {12// new property ?13if (obj[pair.name] === undefined) {14obj[pair.name] = pair.value15return obj16}1718// existing? convert to array19var arr = [20obj[pair.name],21pair.value22]2324obj[pair.name] = arr2526return obj27}2829Har.prototype.prep = function (data) {30// construct utility properties31data.queryObj = {}32data.headersObj = {}33data.postData.jsonObj = false34data.postData.paramsObj = false3536// construct query objects37if (data.queryString && data.queryString.length) {38data.queryObj = data.queryString.reduce(this.reducer, {})39}4041// construct headers objects42if (data.headers && data.headers.length) {43// loweCase header keys44data.headersObj = data.headers.reduceRight(function (headers, header) {45headers[header.name] = header.value46return headers47}, {})48}4950// construct Cookie header51if (data.cookies && data.cookies.length) {52var cookies = data.cookies.map(function (cookie) {53return cookie.name + '=' + cookie.value54})5556if (cookies.length) {57data.headersObj.cookie = cookies.join('; ')58}59}6061// prep body62switch (data.postData.mimeType) {63case 'multipart/mixed':64case 'multipart/related':65case 'multipart/form-data':66case 'multipart/alternative':67// reset values68data.postData.mimeType = 'multipart/form-data'69break7071case 'application/x-www-form-urlencoded':72if (!data.postData.params) {73data.postData.text = ''74} else {75data.postData.paramsObj = data.postData.params.reduce(this.reducer, {})7677// always overwrite78data.postData.text = qs.stringify(data.postData.paramsObj)79}80break8182case 'text/json':83case 'text/x-json':84case 'application/json':85case 'application/x-json':86data.postData.mimeType = 'application/json'8788if (data.postData.text) {89try {90data.postData.jsonObj = JSON.parse(data.postData.text)91} catch (e) {92this.request.debug(e)9394// force back to text/plain95data.postData.mimeType = 'text/plain'96}97}98break99}100101return data102}103104Har.prototype.options = function (options) {105// skip if no har property defined106if (!options.har) {107return options108}109110var har = util._extend({}, options.har)111112// only process the first entry113if (har.log && har.log.entries) {114har = har.log.entries[0]115}116117// add optional properties to make validation successful118har.url = har.url || options.url || options.uri || options.baseUrl || '/'119har.httpVersion = har.httpVersion || 'HTTP/1.1'120har.queryString = har.queryString || []121har.headers = har.headers || []122har.cookies = har.cookies || []123har.postData = har.postData || {}124har.postData.mimeType = har.postData.mimeType || 'application/octet-stream'125126har.bodySize = 0127har.headersSize = 0128har.postData.size = 0129130if (!validate.request(har)) {131return options132}133134// clean up and get some utility properties135var req = this.prep(har)136137// construct new options138if (req.url) {139options.url = req.url140}141142if (req.method) {143options.method = req.method144}145146if (Object.keys(req.queryObj).length) {147options.qs = req.queryObj148}149150if (Object.keys(req.headersObj).length) {151options.headers = req.headersObj152}153154switch (req.postData.mimeType) {155case 'application/x-www-form-urlencoded':156options.form = req.postData.paramsObj157break158159case 'application/json':160if (req.postData.jsonObj) {161options.body = req.postData.jsonObj162options.json = true163}164break165166case 'multipart/form-data':167options.formData = {}168169req.postData.params.forEach(function (param) {170var attachment = {}171172if (!param.fileName && !param.fileName && !param.contentType) {173options.formData[param.name] = param.value174return175}176177// attempt to read from disk!178if (param.fileName && !param.value) {179attachment.value = fs.createReadStream(param.fileName)180} else if (param.value) {181attachment.value = param.value182}183184if (param.fileName) {185attachment.options = {186filename: param.fileName,187contentType: param.contentType ? param.contentType : null188}189}190191options.formData[param.name] = attachment192})193break194195default:196if (req.postData.text) {197options.body = req.postData.text198}199}200201return options202}203204exports.Har = Har205206207