parseBody.js 5.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. "use strict";
  2. var _ = require('../../../lodash'), sanitize = require('./sanitize').sanitize, path = require('path');
  3. /**
  4. * Used to parse the body of the postman SDK-request and return in the desired format
  5. *
  6. * @param {Object} request - postman SDK-request object
  7. * @param {String} indentation - used for indenting snippet's structure
  8. * @param {Boolean} bodyTrim - whether to trim request body fields
  9. * @returns {String} - request body
  10. */
  11. module.exports = function (request, indentation, bodyTrim) {
  12. // used to check whether body is present in the request or not
  13. if (!_.isEmpty(request.body)) {
  14. var requestBody = '', bodyDataMap, enabledBodyList;
  15. switch (request.body.mode) {
  16. case 'raw':
  17. if (!_.isEmpty(request.body[request.body.mode])) {
  18. requestBody += `payload = ${sanitize(request.body[request.body.mode], request.body.mode, bodyTrim)}\n`;
  19. }
  20. else {
  21. requestBody = 'payload = \'\'\n';
  22. }
  23. return requestBody;
  24. case 'graphql':
  25. // eslint-disable-next-line no-case-declarations
  26. let query = request.body[request.body.mode].query, graphqlVariables;
  27. try {
  28. graphqlVariables = JSON.parse(request.body[request.body.mode].variables);
  29. }
  30. catch (e) {
  31. graphqlVariables = {};
  32. }
  33. requestBody += `payload = ${sanitize(JSON.stringify({
  34. query: query,
  35. variables: graphqlVariables
  36. }), 'raw', bodyTrim)}\n`;
  37. return requestBody;
  38. case 'urlencoded':
  39. enabledBodyList = _.reject(request.body[request.body.mode], 'disabled');
  40. if (!_.isEmpty(enabledBodyList)) {
  41. bodyDataMap = _.map(enabledBodyList, function (value) {
  42. return `${sanitize(value.key, request.body.mode, bodyTrim)}=` +
  43. `${sanitize(value.value, request.body.mode, bodyTrim)}`;
  44. });
  45. requestBody += `payload = '${bodyDataMap.join('&')}'\n`;
  46. }
  47. else {
  48. requestBody = 'payload = \'\'\n';
  49. }
  50. return requestBody;
  51. case 'formdata':
  52. enabledBodyList = _.reject(request.body[request.body.mode], 'disabled');
  53. if (!_.isEmpty(enabledBodyList)) {
  54. requestBody += 'dataList = []\n';
  55. requestBody += 'boundary = \'wL36Yn8afVp8Ag7AmP8qZ0SA4n1v9T\'\n';
  56. enabledBodyList.forEach((data) => {
  57. requestBody += 'dataList.append(encode(\'--\' + boundary))\n';
  58. if (data.type !== 'file') {
  59. requestBody += `dataList.append(encode('Content-Disposition: form-data; name=${sanitize(data.key, 'form-data', true)};'))\n\n`; // eslint-disable-line max-len
  60. requestBody += 'dataList.append(encode(\'Content-Type: {}\'.format(\'' +
  61. (data.contentType ? data.contentType : 'text/plain') + '\')))\n';
  62. requestBody += 'dataList.append(encode(\'\'))\n\n';
  63. requestBody += `dataList.append(encode("${sanitize(data.value, 'form-data', true)}"))\n`;
  64. }
  65. else {
  66. var pathArray = data.src.split(path.sep), fileName = pathArray[pathArray.length - 1];
  67. requestBody += `dataList.append(encode('Content-Disposition: form-data; name=${sanitize(data.key, 'form-data', true)}; filename={0}'.format('${sanitize(fileName, 'formdata', true)}')))\n\n`; // eslint-disable-line max-len
  68. requestBody += `fileType = mimetypes.guess_type('${sanitize(data.src, 'formdata', true)}')[0] or 'application/octet-stream'\n`; // eslint-disable-line max-len
  69. requestBody += 'dataList.append(encode(\'Content-Type: {}\'.format(fileType)))\n';
  70. requestBody += 'dataList.append(encode(\'\'))\n\n';
  71. requestBody += `with open('${data.src}', 'rb') as f:\n`;
  72. requestBody += `${indentation}dataList.append(f.read())\n`;
  73. }
  74. });
  75. requestBody += 'dataList.append(encode(\'--\'+boundary+\'--\'))\n';
  76. requestBody += 'dataList.append(encode(\'\'))\n';
  77. requestBody += 'body = b\'\\r\\n\'.join(dataList)\n';
  78. requestBody += 'payload = body\n';
  79. }
  80. else {
  81. requestBody = 'boundary = \'\'\n';
  82. requestBody += 'payload = \'\'\n';
  83. }
  84. return requestBody;
  85. case 'file':
  86. return 'payload = "<file contents here>"\n';
  87. default:
  88. return 'payload = \'\'\n';
  89. }
  90. }
  91. return '';
  92. };