Skip to content
This repository has been archived by the owner on Nov 28, 2022. It is now read-only.

Commit

Permalink
fix(oas-to-har): clean up formatting of raw json bodies (#1197)
Browse files Browse the repository at this point in the history
* fix(oas-to-har): clean up formatting of raw json bodies

* Update packages/oas-to-har/src/index.js

Co-authored-by: Jon Ursenbach <erunion@users.noreply.github.com>
  • Loading branch information
Dashron and erunion authored Feb 25, 2021
1 parent 7fc9557 commit 0d4cead
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 21 deletions.
24 changes: 24 additions & 0 deletions packages/oas-to-har/__tests__/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1124,6 +1124,30 @@ describe('requestBody', () => {
).toBe(JSON.stringify({ a: '{ "b": invalid json' }));
});

// TODO: Why do I have to json encode the resulting string? website doesn't seem to need that....
it('should parse valid arbitrary JSON request bodies', () => {
expect(
oasToHar(
oas,
{
path: '/body',
method: 'post',
requestBody: {
content: {
'application/json': {
schema: {
type: 'string',
format: 'json',
},
},
},
},
},
{ body: '{ "a": { "b": "valid json" } }' }
).log.entries[0].request.postData.text
).toBe('{"a":{"b":"valid json"}}');
});

it('should parse valid JSON as an object', () => {
expect(
oasToHar(
Expand Down
52 changes: 31 additions & 21 deletions packages/oas-to-har/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -303,33 +303,43 @@ module.exports = (
} else {
har.postData.mimeType = contentType;

// Find all `{ type: string, format: json }` properties in the schema because we need to manually JSON.parse
// them before submit, otherwise they'll be escaped instead of actual objects.
// We also only want values that the user has entered, so we drop any undefined cleanBody keys
const jsonTypes = Object.keys(requestBody.schema.properties).filter(
key => requestBody.schema.properties[key].format === 'json' && cleanBody[key] !== undefined
);
// Handle arbitrary JSON input via a string.
// In OAS you usually find this in an application/json content type.
// with a schema type=string, format=json.
// In the UI this is represented by an arbitrary text input
// This ensures we remove any newlines or tabs and use a clean json block in the example
if (requestBody.schema.type === 'string') {
har.postData.text = JSON.stringify(JSON.parse(cleanBody));
} else {
// Handle formatted JSON objects that have properties that accept arbitrary JSON
// Find all `{ type: string, format: json }` properties in the schema because we need to manually JSON.parse
// them before submit, otherwise they'll be escaped instead of actual objects.
// We also only want values that the user has entered, so we drop any undefined cleanBody keys
const jsonTypes = Object.keys(requestBody.schema.properties).filter(
key => requestBody.schema.properties[key].format === 'json' && cleanBody[key] !== undefined
);

if (jsonTypes.length) {
try {
jsonTypes.forEach(prop => {
try {
cleanBody[prop] = JSON.parse(cleanBody[prop]);
} catch (e) {
// leave the prop as a string value
}
});

if (jsonTypes.length) {
try {
jsonTypes.forEach(prop => {
try {
cleanBody[prop] = JSON.parse(cleanBody[prop]);
} catch (e) {
// leave the prop as a string value
if (typeof cleanBody.RAW_BODY !== 'undefined') {
cleanBody = cleanBody.RAW_BODY;
}
});

if (typeof cleanBody.RAW_BODY !== 'undefined') {
cleanBody = cleanBody.RAW_BODY;
har.postData.text = JSON.stringify(cleanBody);
} catch (e) {
har.postData.text = stringify(formData.body);
}

har.postData.text = JSON.stringify(cleanBody);
} catch (e) {
} else {
har.postData.text = stringify(formData.body);
}
} else {
har.postData.text = stringify(formData.body);
}
}
} catch (e) {
Expand Down

0 comments on commit 0d4cead

Please sign in to comment.