Skip to content

Commit

Permalink
Merge pull request #1876 from simov/fix-har-mime
Browse files Browse the repository at this point in the history
Implement loose matching for har mime types
  • Loading branch information
simov committed Oct 30, 2015
2 parents 0c9e9c1 + 425a7e8 commit 30fcf67
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 76 deletions.
159 changes: 84 additions & 75 deletions lib/har.js
Expand Up @@ -60,43 +60,53 @@ Har.prototype.prep = function (data) {
}

// prep body
switch (data.postData.mimeType) {
case 'multipart/mixed':
case 'multipart/related':
case 'multipart/form-data':
case 'multipart/alternative':
// reset values
data.postData.mimeType = 'multipart/form-data'
break

case 'application/x-www-form-urlencoded':
if (!data.postData.params) {
data.postData.text = ''
} else {
data.postData.paramsObj = data.postData.params.reduce(this.reducer, {})

// always overwrite
data.postData.text = qs.stringify(data.postData.paramsObj)
}
break

case 'text/json':
case 'text/x-json':
case 'application/json':
case 'application/x-json':
data.postData.mimeType = 'application/json'

if (data.postData.text) {
try {
data.postData.jsonObj = JSON.parse(data.postData.text)
} catch (e) {
this.request.debug(e)

// force back to text/plain
data.postData.mimeType = 'text/plain'
}
function some (arr) {
return arr.some(function (type) {
return data.postData.mimeType.indexOf(type) === 0
})
}

if (some([
'multipart/mixed',
'multipart/related',
'multipart/form-data',
'multipart/alternative'])) {

// reset values
data.postData.mimeType = 'multipart/form-data'
}

else if (some([
'application/x-www-form-urlencoded'])) {

if (!data.postData.params) {
data.postData.text = ''
} else {
data.postData.paramsObj = data.postData.params.reduce(this.reducer, {})

// always overwrite
data.postData.text = qs.stringify(data.postData.paramsObj)
}
}

else if (some([
'text/json',
'text/x-json',
'application/json',
'application/x-json'])) {

data.postData.mimeType = 'application/json'

if (data.postData.text) {
try {
data.postData.jsonObj = JSON.parse(data.postData.text)
} catch (e) {
this.request.debug(e)

// force back to text/plain
data.postData.mimeType = 'text/plain'
}
break
}
}

return data
Expand Down Expand Up @@ -152,51 +162,50 @@ Har.prototype.options = function (options) {
options.headers = req.headersObj
}

switch (req.postData.mimeType) {
case 'application/x-www-form-urlencoded':
options.form = req.postData.paramsObj
break

case 'application/json':
if (req.postData.jsonObj) {
options.body = req.postData.jsonObj
options.json = true
}
break

case 'multipart/form-data':
options.formData = {}
function test (type) {
return req.postData.mimeType.indexOf(type) === 0
}
if (test('application/x-www-form-urlencoded')) {
options.form = req.postData.paramsObj
}
else if (test('application/json')) {
if (req.postData.jsonObj) {
options.body = req.postData.jsonObj
options.json = true
}
}
else if (test('multipart/form-data')) {
options.formData = {}

req.postData.params.forEach(function (param) {
var attachment = {}
req.postData.params.forEach(function (param) {
var attachment = {}

if (!param.fileName && !param.fileName && !param.contentType) {
options.formData[param.name] = param.value
return
}
if (!param.fileName && !param.fileName && !param.contentType) {
options.formData[param.name] = param.value
return
}

// attempt to read from disk!
if (param.fileName && !param.value) {
attachment.value = fs.createReadStream(param.fileName)
} else if (param.value) {
attachment.value = param.value
}
// attempt to read from disk!
if (param.fileName && !param.value) {
attachment.value = fs.createReadStream(param.fileName)
} else if (param.value) {
attachment.value = param.value
}

if (param.fileName) {
attachment.options = {
filename: param.fileName,
contentType: param.contentType ? param.contentType : null
}
if (param.fileName) {
attachment.options = {
filename: param.fileName,
contentType: param.contentType ? param.contentType : null
}

options.formData[param.name] = attachment
})
break

default:
if (req.postData.text) {
options.body = req.postData.text
}

options.formData[param.name] = attachment
})
}
else {
if (req.postData.text) {
options.body = req.postData.text
}
}

return options
Expand Down
2 changes: 1 addition & 1 deletion tests/fixtures/har.json
Expand Up @@ -8,7 +8,7 @@
}
],
"postData": {
"mimeType": "application/x-www-form-urlencoded",
"mimeType": "application/x-www-form-urlencoded; charset=UTF-8",
"params": [
{
"name": "foo",
Expand Down

0 comments on commit 30fcf67

Please sign in to comment.