Repository: postmanlabs/postman-code-generators
Pull request #126 (2019-11-18 11:22:57)

Add objective-c codegen
Objective-C codegen using https://developer.apple.com/documentation/foundation/nsurlsession.


Patch:
diff --git a/README.md b/README.md
index a57a391..e513d19 100644
--- a/README.md
+++ b/README.md
@@ -29,6 +29,7 @@ List of supported code generators:
 | NodeJs | Native |
 | NodeJs | Request |
 | NodeJs | Unirest |
+| Objective-C| NSURLSession|
 | OCaml | Cohttp | 
 |PHP | cURL |
 |PHP | pecl_http |
diff --git a/codegens/objective-c/.gitignore b/codegens/objective-c/.gitignore
new file mode 100644
index 0000000..909b2b6
--- /dev/null
+++ b/codegens/objective-c/.gitignore
@@ -0,0 +1,44 @@
+.DS_Store
+
+#Obj-c files
+*.m
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Coverage directory used by tools like istanbul
+.coverage
+
+# node-waf configuration
+.lock-wscript
+
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Typescript v1 declaration files
+typings/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+
+out/
diff --git a/codegens/objective-c/.npmignore b/codegens/objective-c/.npmignore
new file mode 100644
index 0000000..79ad2ba
--- /dev/null
+++ b/codegens/objective-c/.npmignore
@@ -0,0 +1,76 @@
+### NPM Specific: Disregard recursive project files
+### ===============================================
+/.editorconfig
+/.gitmodules
+/test
+
+### Borrowed from .gitignore
+### ========================
+
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Prevent IDE stuff
+.idea
+.vscode
+*.sublime-*
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+.coverage
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Typescript v1 declaration files
+typings/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+
+snippet.swift
+
+out/
diff --git a/codegens/objective-c/README.md b/codegens/objective-c/README.md
new file mode 100644
index 0000000..9226872
--- /dev/null
+++ b/codegens/objective-c/README.md
@@ -0,0 +1,42 @@
+
+> Converts Postman-SDK Request into code snippet for Objective-C NSURLSession.
+
+#### Prerequisites
+To run Code-Gen, ensure that you have NodeJS >= v8. A copy of the NodeJS installable can be downloaded from https://nodejs.org/en/download/package-manager.
+
+## Using the Module
+The module will expose an object which will have property `convert` which is the function for converting the Postman-SDK request to swift code snippet.
+
+### convert function
+Convert function takes three parameters
+
+* `request` - Postman-SDK Request Object
+
+* `options` - options is an object which hsa following properties
+    * `indentType` - String denoting type of indentation for code snippet. eg: 'Space', 'Tab'
+    * `indentCount` - The number of indentation characters to add per code level
+    * `trimRequestBody` - Whether or not request body fields should be trimmed
+
+* `callback` - callback function with first parameter as error and second parameter as string for code snippet
+
+##### Example:
+```js
+var request = new sdk.Request('www.google.com'),  //using postman sdk to create request  
+    options = {
+        indentCount: 3,
+        indentType: 'Space',
+        requestTimeout: 200,
+        trimRequestBody: true
+    };
+convert(request, options, function(error, snippet) {
+    if (error) {
+        //  handle error
+    }
+    //  handle snippet
+});
+```
+### Guidelines for using generated snippet
+
+* Since Postman-SDK Request object doesn't provide complete path of the file, it needs to be manually inserted in case of uploading a file.
+
+* This module doesn't support cookies.
\ No newline at end of file
diff --git a/codegens/objective-c/index.js b/codegens/objective-c/index.js
new file mode 100644
index 0000000..bb0a047
--- /dev/null
+++ b/codegens/objective-c/index.js
@@ -0,0 +1,1 @@
+module.exports = require('./lib');
diff --git a/codegens/objective-c/lib/index.js b/codegens/objective-c/lib/index.js
new file mode 100644
index 0000000..763fa75
--- /dev/null
+++ b/codegens/objective-c/lib/index.js
@@ -0,0 +1,330 @@
+var _ = require('./lodash'),
+  sanitizeOptions = require('./util').sanitizeOptions,
+  sanitize = require('./util').sanitize,
+  addFormParam = require('./util').addFormParam,
+  self;
+
+/**
+ * Parses Raw data
+ *
+ * @param {Object} body Raw body data
+ * @param {String} indent indentation required for code snippet
+ * @param {Boolean} trim indicates whether to trim string or not
+ */
+function parseRawBody (body, indent, trim) {
+  var bodySnippet = '';
+  bodySnippet += 'NSData *postData = [[NSData alloc] initWithData:[@"' + sanitize(body.toString(), trim) + '" ' +
+  'dataUsingEncoding:NSUTF8StringEncoding]];\n';
+  bodySnippet += '[request setHTTPBody:postData];\n';
+  return bodySnippet;
+}
+
+/**
+ * Parses GraphQL body
+ *
+ * @param {Object} body GraphQL body
+ * @param {String} indent indentation required for code snippet
+ * @param {Boolean} trim indicates whether to trim string or not
+ */
+function parseGraphQLBody (body, indent, trim) {
+  var bodySnippet = '',
+    rawBody = JSON.stringify(body);
+  bodySnippet += 'NSData *postData = [[NSData alloc] initWithData:[@"' + sanitize(rawBody, trim) + '" ' +
+  'dataUsingEncoding:NSUTF8StringEncoding]];\n';
+  bodySnippet += '[request setHTTPBody:postData];\n';
+  return bodySnippet;
+}
+
+/**
+ * Parses URLEncoded body
+ *
+ * @param {Object} body URLEncoded Body
+ * @param {String} indent indentation required for code snippet
+ * @param {Boolean} trim indicates whether to trim string or not
+ */
+function parseURLEncodedBody (body, indent, trim) {
+  let bodySnippet = '',
+    key,
+    value,
+    first = true;
+  _.forEach(body, function (data) {
+    if (!data.disabled) {
+      key = trim ? data.key.trim() : data.key;
+      value = trim ? data.value.trim() : data.value;
+      if (first) {
+        bodySnippet += 'NSMutableData *postData = [[NSMutableData alloc] initWithData:[@"' +
+        sanitize(key, true) + '=' + sanitize(value, trim) + '" dataUsingEncoding:NSUTF8StringEncoding]];\n';
+      }
+      else {
+        bodySnippet += '[postData appendData:[@"&' + sanitize(key, true) + '=' + sanitize(value, trim) +
+        '" dataUsingEncoding:NSUTF8StringEncoding]];\n';
+      }
+      first = false;
+    }
+  });
+  bodySnippet += '[request setHTTPBody:postData];\n';
+  return bodySnippet;
+}
+
+/**
+ * Parses form data body from request
+ *
+ * @param {Object} body form data Body
+ * @param {String} indent indentation required for code snippet
+ * @param {Boolean} trim indicates whether to trim string or not
+ */
+function parseFormData (body, indent, trim) {
+  let bodySnippet = '',
+    formDataArray = [],
+    key,
+    foundFile = false,
+    value;
+
+  if (_.isEmpty(body)) {
+    return bodySnippet;
+  }
+
+  bodySnippet += 'NSArray *parameters = @[';
+
+  _.forEach(body, function (data) {
+    key = trim ? data.key.trim() : data.key;
+    value = trim ? data.value.trim() : data.value;
+    if (!data.disabled) {
+      if (data.type === 'file') {
+        foundFile = true;
+        formDataArray.push(`\n${indent}@{ @"name": @"${key}", @"fileName": @"${data.src}" }`);
+      }
+      else {
+        formDataArray.push(`\n${indent}@{ @"name": @"${key}", @"value": @"${sanitize(value, trim)}" }`);
+      }
+    }
+  });
+  bodySnippet += formDataArray.join(', ');
+  bodySnippet += ' \n];\n';
+  bodySnippet += '\nNSString *boundary = @"----WebKitFormBoundary7MA4YWxkTrZu0gW";\n';
+  bodySnippet += 'NSError *error;\n';
+  bodySnippet += 'NSMutableString *body = [NSMutableString string];\n';
+  bodySnippet += '\nfor (NSDictionary *param in parameters) {\n';
+  bodySnippet += indent + '[body appendFormat:@"--%@\\r\\n", boundary];\n';
+  if (foundFile) {
+    bodySnippet += indent + 'if (param[@"fileName"]) {\n';
+    // eslint-disable-next-line max-len
+    bodySnippet += indent.repeat(2) + '[body appendFormat:@"Content-Disposition:form-data; name=\\"%@\\"; filename=\\"%@\\"\\r\\n", param[@"name"], param[@"fileName"]];\n';
+    bodySnippet += indent.repeat(2) + '[body appendFormat:@"Content-Type: %@\\r\\n\\r\\n", param[@"contentType"]];\n';
+    // eslint-disable-next-line max-len
+    bodySnippet += indent.repeat(2) + '[body appendFormat:@"%@", [NSString stringWithContentsOfFile:param[@"fileName"]' +
+      ' encoding:NSUTF8StringEncoding error:&error]];\n';
+    bodySnippet += indent.repeat(2) + 'if (error) {\n';
+    bodySnippet += indent.repeat(3) + 'NSLog(@"%@", error);\n';
+    bodySnippet += indent.repeat(2) + '}\n';
+    bodySnippet += indent + '} else {\n';
+    bodySnippet += indent.repeat(2) +
+      '[body appendFormat:@"Content-Disposition:form-data; name=\\"%@\\"\\r\\n\\r\\n", param[@"name"]];\n';
+    bodySnippet += indent.repeat(2) + '[body appendFormat:@"%@", param[@"value"]];\n';
+    bodySnippet += indent + '}\n';
+  }
+  else {
+    bodySnippet += indent +
+      '[body appendFormat:@"Content-Disposition:form-data; name=\\"%@\\"\\r\\n\\r\\n", param[@"name"]];\n';
+    bodySnippet += indent + '[body appendFormat:@"%@", param[@"value"]];\n';
+  }
+  bodySnippet += '}\n';
+  bodySnippet += '[body appendFormat:@"\\r\\n--%@--\\r\\n", boundary];\n';
+  bodySnippet += 'NSData *postData = [body dataUsingEncoding:NSUTF8StringEncoding];\n';
+  bodySnippet += '[request setHTTPBody:postData];\n';
+  return bodySnippet;
+}
+
+/**
+ * Parses Body from the Request
+ *
+ * @param {Object} body body object from request.
+ * @param {String} indent indentation required for code snippet
+ * @param {trim} trim indicates whether to trim string or not
+ */
+function parseBody (body, indent, trim) {
+  if (!_.isEmpty(body)) {
+    switch (body.mode) {
+      case 'urlencoded':
+        return parseURLEncodedBody(body.urlencoded, indent, trim);
+      case 'raw':
+        return parseRawBody(body.raw, indent, trim);
+      case 'formdata':
+        return parseFormData(body.formdata, indent, trim);
+      case 'file':
+        return '';
+      case 'graphql':
+        return parseGraphQLBody(body.graphql, indent, trim);
+      default:
+        return '<file-content-here>';
+    }
+  }
+  return '';
+}
+
+/**
+ * Parses headers from the request.
+ *
+ * @param {Object} headersArray array containing headers
+ * @param {String} indent indentation required for code snippet
+ * @param {Boolean} trim indicates whether to trim string or not
+ */
+function parseHeaders (headersArray, indent, trim) {
+  var headerString = '',
+    headerDictionary = [];
+  if (_.isEmpty(headersArray)) {
+    return headerString;
+  }
+  headerString = 'NSDictionary *headers = @{\n';
+
+  _.forEach(headersArray, function (header) {
+    if (!header.disabled) {
+      headerDictionary.push(indent + '@"' + header.key + '": @"' + sanitize(header.value, trim) + '"');
+    }
+  });
+  headerString += headerDictionary.join(',\n');
+  headerString += '\n};\n\n';
+  headerString += '[request setAllHTTPHeaderFields:headers];\n';
+  return headerString;
+}
+
+self = module.exports = {
+  convert: function (request, options, callback) {
+    var indent,
+      codeSnippet,
+      requestTimeout,
+      trim;
+    options = sanitizeOptions(options, self.getOptions());
+    trim = options.trimRequestBody;
+    indent = options.indentType === 'tab' ? '\t' : ' ';
+    indent = indent.repeat(options.indentCount);
+
+    requestTimeout = options.requestTimeout / 1000; // Objective-C takes time in seconds.
+
+    if (!_.isFunction(callback)) {
+      throw new Error('Callback is not valid function');
+    }
+
+    if (request.body && !request.headers.has('Content-Type')) {
+      if (request.body.mode === 'file') {
+        request.addHeader({
+          key: 'Content-Type',
+          value: 'text/plain'
+        });
+      }
+      else if (request.body.mode === 'graphql') {
+        request.addHeader({
+          key: 'Content-Type',
+          value: 'application/json'
+        });
+      }
+    }
+
+    // The following code handles multiple files in the same formdata param.
+    // It removes the form data params where the src property is an array of filepath strings
+    // Splits that array into different form data params with src set as a single filepath string
+    if (request.body && request.body.mode === 'formdata') {
+      let formdata = request.body.formdata,
+        formdataArray = [];
+      formdata.members.forEach((param) => {
+        let key = param.key,
+          type = param.type,
+          disabled = param.disabled,
+          contentType = param.contentType;
+        if (type === 'file') {
+          if (typeof param.src !== 'string') {
+            if (Array.isArray(param.src) && param.src.length) {
+              param.src.forEach((filePath) => {
+                addFormParam(formdataArray, key, param.type, filePath, disabled, contentType);
+              });
+            }
+            else {
+              addFormParam(formdataArray, key, param.type, '/path/to/file', disabled, contentType);
+            }
+          }
+          else {
+            addFormParam(formdataArray, key, param.type, param.src, disabled, contentType);
+          }
+        }
+        else {
+          addFormParam(formdataArray, key, param.type, param.value, disabled, contentType);
+        }
+      });
+      request.body.update({
+        mode: 'formdata',
+        formdata: formdataArray
+      });
+    }
+
+    codeSnippet = '#import <Foundation/Foundation.h>\n';
+    options.includeBoilerplate ? codeSnippet += 'int main(int argc, const char * argv[]) {\n' : codeSnippet += '\n';
+    codeSnippet += 'NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"' +
+      encodeURI(request.url.toString()) + '"]\n';
+    codeSnippet += `${indent}cachePolicy:NSURLRequestUseProtocolCachePolicy\n`;
+    codeSnippet += `${indent}timeoutInterval:${requestTimeout}.0];\n`;
+
+    // TODO: use defaultSessionConfiguration
+    // codeSnippet += 'NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];\n';
+
+    codeSnippet += parseHeaders(request.headers.toJSON(), indent, trim);
+    codeSnippet += parseBody(request.body ? request.body.toJSON() : {}, indent, trim) + '\n';
+    codeSnippet += '[request setHTTPMethod:@"' + request.method + '"];\n\n';
+    codeSnippet += 'NSURLSession *session = [NSURLSession sharedSession];\n';
+    codeSnippet += 'NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n';
+    codeSnippet += 'completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n';
+    codeSnippet += `${indent}if (error) {\n`;
+    codeSnippet += `${indent.repeat(2)}NSLog(@"%@", error);\n`;
+    codeSnippet += `${indent}} else {\n`;
+    codeSnippet += `${indent.repeat(2)}NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n`;
+    codeSnippet += `${indent.repeat(2)}NSLog(@"%@", httpResponse);\n`;
+    codeSnippet += `${indent}}\n`;
+    codeSnippet += '}];\n';
+    codeSnippet += '[dataTask resume];';
+    options.includeBoilerplate ? codeSnippet += '\n}' : codeSnippet += '\n';
+
+    callback(null, codeSnippet);
+  },
+  getOptions: function () {
+    return [
+      {
+        name: 'Set indentation count',
+        id: 'indentCount',
+        type: 'positiveInteger',
+        default: 2,
+        description: 'Set the number of indentation characters to add per code level'
+      },
+      {
+        name: 'Set indentation type',
+        id: 'indentType',
+        type: 'enum',
+        availableOptions: ['Tab', 'Space'],
+        default: 'Space',
+        description: 'Select the character used to indent lines of code'
+      },
+      {
+        name: 'Set request timeout',
+        id: 'requestTimeout',
+        type: 'positiveInteger',
+        // Using 10 secs as default
+        // TODO: Find out a way to set infinite timeout.
+        default: 10000,
+        description: 'Set number of milliseconds the request should wait for a response' +
+    ' before timing out (use 0 for infinity)'
+      },
+      {
+        name: 'Trim request body fields',
+        id: 'trimRequestBody',
+        type: 'boolean',
+        default: false,
+        description: 'Remove white space and additional lines that may affect the server\'s response'
+      },
+      {
+        name: 'Include boilerplate',
+        id: 'includeBoilerplate',
+        type: 'boolean',
+        default: false,
+        description: 'Include class definition and import statements in snippet'
+      }
+    ];
+  }
+};
diff --git a/codegens/objective-c/lib/lodash.js b/codegens/objective-c/lib/lodash.js
new file mode 100644
index 0000000..5be147a
--- /dev/null
+++ b/codegens/objective-c/lib/lodash.js
@@ -0,0 +1,455 @@
+/* istanbul ignore next */
+module.exports = {
+
+  /**
+       * Checks if `value` is an empty object, array or string.
+       *
+       * Objects are considered empty if they have no own enumerable string keyed
+       * properties.
+       *
+       * Values such as strings, arrays are considered empty if they have a `length` of `0`.
+       *
+       * @param {*} value The value to check.
+       * @returns {boolean} Returns `true` if `value` is empty, else `false`.
+       * @example
+       *
+       * isEmpty(null)
+       * // => true
+       *
+       * isEmpty(true)
+       * // => true
+       *
+       * isEmpty(1)
+       * // => true
+       *
+       * isEmpty([1, 2, 3])
+       * // => false
+       *
+       * isEmpty('abc')
+       * // => false
+       *
+       * isEmpty({ 'a': 1 })
+       * // => false
+       */
+  isEmpty: function (value) {
+    // eslint-disable-next-line lodash/prefer-is-nil
+    if (value === null || value === undefined) {
+      return true;
+    }
+    if (Array.isArray(value) || typeof value === 'string' || typeof value.splice === 'function') {
+      return !value.length;
+    }
+
+    for (const key in value) {
+      if (Object.prototype.hasOwnProperty.call(value, key)) {
+        return false;
+      }
+    }
+    return true;
+  },
+
+  /**
+       * Checks if `value` is `undefined`.
+       *
+       * @param {*} value The value to check.
+       * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
+       * @example
+       *
+       * isUndefined(void 0)
+       * // => true
+       *
+       * isUndefined(null)
+       * // => false
+       */
+  isUndefined: function (value) {
+    return value === undefined;
+  },
+
+  /**
+       * Checks if `func` is classified as a `Function` object.
+       *
+       * @param {*} func The value to check.
+       * @returns {boolean} Returns `true` if `func` is a function, else `false`.
+       * @example
+       *
+       * isFunction(self.isEmpty)
+       * // => true
+       *
+       * isFunction(/abc/)
+       * // => false
+       */
+  isFunction: function (func) {
+    return typeof func === 'function';
+  },
+
+  /**
+       * Converts the first character of `string` to upper case and the remaining
+       * to lower case.
+       *
+       * @param {string} [string=''] The string to capitalize.
+       * @returns {string} Returns the capitalized string.
+       * @example
+       *
+       * capitalize('FRED')
+       * // => 'Fred'
+       *
+       * capitalize('john')
+       * // => 'John'
+       */
+
+  capitalize: function (string) {
+    return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
+  },
+
+  /**
+       * Reduces `array` to a value which is the accumulated result of running
+       * each element in `array` thru `iteratee`, where each successive
+       * invocation is supplied the return value of the previous. If `accumulator`
+       * is not given, the first element of `array` is used as the initial
+       * value. The iteratee is invoked with four arguments:
+       * (accumulator, value, index|key, array).
+       *
+       * @param {Array} array The Array to iterate over.
+       * @param {Function} iteratee The function invoked per iteration.
+       * @param {*} [accumulator] The initial value.
+       * @returns {*} Returns the accumulated value.
+       * @example
+       *
+       * reduce([1, 2], (sum, n) => sum + n, 0)
+       * // => 3
+       *
+       */
+  reduce: function (array, iteratee, accumulator) {
+    return array.reduce(iteratee, accumulator);
+  },
+
+  /**
+       * Iterates over elements of `array`, returning an array of all elements
+       * `predicate` returns truthy for. The predicate is invoked with three
+       * arguments: (value, index, array).
+       *
+       * @param {Array} array The array to iterate over.
+       * @param {Function|object} predicate The function/object invoked per iteration.
+       * @returns {Array} Returns the new filtered array.
+       * @example
+       *
+       * const users = [
+          *   { 'user': 'barney', 'active': true },
+          *   { 'user': 'fred',   'active': false }
+          * ]
+          *
+          * filter(users, ({ active }) => active)
+          * // => object for ['barney']
+          */
+  filter: function (array, predicate) {
+    if (typeof predicate === 'function') {
+      return array.filter(predicate);
+    }
+    var key = Object.keys(predicate),
+      val = predicate[key],
+      res = [];
+    array.forEach(function (item) {
+      if (item[key] && item[key] === val) {
+        res.push(item);
+      }
+    });
+    return res;
+  },
+
+  /**
+       * The opposite of `filter` this method returns the elements of `array`
+       * that `predicate` does **not** return truthy for.
+       *
+       * @param {Array} array collection to iterate over.
+       * @param {String} predicate The String that needs to have truthy value, invoked per iteration.
+       * @returns {Array} Returns the new filtered array.
+       * @example
+       *
+       * const users = [
+          *   { 'user': 'barney', 'active': true },
+          *   { 'user': 'fred',   'active': false }
+          * ]
+          *
+          * reject(users, 'active')
+          * // => object for ['fred']
+          */
+  reject: function (array, predicate) {
+    var res = [];
+    array.forEach((object) => {
+      if (!object[predicate]) {
+        res.push(object);
+      }
+    });
+    return res;
+  },
+
+  /**
+       * Creates an array of values by running each element of `array` thru `iteratee`.
+       * The iteratee is invoked with three arguments: (value, index, array).
+       *
+       * @param {Array} array The array to iterate over.
+       * @param {Function} iteratee The function invoked per iteration.
+       * @returns {Array} Returns the new mapped array.
+       * @example
+       *
+       * function square(n) {
+          *   return n * n
+          * }
+          *
+          * map([4, 8], square)
+          * // => [16, 64]
+          */
+  map: function (array, iteratee) {
+    return array.map(iteratee);
+  },
+
+  /**
+       * Iterates over elements of `collection` and invokes `iteratee` for each element.
+       * The iteratee is invoked with three arguments: (value, index|key, collection).
+       *
+       * @param {Array|Object} collection The collection to iterate over.
+       * @param {Function} iteratee The function invoked per iteration.
+       * @returns {Array|Object} Returns `collection`.
+       * @example
+       *
+       * forEach([1, 2], value => console.log(value))
+       * // => Logs `1` then `2`.
+       *
+       * forEach({ 'a': 1, 'b': 2 }, (value, key) => console.log(key))
+       * // => Logs 'a' then 'b'
+       */
+
+  forEach: function (collection, iteratee) {
+    if (collection === null) {
+      return null;
+    }
+
+    if (Array.isArray(collection)) {
+      return collection.forEach(iteratee);
+    }
+    const iterable = Object(collection),
+      props = Object.keys(collection);
+    var index = -1,
+      key, i;
+
+    for (i = 0; i < props.length; i++) {
+      key = props[++index];
+      iteratee(iterable[key], key, iterable);
+    }
+    return collection;
+  },
+
+  /**
+       * Checks if `value` is in `collection`. If `collection` is a string, it's
+       * checked for a substring of `value`, otherwise it checks if the `value` is present
+       * as a key in a `collection` object.
+       *
+       * @param {Array|Object|string} collection The collection to inspect.
+       * @param {*} value The value to search for.
+       * @returns {boolean} Returns `true` if `value` is found, else `false`.
+       * @example
+       *
+       * _.includes([1, 2, 3], 1);
+       * // => true
+       *
+       * _.includes({ 'a': 1, 'b': 2 }, 1);
+       * // => true
+       *
+       * _.includes('abcd', 'bc');
+       * // => true
+       */
+  includes: function (collection, value) {
+    if (Array.isArray(collection) || typeof collection === 'string') {
+      return collection.includes(value);
+    }
+    for (var key in collection) {
+      if (collection.hasOwnProperty(key)) {
+        if (collection[key] === value) {
+          return true;
+        }
+      }
+    }
+    return false;
+  },
+
+  /**
+       * Gets the size of `collection` by returning its length for array and strings.
+       * For objects it returns the number of enumerable string keyed
+       * properties.
+       *
+       * @param {Array|Object|string} collection The collection to inspect.
+       * @returns {number} Returns the collection size.
+       * @example
+       *
+       * size([1, 2, 3])
+       * // => 3
+       *
+       * size({ 'a': 1, 'b': 2 })
+       * // => 2
+       *
+       * size('pebbles')
+       * // => 7
+       */
+  size: function (collection) {
+    // eslint-disable-next-line lodash/prefer-is-nil
+    if (collection === null || collection === undefined) {
+      return 0;
+    }
+    if (Array.isArray(collection) || typeof collection === 'string') {
+      return collection.length;
+    }
+
+    return Object.keys(collection).length;
+  },
+
+  /**
+       * Converts all elements in `array` into a string separated by `separator`.
+       *
+       * @param {Array} array The array to convert.
+       * @param {string} [separator=','] The element separator.
+       * @returns {string} Returns the joined string.
+       * @example
+       *
+       * _.join(['a', 'b', 'c'], '~');
+       * // => 'a~b~c'
+       */
+  join: function (array, separator) {
+    if (array === null) {
+      return '';
+    }
+    return array.join(separator);
+  },
+
+  /**
+       * Removes trailing whitespace or specified characters from `string`.
+       *
+       * @param {string} [string=''] The string to trim.
+       * @param {string} [chars=whitespace] The characters to trim.
+       * @returns {string} Returns the trimmed string.
+       * @example
+       *
+       * trimEnd('  abc  ')
+       * // => '  abc'
+       *
+       * trimEnd('-_-abc-_-', '_-')
+       * // => '-_-abc'
+       */
+  trimEnd: function (string, chars) {
+    if (!string) {
+      return '';
+    }
+    if (string && !chars) {
+      return string.replace(/\s*$/, '');
+    }
+    chars += '$';
+    return string.replace(new RegExp(chars, 'g'), '');
+  },
+
+  /**
+       * Returns the index of the first
+       * element `predicate` returns truthy for.
+       *
+       * @param {Array} array The array to inspect.
+       * @param {Object} predicate The exact object to be searched for in the array.
+       * @returns {number} Returns the index of the found element, else `-1`.
+       * @example
+       *
+       * var users = [
+          *   { 'user': 'barney',  'active': false },
+          *   { 'user': 'fred',    'active': false },
+          *   { 'user': 'pebbles', 'active': true }
+          * ];
+          *
+          * _.findIndex(users, { 'user': 'fred', 'active': false });
+          * // => 1
+          *
+          * _.findIndex(users, {'active' : false});
+          * // => 0
+          *
+          */
+  findIndex: function (array, predicate) {
+    var length = array === null ? 0 : array.length,
+      index = -1,
+      keys = Object.keys(predicate),
+      found, i;
+    if (!length) {
+      return -1;
+    }
+    for (i = 0; i < array.length; i++) {
+      found = true;
+      // eslint-disable-next-line no-loop-func
+      keys.forEach((key) => {
+        if (!(array[i][key] && array[i][key] === predicate[key])) {
+          found = false;
+        }
+      });
+      if (found) {
+        index = i;
+        break;
+      }
+    }
+    return index;
+  },
+
+  /**
+       * Gets the value at `path` of `object`. If the resolved value is
+       * `undefined`, the `defaultValue` is returned in its place.
+       *
+       * @param {Object} object The object to query.
+       * @param {string} path The path of the property to get.
+       * @param {*} [defaultValue] The value returned for `undefined` resolved values.
+       * @returns {*} Returns the resolved value.
+       * @example
+       *
+       * const object = { a: {b : 'c'} }
+       *
+       *
+       * get(object, 'a.b.c', 'default')
+       * // => 'default'
+       *
+       * get(object, 'a.b', 'default')
+       * // => 'c'
+       */
+  get: function (object, path, defaultValue) {
+    if (object === null) {
+      return undefined;
+    }
+    var arr = path.split('.'),
+      res = object,
+      i;
+    for (i = 0; i < arr.length; i++) {
+      res = res[arr[i]];
+      if (res === undefined) {
+        return defaultValue;
+      }
+    }
+    return res;
+  },
+
+  /**
+       * Checks if `predicate` returns truthy for **all** elements of `array`.
+       * Iteration is stopped once `predicate` returns falsey. The predicate is
+       * invoked with three arguments: (value, index, array).
+       *
+       * @param {Array} array The array to iterate over.
+       * @param {Function} predicate The function invoked per iteration.
+       * @returns {boolean} Returns `true` if all elements pass the predicate check,
+       *  else `false`.
+       * @example
+       *
+       * every([true, 1, null, 'yes'], Boolean)
+       * // => false
+       */
+  every: function (array, predicate) {
+    var index = -1,
+      length = array === null ? 0 : array.length;
+
+    while (++index < length) {
+      if (!predicate(array[index], index, array)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+};
diff --git a/codegens/objective-c/lib/util.js b/codegens/objective-c/lib/util.js
new file mode 100644
index 0000000..398d699
--- /dev/null
+++ b/codegens/objective-c/lib/util.js
@@ -0,0 +1,118 @@
+module.exports = {
+  /**
+     * sanitizes input string by handling escape characters eg: converts '''' to '\'\''
+     * and trim input if required
+     *
+     * @param {String} inputString
+     * @param {Boolean} [trim] - indicates whether to trim string or not
+     * @returns {String}
+     */
+  sanitize: function (inputString, trim) {
+    if (typeof inputString !== 'string') {
+      return '';
+    }
+    inputString = inputString.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n');
+    return trim ? inputString.trim() : inputString;
+
+  },
+
+  /**
+    * sanitizes input options
+    *
+    * @param {Object} options - Options provided by the user
+    * @param {Array} optionsArray - options array received from getOptions function
+    *
+    * @returns {Object} - Sanitized options object
+    */
+  sanitizeOptions: function (options, optionsArray) {
+    var result = {},
+      defaultOptions = {},
+      id;
+    optionsArray.forEach((option) => {
+      defaultOptions[option.id] = {
+        default: option.default,
+        type: option.type
+      };
+      if (option.type === 'enum') {
+        defaultOptions[option.id].availableOptions = option.availableOptions;
+      }
+    });
+
+    for (id in options) {
+      if (options.hasOwnProperty(id)) {
+        if (defaultOptions[id] === undefined) {
+          continue;
+        }
+        switch (defaultOptions[id].type) {
+          case 'boolean':
+            if (typeof options[id] !== 'boolean') {
+              result[id] = defaultOptions[id].default;
+            }
+            else {
+              result[id] = options[id];
+            }
+            break;
+          case 'positiveInteger':
+            if (typeof options[id] !== 'number' || options[id] < 0) {
+              result[id] = defaultOptions[id].default;
+            }
+            else {
+              result[id] = options[id];
+            }
+            break;
+          case 'enum':
+            if (!defaultOptions[id].availableOptions.includes(options[id])) {
+              result[id] = defaultOptions[id].default;
+            }
+            else {
+              result[id] = options[id];
+            }
+            break;
+          default:
+            result[id] = options[id];
+        }
+      }
+    }
+
+    for (id in defaultOptions) {
+      if (defaultOptions.hasOwnProperty(id)) {
+        if (result[id] === undefined) {
+          result[id] = defaultOptions[id].default;
+        }
+      }
+    }
+    return result;
+  },
+
+  /**
+   *
+   * @param {Array} array - form data array
+   * @param {String} key - key of form data param
+   * @param {String} type - type of form data param(file/text)
+   * @param {String} val - value/src property of form data param
+   * @param {String} disabled - Boolean denoting whether the param is disabled or not
+   * @param {String} contentType - content type header of the param
+   *
+   * Appends a single param to form data array
+ */
+  addFormParam: function (array, key, type, val, disabled, contentType) {
+    if (type === 'file') {
+      array.push({
+        key: key,
+        type: type,
+        src: val,
+        disabled: disabled,
+        contentType: contentType
+      });
+    }
+    else {
+      array.push({
+        key: key,
+        type: type,
+        value: val,
+        disabled: disabled,
+        contentType: contentType
+      });
+    }
+  }
+};
diff --git a/codegens/objective-c/npm-shrinkwrap.json b/codegens/objective-c/npm-shrinkwrap.json
new file mode 100644
index 0000000..cb94060
--- /dev/null
+++ b/codegens/objective-c/npm-shrinkwrap.json
@@ -0,0 +1,402 @@
+{
+  "name": "objective-c",
+  "version": "0.0.1",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "dev": true
+    },
+    "chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      }
+    },
+    "charset": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz",
+      "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==",
+      "dev": true
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "dev": true
+    },
+    "dom-serializer": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^2.0.1",
+        "entities": "^2.0.0"
+      },
+      "dependencies": {
+        "domelementtype": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
+          "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
+          "dev": true
+        },
+        "entities": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
+          "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==",
+          "dev": true
+        }
+      }
+    },
+    "domelementtype": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+      "dev": true
+    },
+    "domhandler": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+      "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1"
+      }
+    },
+    "domutils": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+      "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+      "dev": true,
+      "requires": {
+        "dom-serializer": "0",
+        "domelementtype": "1"
+      }
+    },
+    "entities": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+      "dev": true
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+      "dev": true
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
+    },
+    "faker": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/faker/-/faker-4.1.0.tgz",
+      "integrity": "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=",
+      "dev": true
+    },
+    "file-type": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
+      "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=",
+      "dev": true
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "dev": true
+    },
+    "htmlparser2": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+      "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^1.3.1",
+        "domhandler": "^2.3.0",
+        "domutils": "^1.5.1",
+        "entities": "^1.1.1",
+        "inherits": "^2.0.1",
+        "readable-stream": "^3.1.1"
+      }
+    },
+    "http-reasons": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz",
+      "integrity": "sha1-qVPKZwB4Zp3eFCzomUAbnW6F07Q=",
+      "dev": true
+    },
+    "iconv-lite": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz",
+      "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true
+    },
+    "liquid-json": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz",
+      "integrity": "sha1-kVWhgTbYprJhXl8W+aJEira1Duo=",
+      "dev": true
+    },
+    "lodash": {
+      "version": "4.17.15",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+      "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+      "dev": true
+    },
+    "lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+      "dev": true
+    },
+    "lodash.escaperegexp": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
+      "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=",
+      "dev": true
+    },
+    "lodash.isplainobject": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+      "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
+      "dev": true
+    },
+    "lodash.isstring": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+      "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=",
+      "dev": true
+    },
+    "lodash.mergewith": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
+      "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
+      "dev": true
+    },
+    "marked": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz",
+      "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==",
+      "dev": true
+    },
+    "mime-db": {
+      "version": "1.40.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
+      "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
+      "dev": true
+    },
+    "mime-format": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.0.tgz",
+      "integrity": "sha1-4p+IkeKE14JwJG8AUNaDS9u+EzI=",
+      "dev": true,
+      "requires": {
+        "charset": "^1.0.0"
+      }
+    },
+    "mime-types": {
+      "version": "2.1.24",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
+      "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
+      "dev": true,
+      "requires": {
+        "mime-db": "1.40.0"
+      }
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+      "dev": true
+    },
+    "postcss": {
+      "version": "7.0.21",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz",
+      "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.2",
+        "source-map": "^0.6.1",
+        "supports-color": "^6.1.0"
+      },
+      "dependencies": {
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postman-collection": {
+      "version": "3.5.4",
+      "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-3.5.4.tgz",
+      "integrity": "sha512-ugC8oN6gED+6W1eK5pAp6fHW7oDu4vb+b980+sDfHiCm/AHCBhEzmfiTZnk16gkKeiX8XlCzw5bPXkyhqcBP2w==",
+      "dev": true,
+      "requires": {
+        "escape-html": "1.0.3",
+        "faker": "4.1.0",
+        "file-type": "3.9.0",
+        "http-reasons": "0.1.0",
+        "iconv-lite": "0.5.0",
+        "liquid-json": "0.3.1",
+        "lodash": "4.17.15",
+        "marked": "0.7.0",
+        "mime-format": "2.0.0",
+        "mime-types": "2.1.24",
+        "postman-url-encoder": "1.0.2",
+        "sanitize-html": "1.20.1",
+        "semver": "6.3.0",
+        "uuid": "3.3.3"
+      }
+    },
+    "postman-url-encoder": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-1.0.2.tgz",
+      "integrity": "sha512-PBGPIJnm9dqyUST/oX9mxTxT5seqWS4AdzAhGt4judiOh7xT4leTv2CLoGtHXUCHFuLLp9h9wDGAMN7Cm0Znyw==",
+      "dev": true
+    },
+    "readable-stream": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
+      "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
+      "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+      "dev": true
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true
+    },
+    "sanitize-html": {
+      "version": "1.20.1",
+      "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.20.1.tgz",
+      "integrity": "sha512-txnH8TQjaQvg2Q0HY06G6CDJLVYCpbnxrdO0WN8gjCKaU5J0KbyGYhZxx5QJg3WLZ1lB7XU9kDkfrCXUozqptA==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.1",
+        "htmlparser2": "^3.10.0",
+        "lodash.clonedeep": "^4.5.0",
+        "lodash.escaperegexp": "^4.1.2",
+        "lodash.isplainobject": "^4.0.6",
+        "lodash.isstring": "^4.0.1",
+        "lodash.mergewith": "^4.6.1",
+        "postcss": "^7.0.5",
+        "srcset": "^1.0.0",
+        "xtend": "^4.0.1"
+      }
+    },
+    "semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "dev": true
+    },
+    "source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "dev": true
+    },
+    "srcset": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz",
+      "integrity": "sha1-pWad4StC87HV6D7QPHEEb8SPQe8=",
+      "dev": true,
+      "requires": {
+        "array-uniq": "^1.0.2",
+        "number-is-nan": "^1.0.0"
+      }
+    },
+    "string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
+    },
+    "uuid": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
+      "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==",
+      "dev": true
+    },
+    "xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "dev": true
+    }
+  }
+}
diff --git a/codegens/objective-c/package.json b/codegens/objective-c/package.json
new file mode 100644
index 0000000..7339bb5
--- /dev/null
+++ b/codegens/objective-c/package.json
@@ -0,0 +1,34 @@
+{
+  "name": "@postman/codegen-objective-c",
+  "version": "0.0.1",
+  "description": "Converts Postman SDK Requests to swift code snippet",
+  "main": "index.js",
+  "com_postman_plugin": {
+    "type": "code_generator",
+    "lang": "Objective-C",
+    "variant": "NSURLSession",
+    "syntax_mode": "objectivec"
+  },
+  "directories": {
+    "lib": "lib",
+    "test": "test"
+  },
+  "scripts": {
+    "test": "node npm/test.js",
+    "test-lint": "node npm/test-lint.js",
+    "test-unit": "node npm/test-unit.js",
+    "test-newman": "node npm/test-newman.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": ""
+  },
+  "author": "Postman Labs <help@getpostman.com>",
+  "license": "Apache-2.0",
+  "homepage": "https://github.com/postmanlabs/code-generators/tree/master/codegens/objective-c",
+  "dependencies": {},
+  "devDependencies": {},
+  "engines": {
+    "node": ">=8"
+  }
+}


Test patch:
diff --git a/codegens/objective-c/npm/test-lint.js b/codegens/objective-c/npm/test-lint.js
new file mode 100644
index 0000000..59ae3a0
--- /dev/null
+++ b/codegens/objective-c/npm/test-lint.js
@@ -0,0 +1,59 @@
+#!/usr/bin/env node
+require('shelljs/global');
+
+var chalk = require('chalk'),
+  async = require('async'),
+  ESLintCLIEngine = require('eslint').CLIEngine,
+
+  /**
+     * The list of source code files / directories to be linted.
+     *
+     * @type {Array}
+     */
+  LINT_SOURCE_DIRS = [
+    './lib',
+    './bin',
+    './test',
+    './examples/*.js',
+    './npm/*.js',
+    './index.js'
+  ];
+
+module.exports = function (exit) {
+  // banner line
+  console.info(chalk.yellow.bold('\nLinting files using eslint...'));
+
+  async.waterfall([
+
+    /**
+         * Instantiates an ESLint CLI engine and runs it in the scope defined within LINT_SOURCE_DIRS.
+         *
+         * @param {Function} next - The callback function whose invocation marks the end of the lint test run.
+         * @returns {*}
+         */
+    function (next) {
+      next(null, (new ESLintCLIEngine()).executeOnFiles(LINT_SOURCE_DIRS));
+    },
+
+    /**
+         * Processes a test report from the Lint test runner, and displays meaningful results.
+         *
+         * @param {Object} report - The overall test report for the current lint test.
+         * @param {Object} report.results - The set of test results for the current lint run.
+         * @param {Function} next - The callback whose invocation marks the completion of the post run tasks.
+         * @returns {*}
+         */
+    function (report, next) {
+      var errorReport = ESLintCLIEngine.getErrorResults(report.results);
+      // log the result to CLI
+      console.info(ESLintCLIEngine.getFormatter()(report.results));
+      // log the success of the parser if it has no errors
+      (errorReport && !errorReport.length) && console.info(chalk.green('eslint ok!'));
+      // ensure that the exit code is non zero in case there was an error
+      next(Number(errorReport && errorReport.length) || 0);
+    }
+  ], exit);
+};
+
+// ensure we run this script exports if this is a direct stdin.tty run
+!module.parent && module.exports(exit);
diff --git a/codegens/objective-c/npm/test-unit.js b/codegens/objective-c/npm/test-unit.js
new file mode 100644
index 0000000..1bd787a
--- /dev/null
+++ b/codegens/objective-c/npm/test-unit.js
@@ -0,0 +1,59 @@
+#!/usr/bin/env node
+/* eslint-env node, es6 */
+// ---------------------------------------------------------------------------------------------------------------------
+// This script is intended to execute all unit tests.
+// ---------------------------------------------------------------------------------------------------------------------
+
+require('shelljs/global');
+
+// set directories and files for test and coverage report
+var path = require('path'),
+
+  NYC = require('nyc'),
+  chalk = require('chalk'),
+  recursive = require('recursive-readdir'),
+
+  COV_REPORT_PATH = '.coverage',
+  SPEC_SOURCE_DIR = path.join(__dirname, '..', 'test', 'unit');
+
+module.exports = function (exit) {
+  // banner line
+  console.info(chalk.yellow.bold('Running unit tests using mocha on node...'));
+
+  test('-d', COV_REPORT_PATH) && rm('-rf', COV_REPORT_PATH);
+  mkdir('-p', COV_REPORT_PATH);
+
+  var Mocha = require('mocha'),
+    nyc = new NYC({
+      reportDir: COV_REPORT_PATH,
+      tempDirectory: COV_REPORT_PATH,
+      reporter: ['text', 'lcov', 'text-summary'],
+      exclude: ['config', 'test'],
+      hookRunInContext: true,
+      hookRunInThisContext: true
+    });
+
+  nyc.wrap();
+  // add all spec files to mocha
+  recursive(SPEC_SOURCE_DIR, function (err, files) {
+    if (err) { console.error(err); return exit(1); }
+
+    var mocha = new Mocha({ timeout: 1000 * 60 });
+
+    files.filter(function (file) { // extract all test files
+      return (file.substr(-8) === '.test.js');
+    }).forEach(mocha.addFile.bind(mocha));
+
+    mocha.run(function (runError) {
+      runError && console.error(runError.stack || runError);
+
+      nyc.reset();
+      nyc.writeCoverageFile();
+      nyc.report();
+      exit(runError ? 1 : 0);
+    });
+  });
+};
+
+// ensure we run this script exports if this is a direct stdin.tty run
+!module.parent && module.exports(exit);
diff --git a/codegens/objective-c/npm/test.js b/codegens/objective-c/npm/test.js
new file mode 100644
index 0000000..b2aa6d8
--- /dev/null
+++ b/codegens/objective-c/npm/test.js
@@ -0,0 +1,19 @@
+#!/usr/bin/env node
+var chalk = require('chalk'),
+  exit = require('shelljs').exit,
+  prettyms = require('pretty-ms'),
+  startedAt = Date.now(),
+  name = require('../package.json').name;
+
+require('async').series([
+  require('./test-lint'),
+  require('./test-unit')
+  // Add a separate folder for every new suite of tests
+  // require('./test-unit')
+  // require('./test-browser')
+  // require('./test-integration')
+], function (code) {
+  // eslint-disable-next-line max-len
+  console.info(chalk[code ? 'red' : 'green'](`\n${name}: duration ${prettyms(Date.now() - startedAt)}\n${name}: ${code ? 'not ok' : 'ok'}!`));
+  exit(code && (typeof code === 'number' ? code : 1) || 0);
+});
diff --git a/codegens/objective-c/test/unit/convert.test.js b/codegens/objective-c/test/unit/convert.test.js
new file mode 100644
index 0000000..bd5f881
--- /dev/null
+++ b/codegens/objective-c/test/unit/convert.test.js
@@ -0,0 +1,161 @@
+var convert = require('../../index').convert,
+  expect = require('chai').expect,
+  collection = require('./fixtures/collection.json'),
+  sdk = require('postman-collection'),
+  expectedSnippets = require('./fixtures/snippets.json');
+
+describe('Objective-C-NSURLSession Converter', function () {
+  describe('convert for different request types', function () {
+    collection.item.forEach((item) => {
+      it(item.name, function (done) {
+        const request = new sdk.Request(item.request);
+        convert(request, {}, (err, snippet) => {
+          if (err) {
+            expect.fail(null, null, err);
+            return done();
+          }
+          expect(snippet).to.equal(expectedSnippets[item.name]);
+          return done();
+        });
+      });
+    });
+  });
+});
+
+describe('Options Tests', function () {
+  it('should indent snippet with type and count specified', function () {
+    var request = new sdk.Request(collection.item[0].request);
+    convert(request, {
+      indentType: 'Tab',
+      indentCount: 2
+    }, function (error, snippet) {
+      if (error) {
+        expect.fail(null, null, error);
+      }
+      expect(snippet).to.be.a('string');
+      var snippetArray = snippet.split('\n'),
+        i;
+      for (i = 0; i < snippetArray.length; i++) {
+        if (snippetArray[i].startsWith('cachePolicy:NSURLRequestUseProtocolCachePolicy')) {
+          expect(snippetArray[i + 1].charAt(0)).to.equal('\t');
+          expect(snippetArray[i + 1].charAt(1)).to.equal('\t');
+          expect(snippetArray[i + 1].charAt(2)).to.not.equal(' ');
+        }
+      }
+    });
+  });
+
+  it('should use all the default options', function () {
+    var request = new sdk.Request({
+      'method': 'POST',
+      'header': [],
+      'body': {
+        'mode': 'raw',
+        'raw': '  trim this body  '
+      },
+      'url': {
+        'raw': 'https://postman-echo.com/post',
+        'protocol': 'https',
+        'host': [
+          'postman-echo',
+          'com'
+        ],
+        'path': [
+          'post'
+        ]
+      }
+    });
+    convert(request, {}, function (error, snippet) {
+      if (error) {
+        expect.fail(null, null, error);
+      }
+      expect(snippet).to.be.a('string');
+      var snippetArray = snippet.split('\n'),
+        i;
+      for (i = 0; i < snippetArray.length; i++) {
+        if (snippetArray[i].startsWith('cachePolicy:NSURLRequestUseProtocolCachePolicy')) {
+          expect(snippetArray[i + 1].charAt(0)).to.equal(' ');
+          expect(snippetArray[i + 1].charAt(1)).to.equal(' ');
+          expect(snippet).to.include('timeoutInterval:10');
+          expect(snippet).to.include('  trim this body  ');
+        }
+      }
+    });
+  });
+
+  it('should add code for requestTimeout option', function () {
+    var request = new sdk.Request(collection.item[0].request);
+    convert(request, {
+      requestTimeout: 5000
+    }, function (error, snippet) {
+      if (error) {
+        expect.fail(null, null, error);
+      }
+      expect(snippet).to.be.a('string');
+      expect(snippet).to.include('timeoutInterval:5');
+    });
+  });
+
+  it('should trim request body when trimRequestBody is set to true', function () {
+    var request = new sdk.Request({
+      'method': 'POST',
+      'header': [],
+      'body': {
+        'mode': 'raw',
+        'raw': '  trim this body  '
+      },
+      'url': {
+        'raw': 'https://postman-echo.com/post',
+        'protocol': 'https',
+        'host': [
+          'postman-echo',
+          'com'
+        ],
+        'path': [
+          'post'
+        ]
+      }
+    });
+    convert(request, {
+      trimRequestBody: true
+    }, function (error, snippet) {
+      if (error) {
+        expect.fail(null, null, error);
+      }
+      expect(snippet).to.be.a('string');
+      expect(snippet).to.not.include('  trim this body  ');
+      expect(snippet).to.include('trim this body');
+    });
+  });
+
+  it('should include boiler plate if includeBoilerplate is set to true', function () {
+    var request = new sdk.Request({
+      'method': 'POST',
+      'header': [],
+      'body': {
+        'mode': 'raw',
+        'raw': '  trim this body  '
+      },
+      'url': {
+        'raw': 'https://postman-echo.com/post',
+        'protocol': 'https',
+        'host': [
+          'postman-echo',
+          'com'
+        ],
+        'path': [
+          'post'
+        ]
+      }
+    });
+    convert(request, {
+      includeBoilerplate: true
+    }, function (error, snippet) {
+      if (error) {
+        expect.fail(null, null, error);
+      }
+      expect(snippet).to.be.a('string');
+      expect(snippet).to.include('int main(int argc, const char * argv[])');
+    });
+  });
+});
diff --git a/codegens/objective-c/test/unit/fixtures/collection.json b/codegens/objective-c/test/unit/fixtures/collection.json
new file mode 100644
index 0000000..336aee8
--- /dev/null
+++ b/codegens/objective-c/test/unit/fixtures/collection.json
@@ -0,0 +1,1321 @@
+{
+	"info": {
+		"_postman_id": "f52ee07d-6345-4220-89af-e6696b3c0122",
+		"name": "Code-Gen Test Cases",
+		"description": "This collection contains requests that will be used to test validity of plugin created to convert postman request into code snippet of particular language.",
+		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
+	},
+	"item": [
+		{
+			"name": "Request Headers",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "a402fc3d-0dac-4471-8505-6df9166afbbf",
+						"exec": [
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "my-sample-header",
+						"value": "Lorem ipsum dolor sit amet"
+					},
+					{
+						"key": "testing",
+						"value": "'singlequotes'"
+					},
+					{
+						"key": "TEST",
+						"value": "\"doublequotes\""
+					}
+				],
+				"url": {
+					"raw": "https://mockbin.org/request",
+					"protocol": "https",
+					"host": [
+						"mockbin",
+						"org"
+					],
+					"path": [
+						"request"
+					]
+				},
+				"description": "A `GET` request to this endpoint returns the list of all request headers as part of the response JSON.\nIn Postman, sending your own set of headers through the [Headers tab](https://www.getpostman.com/docs/requests#headers?source=echo-collection-app-onboarding) will reveal the headers as part of the response."
+			},
+			"response": []
+		},
+		{
+			"name": "Request Headers (With special Characters)",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "34edbfa7-7d32-42d6-8397-af2378c3aaa4",
+						"exec": [
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "GET",
+				"header": [
+					{
+						"key": "my-sample-header",
+						"value": "Lorem ipsum dolor sit amet"
+					},
+					{
+						"key": "TEST",
+						"value": "@#$%^&*()"
+					},
+					{
+						"key": "more",
+						"value": ",./';[]}{\":?><|\\\\"
+					}
+				],
+				"url": {
+					"raw": "https://postman-echo.com/headers",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"headers"
+					]
+				},
+				"description": "A `GET` request to this endpoint returns the list of all request headers as part of the response JSON.\nIn Postman, sending your own set of headers through the [Headers tab](https://www.getpostman.com/docs/requests#headers?source=echo-collection-app-onboarding) will reveal the headers as part of the response."
+			},
+			"response": []
+		},
+		{
+			"name": "Request Headers with disabled headers",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "e150d55b-0273-430a-9e1d-11969b433734",
+						"exec": [
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "GET",
+				"header": [
+					{
+						"key": "my-sample-header",
+						"value": "Lorem ipsum dolor sit amet"
+					},
+					{
+						"key": "not-disabled-header",
+						"value": "ENABLED"
+					},
+					{
+						"key": "disabled header",
+						"value": "DISABLED",
+						"disabled": true
+					}
+				],
+				"url": {
+					"raw": "https://postman-echo.com/headers",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"headers"
+					]
+				},
+				"description": "A `GET` request to this endpoint returns the list of all request headers as part of the response JSON.\nIn Postman, sending your own set of headers through the [Headers tab](https://www.getpostman.com/docs/requests#headers?source=echo-collection-app-onboarding) will reveal the headers as part of the response."
+			},
+			"response": []
+		},
+		{
+			"name": "GET Request with disabled query",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "1bfe1fc3-c244-4a42-83c5-1a0d94d56ffd",
+						"exec": [
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "GET",
+				"header": [],
+				"url": {
+					"raw": "https://postman-echo.com/get?test=123&anotherone=232",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"get"
+					],
+					"query": [
+						{
+							"key": "test",
+							"value": "123"
+						},
+						{
+							"key": "anotherone",
+							"value": "232"
+						},
+						{
+							"key": "anotheroneone",
+							"value": "sdfsdf",
+							"disabled": true
+						}
+					]
+				},
+				"description": "The HTTP `GET` request method is meant to retrieve data from a server. The data\nis identified by a unique URI (Uniform Resource Identifier). \n\nA `GET` request can pass parameters to the server using \"Query String \nParameters\". For example, in the following request,\n\n> http://example.com/hi/there?hand=wave\n\nThe parameter \"hand\" has the value \"wave\".\n\nThis endpoint echoes the HTTP headers, request parameters and the complete\nURI requested."
+			},
+			"response": []
+		},
+		{
+			"name": "POST form data with special characters",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "111c859c-4a8c-41e6-b404-9c404609811b",
+						"exec": [
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [],
+				"body": {
+					"mode": "formdata",
+					"formdata": [
+						{
+							"key": "pl",
+							"value": "'a'",
+							"type": "text"
+						},
+						{
+							"key": "qu",
+							"value": "\"b\"",
+							"type": "text"
+						},
+						{
+							"key": "hdjkljh",
+							"value": "c",
+							"type": "text"
+						},
+						{
+							"key": "sa",
+							"value": "d",
+							"type": "text"
+						},
+						{
+							"key": "Special",
+							"value": "!@#$%&*()^_+=`~",
+							"type": "text"
+						},
+						{
+							"key": "Not Select",
+							"value": "Disabled",
+							"type": "text",
+							"disabled": true
+						},
+						{
+							"key": "more",
+							"value": ",./';[]}{\":?><|\\\\",
+							"type": "text"
+						}
+					]
+				},
+				"url": {
+					"raw": "https://postman-echo.com/post",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"post"
+					]
+				},
+				"description": "The HTTP `POST` request method is meant to transfer data to a server \n(and elicit a response). What data is returned depends on the implementation\nof the server.\n\nA `POST` request can pass parameters to the server using \"Query String \nParameters\", as well as the Request Body. For example, in the following request,\n\n> POST /hi/there?hand=wave\n>\n> <request-body>\n\nThe parameter \"hand\" has the value \"wave\". The request body can be in multiple\nformats. These formats are defined by the MIME type of the request. The MIME \nType can be set using the ``Content-Type`` HTTP header. The most commonly used \nMIME types are:\n\n* `multipart/form-data`\n* `application/x-www-form-urlencoded`\n* `application/json`\n\nThis endpoint echoes the HTTP headers, request parameters, the contents of\nthe request body and the complete URI requested."
+			},
+			"response": []
+		},
+		{
+			"name": "Resolve URL (Quotes + Special Characters) Copy",
+			"request": {
+				"method": "POST",
+				"header": [],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": "https://postman-echo.com/:action?a=!@$^*()_-`%26&b=,./';[]}{\":/?><||",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						":action"
+					],
+					"query": [
+						{
+							"key": "a",
+							"value": "!@$^*()_-`%26"
+						},
+						{
+							"key": "b",
+							"value": ",./';[]}{\":/?><||"
+						}
+					],
+					"variable": [
+						{
+							"key": "action",
+							"value": "post"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "POST Raw Text",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "a3ddecd1-e89d-426d-995c-0d6a678caa91",
+						"exec": [
+							"var responseJSON;",
+							"",
+							"try { ",
+							"    responseJSON = JSON.parse(responseBody); ",
+							"    tests['response is valid JSON'] = true;",
+							"}",
+							"catch (e) { ",
+							"    responseJSON = {}; ",
+							"    tests['response is valid JSON'] = false;",
+							"}",
+							"",
+							"",
+							"tests['response has post data'] = _.has(responseJSON, 'data');",
+							"tests['response matches the data posted'] = (responseJSON.data && responseJSON.data.length === 281);",
+							"",
+							"tests[\"content-type equals text/plain\"] = responseJSON && responseJSON.headers && (responseJSON.headers[\"content-type\"] === 'text/plain');"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "text/plain",
+						"type": "text"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "Duis posuere augue vel cursus pharetra. In luctus a ex nec pretium. Praesent neque quam, tincidunt nec leo eget, rutrum vehicula magna.\nMaecenas consequat elementum elit, id semper sem tristique et. Integer pulvinar enim quis consectetur interdum volutpat.!@#$%^&*()+POL:},'';,[;[;"
+				},
+				"url": {
+					"raw": "https://postman-echo.com/post",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"post"
+					]
+				},
+				"description": "The HTTP `POST` request method is meant to transfer data to a server \n(and elicit a response). What data is returned depends on the implementation\nof the server.\n\nA `POST` request can pass parameters to the server using \"Query String \nParameters\", as well as the Request Body. For example, in the following request,\n\n> POST /hi/there?hand=wave\n>\n> <request-body>\n\nThe parameter \"hand\" has the value \"wave\". The request body can be in multiple\nformats. These formats are defined by the MIME type of the request. The MIME \nType can be set using the ``Content-Type`` HTTP header. The most commonly used \nMIME types are:\n\n* `multipart/form-data`\n* `application/x-www-form-urlencoded`\n* `application/json`\n\nThis endpoint echoes the HTTP headers, request parameters, the contents of\nthe request body and the complete URI requested."
+			},
+			"response": []
+		},
+		{
+			"name": "POST urlencoded data",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "48da0505-470f-4cf3-bb77-30665415af60",
+						"exec": [
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Content-Type",
+						"value": "application/x-www-form-urlencoded"
+					}
+				],
+				"body": {
+					"mode": "urlencoded",
+					"urlencoded": [
+						{
+							"key": "1",
+							"value": "'a'",
+							"type": "text"
+						},
+						{
+							"key": "2",
+							"value": "\"b\"",
+							"type": "text"
+						},
+						{
+							"key": "'3'",
+							"value": "c",
+							"type": "text"
+						},
+						{
+							"key": "\"4\"",
+							"value": "d",
+							"type": "text"
+						},
+						{
+							"key": "Special",
+							"value": "!@#$%&*()^_=`~              ",
+							"type": "text"
+						},
+						{
+							"key": "more",
+							"value": ",./';[]}{\":?><|\\\\    ",
+							"type": "text"
+						}
+					]
+				},
+				"url": {
+					"raw": "https://postman-echo.com/post",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"post"
+					]
+				},
+				"description": "The HTTP `POST` request method is meant to transfer data to a server \n(and elicit a response). What data is returned depends on the implementation\nof the server.\n\nA `POST` request can pass parameters to the server using \"Query String \nParameters\", as well as the Request Body. For example, in the following request,\n\n> POST /hi/there?hand=wave\n>\n> <request-body>\n\nThe parameter \"hand\" has the value \"wave\". The request body can be in multiple\nformats. These formats are defined by the MIME type of the request. The MIME \nType can be set using the ``Content-Type`` HTTP header. The most commonly used \nMIME types are:\n\n* `multipart/form-data`\n* `application/x-www-form-urlencoded`\n* `application/json`\n\nThis endpoint echoes the HTTP headers, request parameters, the contents of\nthe request body and the complete URI requested."
+			},
+			"response": []
+		},
+		{
+			"name": "POST json with raw",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "e926912d-1c99-4c54-9b53-91c8f63acef0",
+						"exec": [
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"json\": \"Test-Test!@#$%^&*()+POL:},'';,[;[;:>\"\n}"
+				},
+				"url": {
+					"raw": "https://postman-echo.com/post",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"post"
+					]
+				},
+				"description": "The HTTP `POST` request method is meant to transfer data to a server \n(and elicit a response). What data is returned depends on the implementation\nof the server.\n\nA `POST` request can pass parameters to the server using \"Query String \nParameters\", as well as the Request Body. For example, in the following request,\n\n> POST /hi/there?hand=wave\n>\n> <request-body>\n\nThe parameter \"hand\" has the value \"wave\". The request body can be in multiple\nformats. These formats are defined by the MIME type of the request. The MIME \nType can be set using the ``Content-Type`` HTTP header. The most commonly used \nMIME types are:\n\n* `multipart/form-data`\n* `application/x-www-form-urlencoded`\n* `application/json`\n\nThis endpoint echoes the HTTP headers, request parameters, the contents of\nthe request body and the complete URI requested."
+			},
+			"response": []
+		},
+		{
+			"name": "POST javascript with raw",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "d211bdad-60b3-4cd6-869f-853377bf03ef",
+						"exec": [
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Content-Type",
+						"value": "application/javascript"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "var val = 6;\nconsole.log(val);"
+				},
+				"url": {
+					"raw": "https://postman-echo.com/post",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"post"
+					]
+				},
+				"description": "The HTTP `POST` request method is meant to transfer data to a server \n(and elicit a response). What data is returned depends on the implementation\nof the server.\n\nA `POST` request can pass parameters to the server using \"Query String \nParameters\", as well as the Request Body. For example, in the following request,\n\n> POST /hi/there?hand=wave\n>\n> <request-body>\n\nThe parameter \"hand\" has the value \"wave\". The request body can be in multiple\nformats. These formats are defined by the MIME type of the request. The MIME \nType can be set using the ``Content-Type`` HTTP header. The most commonly used \nMIME types are:\n\n* `multipart/form-data`\n* `application/x-www-form-urlencoded`\n* `application/json`\n\nThis endpoint echoes the HTTP headers, request parameters, the contents of\nthe request body and the complete URI requested."
+			},
+			"response": []
+		},
+		{
+			"name": "POST textxml with raw",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "532fef57-48fd-4ffe-ac7e-f5a7e32facc2",
+						"exec": [
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Content-Type",
+						"value": "text/xml"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "<xml>\n\tTest Test!@#$%^&*()+POL:},'';,[;[;\n</xml>"
+				},
+				"url": {
+					"raw": "https://postman-echo.com/post",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"post"
+					]
+				},
+				"description": "The HTTP `POST` request method is meant to transfer data to a server \n(and elicit a response). What data is returned depends on the implementation\nof the server.\n\nA `POST` request can pass parameters to the server using \"Query String \nParameters\", as well as the Request Body. For example, in the following request,\n\n> POST /hi/there?hand=wave\n>\n> <request-body>\n\nThe parameter \"hand\" has the value \"wave\". The request body can be in multiple\nformats. These formats are defined by the MIME type of the request. The MIME \nType can be set using the ``Content-Type`` HTTP header. The most commonly used \nMIME types are:\n\n* `multipart/form-data`\n* `application/x-www-form-urlencoded`\n* `application/json`\n\nThis endpoint echoes the HTTP headers, request parameters, the contents of\nthe request body and the complete URI requested."
+			},
+			"response": []
+		},
+		{
+			"name": "POST texthtml with raw",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "8bbbbc5b-2983-4979-8347-3ced95a69f7e",
+						"exec": [
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Content-Type",
+						"value": "text/html"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "<html>\n  Test Test !@#$%^&*()+POL:},'';,[;[;\n</html>"
+				},
+				"url": {
+					"raw": "https://postman-echo.com/post",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"post"
+					]
+				},
+				"description": "The HTTP `POST` request method is meant to transfer data to a server \n(and elicit a response). What data is returned depends on the implementation\nof the server.\n\nA `POST` request can pass parameters to the server using \"Query String \nParameters\", as well as the Request Body. For example, in the following request,\n\n> POST /hi/there?hand=wave\n>\n> <request-body>\n\nThe parameter \"hand\" has the value \"wave\". The request body can be in multiple\nformats. These formats are defined by the MIME type of the request. The MIME \nType can be set using the ``Content-Type`` HTTP header. The most commonly used \nMIME types are:\n\n* `multipart/form-data`\n* `application/x-www-form-urlencoded`\n* `application/json`\n\nThis endpoint echoes the HTTP headers, request parameters, the contents of\nthe request body and the complete URI requested."
+			},
+			"response": []
+		},
+		{
+			"name": "Resolve URL",
+			"request": {
+				"method": "POST",
+				"header": [],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": "https://postman-echo.com/:action?a=''&b=\"\"",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						":action"
+					],
+					"query": [
+						{
+							"key": "a",
+							"value": "''"
+						},
+						{
+							"key": "b",
+							"value": "\"\""
+						},
+						{
+							"key": "more",
+							"value": "",
+							"disabled": true
+						}
+					],
+					"variable": [
+						{
+							"key": "action",
+							"value": "post"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "PUT Request",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"type": "text/javascript",
+						"exec": [
+							"var responseJSON;",
+							"",
+							"try { ",
+							"    responseJSON = JSON.parse(responseBody); ",
+							"    tests['response is valid JSON'] = true;",
+							"}",
+							"catch (e) { ",
+							"    responseJSON = {}; ",
+							"    tests['response is valid JSON'] = false;",
+							"}",
+							"",
+							"",
+							"tests['response has PUT data'] = _.has(responseJSON, 'data');",
+							"tests['response matches the data sent in request'] = (responseJSON.data && responseJSON.data.length === 256);"
+						]
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Content-Type",
+						"value": "text/plain"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "Etiam mi lacus, cursus vitae felis et, blandit pellentesque neque. Vestibulum eget nisi a tortor commodo dignissim.\nQuisque ipsum ligula, faucibus a felis a, commodo elementum nisl. Mauris vulputate sapien et tincidunt viverra. Donec vitae velit nec metus."
+				},
+				"url": {
+					"raw": "https://postman-echo.com/put",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"put"
+					]
+				},
+				"description": "The HTTP `PUT` request method is similar to HTTP `POST`. It too is meant to \ntransfer data to a server (and elicit a response). What data is returned depends on the implementation\nof the server.\n\nA `PUT` request can pass parameters to the server using \"Query String \nParameters\", as well as the Request Body. For example, in the following \nraw HTTP request,\n\n> PUT /hi/there?hand=wave\n>\n> <request-body>\n\n\n"
+			},
+			"response": []
+		},
+		{
+			"name": "PATCH Request",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"type": "text/javascript",
+						"exec": [
+							"var responseJSON;",
+							"",
+							"try { ",
+							"    responseJSON = JSON.parse(responseBody); ",
+							"    tests['response is valid JSON'] = true;",
+							"}",
+							"catch (e) { ",
+							"    responseJSON = {}; ",
+							"    tests['response is valid JSON'] = false;",
+							"}",
+							"",
+							"",
+							"tests['response has PUT data'] = _.has(responseJSON, 'data');",
+							"tests['response matches the data sent in request'] = (responseJSON.data && responseJSON.data.length === 256);"
+						]
+					}
+				}
+			],
+			"request": {
+				"method": "PATCH",
+				"header": [
+					{
+						"key": "Content-Type",
+						"value": "text/plain"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "Curabitur auctor, elit nec pulvinar porttitor, ex augue condimentum enim, eget suscipit urna felis quis neque.\nSuspendisse sit amet luctus massa, nec venenatis mi. Suspendisse tincidunt massa at nibh efficitur fringilla. Nam quis congue mi. Etiam volutpat."
+				},
+				"url": {
+					"raw": "https://postman-echo.com/patch",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"patch"
+					]
+				},
+				"description": "The HTTP `PATCH` method is used to update resources on a server. The exact\nuse of `PATCH` requests depends on the server in question. There are a number\nof server implementations which handle `PATCH` differently. Technically, \n`PATCH` supports both Query String parameters and a Request Body.\n\nThis endpoint accepts an HTTP `PATCH` request and provides debug information\nsuch as the HTTP headers, Query String arguments, and the Request Body."
+			},
+			"response": []
+		},
+		{
+			"name": "DELETE Request",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"type": "text/javascript",
+						"exec": [
+							"var responseJSON;",
+							"",
+							"try { ",
+							"    responseJSON = JSON.parse(responseBody); ",
+							"    tests['response is valid JSON'] = true;",
+							"}",
+							"catch (e) { ",
+							"    responseJSON = {}; ",
+							"    tests['response is valid JSON'] = false;",
+							"}",
+							"",
+							"",
+							"tests['response has PUT data'] = _.has(responseJSON, 'data');",
+							"tests['response matches the data sent in request'] = (responseJSON.data && responseJSON.data.length === 256);"
+						]
+					}
+				}
+			],
+			"request": {
+				"method": "DELETE",
+				"header": [
+					{
+						"key": "Content-Type",
+						"value": "text/plain"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "Donec fermentum, nisi sed cursus eleifend, nulla tortor ultricies tellus, ut vehicula orci arcu ut velit. In volutpat egestas dapibus.\nMorbi condimentum vestibulum sapien. Etiam dignissim diam quis eros lobortis gravida vel lobortis est. Etiam gravida sed."
+				},
+				"url": {
+					"raw": "https://postman-echo.com/delete",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"delete"
+					]
+				},
+				"description": "The HTTP `DELETE` method is used to delete resources on a server. The exact\nuse of `DELETE` requests depends on the server implementation. In general, \n`DELETE` requests support both, Query String parameters as well as a Request \nBody.\n\nThis endpoint accepts an HTTP `DELETE` request and provides debug information\nsuch as the HTTP headers, Query String arguments, and the Request Body."
+			},
+			"response": []
+		},
+		{
+			"name": "OPTIONS to postman echo",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "26034e86-3b4b-4445-bc81-f1edd810c90e",
+						"exec": [
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"auth": {
+					"type": "noauth"
+				},
+				"method": "OPTIONS",
+				"header": [
+					{
+						"key": "Content-Type",
+						"value": "text/plain"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "Duis posuere augue vel cursus pharetra. In luctus a ex nec pretium. Praesent neque quam, tincidunt nec leo eget, rutrum vehicula magna.\nMaecenas consequat elementum elit, id semper sem tristique et. Integer pulvinar enim quis consectetur interdum volutpat."
+				},
+				"url": {
+					"raw": "https://postman-echo.com/post",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"post"
+					]
+				},
+				"description": "The HTTP `POST` request method is meant to transfer data to a server \n(and elicit a response). What data is returned depends on the implementation\nof the server.\n\nA `POST` request can pass parameters to the server using \"Query String \nParameters\", as well as the Request Body. For example, in the following request,\n\n> POST /hi/there?hand=wave\n>\n> <request-body>\n\nThe parameter \"hand\" has the value \"wave\". The request body can be in multiple\nformats. These formats are defined by the MIME type of the request. The MIME \nType can be set using the ``Content-Type`` HTTP header. The most commonly used \nMIME types are:\n\n* `multipart/form-data`\n* `application/x-www-form-urlencoded`\n* `application/json`\n\nThis endpoint echoes the HTTP headers, request parameters, the contents of\nthe request body and the complete URI requested."
+			},
+			"response": []
+		},
+		{
+			"name": "LINK request",
+			"request": {
+				"method": "LINK",
+				"header": [],
+				"url": {
+					"raw": "https://mockbin.org/request",
+					"protocol": "https",
+					"host": [
+						"mockbin",
+						"org"
+					],
+					"path": [
+						"request"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "UNLINK request",
+			"request": {
+				"method": "UNLINK",
+				"header": [
+					{
+						"key": "Content-Type",
+						"value": "text/plain"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "Duis posuere augue vel cursus pharetra. In luctus a ex nec pretium. Praesent neque quam, tincidunt nec leo eget, rutrum vehicula magna.\nMaecenas consequat elementum elit, id semper sem tristique et. Integer pulvinar enim quis consectetur interdum volutpat."
+				},
+				"url": {
+					"raw": "https://mockbin.org/request",
+					"protocol": "https",
+					"host": [
+						"mockbin",
+						"org"
+					],
+					"path": [
+						"request"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "LOCK request",
+			"request": {
+				"method": "LOCK",
+				"header": [
+					{
+						"key": "Content-Type",
+						"value": "text/plain"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "Duis posuere augue vel cursus pharetra. In luctus a ex nec pretium. Praesent neque quam, tincidunt nec leo eget, rutrum vehicula magna.\nMaecenas consequat elementum elit, id semper sem tristique et. Integer pulvinar enim quis consectetur interdum volutpat."
+				},
+				"url": {
+					"raw": "https://mockbin.org/request",
+					"protocol": "https",
+					"host": [
+						"mockbin",
+						"org"
+					],
+					"path": [
+						"request"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "UNLOCK request",
+			"request": {
+				"method": "UNLOCK",
+				"header": [],
+				"url": {
+					"raw": "https://mockbin.org/request",
+					"protocol": "https",
+					"host": [
+						"mockbin",
+						"org"
+					],
+					"path": [
+						"request"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "PROPFIND request",
+			"request": {
+				"method": "PROPFIND",
+				"header": [
+					{
+						"key": "Content-Type",
+						"value": "text/plain"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "Duis posuere augue vel cursus pharetra. In luctus a ex nec pretium. Praesent neque quam, tincidunt nec leo eget, rutrum vehicula magna.\nMaecenas consequat elementum elit, id semper sem tristique et. Integer pulvinar enim quis consectetur interdum volutpat."
+				},
+				"url": {
+					"raw": "https://mockbin.org/request",
+					"protocol": "https",
+					"host": [
+						"mockbin",
+						"org"
+					],
+					"path": [
+						"request"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "PURGE Request",
+			"request": {
+				"method": "PURGE",
+				"header": [],
+				"url": {
+					"raw": "https://mockbin.org/request",
+					"protocol": "https",
+					"host": [
+						"mockbin",
+						"org"
+					],
+					"path": [
+						"request"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "COPY Request",
+			"request": {
+				"method": "COPY",
+				"header": [],
+				"url": {
+					"raw": "https://mockbin.org/request",
+					"protocol": "https",
+					"host": [
+						"mockbin",
+						"org"
+					],
+					"path": [
+						"request"
+					]
+				}
+			},
+			"response": [
+				{
+					"name": "COPY Request",
+					"originalRequest": {
+						"method": "COPY",
+						"header": [],
+						"url": {
+							"raw": "https://9c76407d-5b8d-4b22-99fb-8c47a85d9848.mock.pstmn.io",
+							"protocol": "https",
+							"host": [
+								"9c76407d-5b8d-4b22-99fb-8c47a85d9848",
+								"mock",
+								"pstmn",
+								"io"
+							]
+						}
+					},
+					"status": "OK",
+					"code": 200,
+					"_postman_previewlanguage": "json",
+					"header": [
+						{
+							"key": "Access-Control-Allow-Credentials",
+							"value": "",
+							"name": "Access-Control-Allow-Credentials",
+							"description": "Indicates whether or not the response to the request can be exposed when the credentials flag is true. When used as part of a response to a preflight request, this indicates whether or not the actual request can be made using credentials."
+						},
+						{
+							"key": "Access-Control-Allow-Headers",
+							"value": "",
+							"name": "Access-Control-Allow-Headers",
+							"description": "Used in response to a preflight request to indicate which HTTP headers can be used when making the actual request."
+						},
+						{
+							"key": "Access-Control-Allow-Methods",
+							"value": "",
+							"name": "Access-Control-Allow-Methods",
+							"description": "Specifies the method or methods allowed when accessing the resource. This is used in response to a preflight request."
+						},
+						{
+							"key": "Access-Control-Allow-Origin",
+							"value": "*",
+							"name": "Access-Control-Allow-Origin",
+							"description": "Specifies a URI that may access the resource. For requests without credentials, the server may specify '*' as a wildcard, thereby allowing any origin to access the resource."
+						},
+						{
+							"key": "Access-Control-Expose-Headers",
+							"value": "",
+							"name": "Access-Control-Expose-Headers",
+							"description": "Lets a server whitelist headers that browsers are allowed to access."
+						},
+						{
+							"key": "Connection",
+							"value": "keep-alive",
+							"name": "Connection",
+							"description": "Options that are desired for the connection"
+						},
+						{
+							"key": "Content-Encoding",
+							"value": "gzip",
+							"name": "Content-Encoding",
+							"description": "The type of encoding used on the data."
+						},
+						{
+							"key": "Content-Length",
+							"value": "59",
+							"name": "Content-Length",
+							"description": "The length of the response body in octets (8-bit bytes)"
+						},
+						{
+							"key": "Content-Type",
+							"value": "application/json; charset=utf-8",
+							"name": "Content-Type",
+							"description": "The mime type of this content"
+						},
+						{
+							"key": "Date",
+							"value": "Mon, 05 Feb 2018 07:48:41 GMT",
+							"name": "Date",
+							"description": "The date and time that the message was sent"
+						},
+						{
+							"key": "ETag",
+							"value": "W/\"af-MmpVeTvfnSW88c4riXD0uw\"",
+							"name": "ETag",
+							"description": "An identifier for a specific version of a resource, often a message digest"
+						},
+						{
+							"key": "Server",
+							"value": "nginx",
+							"name": "Server",
+							"description": "A name for the server"
+						},
+						{
+							"key": "Vary",
+							"value": "Accept-Encoding",
+							"name": "Vary",
+							"description": "Tells downstream proxies how to match future request headers to decide whether the cached response can be used rather than requesting a fresh one from the origin server."
+						}
+					],
+					"cookie": [],
+					"body": "{\n    \"status\": 200,\n    \"method\": \"COPY\"\n}"
+				}
+			]
+		},
+		{
+			"name": "Post file",
+			"request": {
+				"method": "POST",
+				"header": [],
+				"body": {
+					"mode": "formdata",
+					"formdata": [
+						{
+							"key": "uohou",
+							"type": "file",
+							"src": "/Users/umesh/Desktop/Screenshot 2019-09-29 at 10.50.30 AM.png"
+						}
+					]
+				},
+				"url": {
+					"raw": "https://postman-echo.com/post",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"post"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "Post multiple files in the same parameter  via form-data",
+			"request": {
+				"method": "POST",
+				"header": [],
+				"body": {
+					"mode": "formdata",
+					"formdata": [
+						{
+							"key": "multiple files",
+							"type": "file",
+							"src": [
+								"/Users/shreyshah/Desktop/openapi3.json",
+								"/Users/shreyshah/Desktop/openapi3.yaml"
+							]
+						}
+					]
+				},
+				"url": {
+					"raw": "https://postman-echo.com/post",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"post"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "Post a file via form-data, without file src specified",
+			"request": {
+				"method": "POST",
+				"header": [],
+				"body": {
+					"mode": "formdata",
+					"formdata": [
+						{
+							"key": "key",
+							"type": "file",
+							"src": []
+						}
+					]
+				},
+				"url": {
+					"raw": "https://postman-echo.com/post",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"post"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "Multiple form-data fields with same names",
+			"request": {
+				"method": "POST",
+				"header": [],
+				"body": {
+					"mode": "formdata",
+					"formdata": [
+						{
+							"key": "key",
+							"value": "value1",
+							"type": "text"
+						},
+						{
+							"key": "key",
+							"value": "value2",
+							"type": "text"
+						},
+						{
+							"key": "file",
+							"type": "file",
+							"src": "/Users/shreyshah/Desktop/openapi3.json"
+						},
+						{
+							"key": "file",
+							"type": "file",
+							"src": "/Users/shreyshah/Desktop/test.c"
+						}
+					]
+				},
+				"url": {
+					"raw": "https://postman-echo.com/post",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"post"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "Multiple query params with same names",
+			"request": {
+				"method": "GET",
+				"header": [],
+				"url": {
+					"raw": "https://postman-echo.com/get?query=value1&query=value2",
+					"protocol": "https",
+					"host": [
+						"postman-echo",
+						"com"
+					],
+					"path": [
+						"get"
+					],
+					"query": [
+						{
+							"key": "query",
+							"value": "value1"
+						},
+						{
+							"key": "query",
+							"value": "value2"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "GraphQL query",
+			"request": {
+				"method": "POST",
+				"header": [],
+				"body": {
+					"mode": "graphql",
+					"graphql": {
+						"query": "query {\n    __schema\n}",
+						"variables": ""
+					}
+				},
+				"url": {
+					"raw": "https://api.github.com/graphql",
+					"protocol": "https",
+					"host": [
+						"api",
+						"github",
+						"com"
+					],
+					"path": [
+						"graphql"
+					]
+				}
+			},
+			"response": []
+		}
+	],
+	"event": [
+		{
+			"listen": "prerequest",
+			"script": {
+				"id": "e80b6162-6c90-4150-bfa1-7f42f11c8f64",
+				"type": "text/javascript",
+				"exec": [
+					""
+				]
+			}
+		},
+		{
+			"listen": "test",
+			"script": {
+				"id": "538efa04-97ce-456c-a5a1-772c466591d5",
+				"type": "text/javascript",
+				"exec": [
+					""
+				]
+			}
+		}
+	]
+}
\ No newline at end of file
diff --git a/codegens/objective-c/test/unit/fixtures/snippets.json b/codegens/objective-c/test/unit/fixtures/snippets.json
new file mode 100644
index 0000000..9c8b539
--- /dev/null
+++ b/codegens/objective-c/test/unit/fixtures/snippets.json
@@ -0,0 +1,32 @@
+{
+  "Request Headers": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://mockbin.org/request\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"my-sample-header\": @\"Lorem ipsum dolor sit amet\",\n  @\"testing\": @\"'singlequotes'\",\n  @\"TEST\": @\"\\\"doublequotes\\\"\"\n};\n\n[request setAllHTTPHeaderFields:headers];\n\n[request setHTTPMethod:@\"POST\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "Request Headers (With special Characters)": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/headers\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"my-sample-header\": @\"Lorem ipsum dolor sit amet\",\n  @\"TEST\": @\"@#$%^&*()\",\n  @\"more\": @\",./';[]}{\\\":?><|\\\\\\\\\"\n};\n\n[request setAllHTTPHeaderFields:headers];\n\n[request setHTTPMethod:@\"GET\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "Request Headers with disabled headers": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/headers\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"my-sample-header\": @\"Lorem ipsum dolor sit amet\",\n  @\"not-disabled-header\": @\"ENABLED\"\n};\n\n[request setAllHTTPHeaderFields:headers];\n\n[request setHTTPMethod:@\"GET\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "GET Request with disabled query": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/get?test=123&anotherone=232\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\n\n[request setHTTPMethod:@\"GET\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "POST form data with special characters": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/post\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSArray *parameters = @[\n  @{ @\"name\": @\"pl\", @\"value\": @\"'a'\" }, \n  @{ @\"name\": @\"qu\", @\"value\": @\"\\\"b\\\"\" }, \n  @{ @\"name\": @\"hdjkljh\", @\"value\": @\"c\" }, \n  @{ @\"name\": @\"sa\", @\"value\": @\"d\" }, \n  @{ @\"name\": @\"Special\", @\"value\": @\"!@#$%&*()^_+=`~\" }, \n  @{ @\"name\": @\"more\", @\"value\": @\",./';[]}{\\\":?><|\\\\\\\\\" } \n];\n\nNSString *boundary = @\"----WebKitFormBoundary7MA4YWxkTrZu0gW\";\nNSError *error;\nNSMutableString *body = [NSMutableString string];\n\nfor (NSDictionary *param in parameters) {\n  [body appendFormat:@\"--%@\\r\\n\", boundary];\n  [body appendFormat:@\"Content-Disposition:form-data; name=\\\"%@\\\"\\r\\n\\r\\n\", param[@\"name\"]];\n  [body appendFormat:@\"%@\", param[@\"value\"]];\n}\n[body appendFormat:@\"\\r\\n--%@--\\r\\n\", boundary];\nNSData *postData = [body dataUsingEncoding:NSUTF8StringEncoding];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"POST\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "Resolve URL (Quotes + Special Characters) Copy": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/post?a=!@$%5E*()_-%60%2526&b=,./';%5B%5D%7D%7B%22:/?%3E%3C%7C%7C\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSData *postData = [[NSData alloc] initWithData:[@\"\" dataUsingEncoding:NSUTF8StringEncoding]];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"POST\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "POST Raw Text": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/post\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"Content-Type\": @\"text/plain\"\n};\n\n[request setAllHTTPHeaderFields:headers];\nNSData *postData = [[NSData alloc] initWithData:[@\"Duis posuere augue vel cursus pharetra. In luctus a ex nec pretium. Praesent neque quam, tincidunt nec leo eget, rutrum vehicula magna.\\nMaecenas consequat elementum elit, id semper sem tristique et. Integer pulvinar enim quis consectetur interdum volutpat.!@#$%^&*()+POL:},'';,[;[;\" dataUsingEncoding:NSUTF8StringEncoding]];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"POST\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "POST urlencoded data": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/post\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"Content-Type\": @\"application/x-www-form-urlencoded\"\n};\n\n[request setAllHTTPHeaderFields:headers];\nNSMutableData *postData = [[NSMutableData alloc] initWithData:[@\"1='a'\" dataUsingEncoding:NSUTF8StringEncoding]];\n[postData appendData:[@\"&2=\\\"b\\\"\" dataUsingEncoding:NSUTF8StringEncoding]];\n[postData appendData:[@\"&'3'=c\" dataUsingEncoding:NSUTF8StringEncoding]];\n[postData appendData:[@\"&\\\"4\\\"=d\" dataUsingEncoding:NSUTF8StringEncoding]];\n[postData appendData:[@\"&Special=!@#$%&*()^_=`~              \" dataUsingEncoding:NSUTF8StringEncoding]];\n[postData appendData:[@\"&more=,./';[]}{\\\":?><|\\\\\\\\    \" dataUsingEncoding:NSUTF8StringEncoding]];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"POST\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "POST json with raw": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/post\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"Content-Type\": @\"application/json\"\n};\n\n[request setAllHTTPHeaderFields:headers];\nNSData *postData = [[NSData alloc] initWithData:[@\"{\\n  \\\"json\\\": \\\"Test-Test!@#$%^&*()+POL:},'';,[;[;:>\\\"\\n}\" dataUsingEncoding:NSUTF8StringEncoding]];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"POST\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "POST javascript with raw": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/post\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"Content-Type\": @\"application/javascript\"\n};\n\n[request setAllHTTPHeaderFields:headers];\nNSData *postData = [[NSData alloc] initWithData:[@\"var val = 6;\\nconsole.log(val);\" dataUsingEncoding:NSUTF8StringEncoding]];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"POST\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "Resolve URL": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/post?a=''&b=%22%22\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSData *postData = [[NSData alloc] initWithData:[@\"\" dataUsingEncoding:NSUTF8StringEncoding]];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"POST\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "PUT Request": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/put\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"Content-Type\": @\"text/plain\"\n};\n\n[request setAllHTTPHeaderFields:headers];\nNSData *postData = [[NSData alloc] initWithData:[@\"Etiam mi lacus, cursus vitae felis et, blandit pellentesque neque. Vestibulum eget nisi a tortor commodo dignissim.\\nQuisque ipsum ligula, faucibus a felis a, commodo elementum nisl. Mauris vulputate sapien et tincidunt viverra. Donec vitae velit nec metus.\" dataUsingEncoding:NSUTF8StringEncoding]];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"PUT\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "PATCH Request": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/patch\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"Content-Type\": @\"text/plain\"\n};\n\n[request setAllHTTPHeaderFields:headers];\nNSData *postData = [[NSData alloc] initWithData:[@\"Curabitur auctor, elit nec pulvinar porttitor, ex augue condimentum enim, eget suscipit urna felis quis neque.\\nSuspendisse sit amet luctus massa, nec venenatis mi. Suspendisse tincidunt massa at nibh efficitur fringilla. Nam quis congue mi. Etiam volutpat.\" dataUsingEncoding:NSUTF8StringEncoding]];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"PATCH\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "DELETE Request": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/delete\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"Content-Type\": @\"text/plain\"\n};\n\n[request setAllHTTPHeaderFields:headers];\nNSData *postData = [[NSData alloc] initWithData:[@\"Donec fermentum, nisi sed cursus eleifend, nulla tortor ultricies tellus, ut vehicula orci arcu ut velit. In volutpat egestas dapibus.\\nMorbi condimentum vestibulum sapien. Etiam dignissim diam quis eros lobortis gravida vel lobortis est. Etiam gravida sed.\" dataUsingEncoding:NSUTF8StringEncoding]];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"DELETE\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "OPTIONS to postman echo": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/post\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"Content-Type\": @\"text/plain\"\n};\n\n[request setAllHTTPHeaderFields:headers];\nNSData *postData = [[NSData alloc] initWithData:[@\"Duis posuere augue vel cursus pharetra. In luctus a ex nec pretium. Praesent neque quam, tincidunt nec leo eget, rutrum vehicula magna.\\nMaecenas consequat elementum elit, id semper sem tristique et. Integer pulvinar enim quis consectetur interdum volutpat.\" dataUsingEncoding:NSUTF8StringEncoding]];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"OPTIONS\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "LINK request": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://mockbin.org/request\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\n\n[request setHTTPMethod:@\"LINK\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "UNLINK request": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://mockbin.org/request\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"Content-Type\": @\"text/plain\"\n};\n\n[request setAllHTTPHeaderFields:headers];\nNSData *postData = [[NSData alloc] initWithData:[@\"Duis posuere augue vel cursus pharetra. In luctus a ex nec pretium. Praesent neque quam, tincidunt nec leo eget, rutrum vehicula magna.\\nMaecenas consequat elementum elit, id semper sem tristique et. Integer pulvinar enim quis consectetur interdum volutpat.\" dataUsingEncoding:NSUTF8StringEncoding]];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"UNLINK\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "LOCK request": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://mockbin.org/request\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"Content-Type\": @\"text/plain\"\n};\n\n[request setAllHTTPHeaderFields:headers];\nNSData *postData = [[NSData alloc] initWithData:[@\"Duis posuere augue vel cursus pharetra. In luctus a ex nec pretium. Praesent neque quam, tincidunt nec leo eget, rutrum vehicula magna.\\nMaecenas consequat elementum elit, id semper sem tristique et. Integer pulvinar enim quis consectetur interdum volutpat.\" dataUsingEncoding:NSUTF8StringEncoding]];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"LOCK\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "UNLOCK request": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://mockbin.org/request\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\n\n[request setHTTPMethod:@\"UNLOCK\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "PROPFIND request": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://mockbin.org/request\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"Content-Type\": @\"text/plain\"\n};\n\n[request setAllHTTPHeaderFields:headers];\nNSData *postData = [[NSData alloc] initWithData:[@\"Duis posuere augue vel cursus pharetra. In luctus a ex nec pretium. Praesent neque quam, tincidunt nec leo eget, rutrum vehicula magna.\\nMaecenas consequat elementum elit, id semper sem tristique et. Integer pulvinar enim quis consectetur interdum volutpat.\" dataUsingEncoding:NSUTF8StringEncoding]];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"PROPFIND\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "PURGE Request": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://mockbin.org/request\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\n\n[request setHTTPMethod:@\"PURGE\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "COPY Request": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://mockbin.org/request\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\n\n[request setHTTPMethod:@\"COPY\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "Post file": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/post\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSArray *parameters = @[\n  @{ @\"name\": @\"uohou\", @\"fileName\": @\"/Users/umesh/Desktop/Screenshot 2019-09-29 at 10.50.30 AM.png\" } \n];\n\nNSString *boundary = @\"----WebKitFormBoundary7MA4YWxkTrZu0gW\";\nNSError *error;\nNSMutableString *body = [NSMutableString string];\n\nfor (NSDictionary *param in parameters) {\n  [body appendFormat:@\"--%@\\r\\n\", boundary];\n  if (param[@\"fileName\"]) {\n    [body appendFormat:@\"Content-Disposition:form-data; name=\\\"%@\\\"; filename=\\\"%@\\\"\\r\\n\", param[@\"name\"], param[@\"fileName\"]];\n    [body appendFormat:@\"Content-Type: %@\\r\\n\\r\\n\", param[@\"contentType\"]];\n    [body appendFormat:@\"%@\", [NSString stringWithContentsOfFile:param[@\"fileName\"] encoding:NSUTF8StringEncoding error:&error]];\n    if (error) {\n      NSLog(@\"%@\", error);\n    }\n  } else {\n    [body appendFormat:@\"Content-Disposition:form-data; name=\\\"%@\\\"\\r\\n\\r\\n\", param[@\"name\"]];\n    [body appendFormat:@\"%@\", param[@\"value\"]];\n  }\n}\n[body appendFormat:@\"\\r\\n--%@--\\r\\n\", boundary];\nNSData *postData = [body dataUsingEncoding:NSUTF8StringEncoding];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"POST\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "Post multiple files in the same parameter  via form-data": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/post\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSArray *parameters = @[\n  @{ @\"name\": @\"multiple files\", @\"fileName\": @\"/Users/shreyshah/Desktop/openapi3.json\" }, \n  @{ @\"name\": @\"multiple files\", @\"fileName\": @\"/Users/shreyshah/Desktop/openapi3.yaml\" } \n];\n\nNSString *boundary = @\"----WebKitFormBoundary7MA4YWxkTrZu0gW\";\nNSError *error;\nNSMutableString *body = [NSMutableString string];\n\nfor (NSDictionary *param in parameters) {\n  [body appendFormat:@\"--%@\\r\\n\", boundary];\n  if (param[@\"fileName\"]) {\n    [body appendFormat:@\"Content-Disposition:form-data; name=\\\"%@\\\"; filename=\\\"%@\\\"\\r\\n\", param[@\"name\"], param[@\"fileName\"]];\n    [body appendFormat:@\"Content-Type: %@\\r\\n\\r\\n\", param[@\"contentType\"]];\n    [body appendFormat:@\"%@\", [NSString stringWithContentsOfFile:param[@\"fileName\"] encoding:NSUTF8StringEncoding error:&error]];\n    if (error) {\n      NSLog(@\"%@\", error);\n    }\n  } else {\n    [body appendFormat:@\"Content-Disposition:form-data; name=\\\"%@\\\"\\r\\n\\r\\n\", param[@\"name\"]];\n    [body appendFormat:@\"%@\", param[@\"value\"]];\n  }\n}\n[body appendFormat:@\"\\r\\n--%@--\\r\\n\", boundary];\nNSData *postData = [body dataUsingEncoding:NSUTF8StringEncoding];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"POST\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "Post a file via form-data, without file src specified": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/post\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSArray *parameters = @[\n  @{ @\"name\": @\"key\", @\"fileName\": @\"/path/to/file\" } \n];\n\nNSString *boundary = @\"----WebKitFormBoundary7MA4YWxkTrZu0gW\";\nNSError *error;\nNSMutableString *body = [NSMutableString string];\n\nfor (NSDictionary *param in parameters) {\n  [body appendFormat:@\"--%@\\r\\n\", boundary];\n  if (param[@\"fileName\"]) {\n    [body appendFormat:@\"Content-Disposition:form-data; name=\\\"%@\\\"; filename=\\\"%@\\\"\\r\\n\", param[@\"name\"], param[@\"fileName\"]];\n    [body appendFormat:@\"Content-Type: %@\\r\\n\\r\\n\", param[@\"contentType\"]];\n    [body appendFormat:@\"%@\", [NSString stringWithContentsOfFile:param[@\"fileName\"] encoding:NSUTF8StringEncoding error:&error]];\n    if (error) {\n      NSLog(@\"%@\", error);\n    }\n  } else {\n    [body appendFormat:@\"Content-Disposition:form-data; name=\\\"%@\\\"\\r\\n\\r\\n\", param[@\"name\"]];\n    [body appendFormat:@\"%@\", param[@\"value\"]];\n  }\n}\n[body appendFormat:@\"\\r\\n--%@--\\r\\n\", boundary];\nNSData *postData = [body dataUsingEncoding:NSUTF8StringEncoding];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"POST\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "Multiple form-data fields with same names": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/post\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSArray *parameters = @[\n  @{ @\"name\": @\"key\", @\"value\": @\"value1\" }, \n  @{ @\"name\": @\"key\", @\"value\": @\"value2\" }, \n  @{ @\"name\": @\"file\", @\"fileName\": @\"/Users/shreyshah/Desktop/openapi3.json\" }, \n  @{ @\"name\": @\"file\", @\"fileName\": @\"/Users/shreyshah/Desktop/test.c\" } \n];\n\nNSString *boundary = @\"----WebKitFormBoundary7MA4YWxkTrZu0gW\";\nNSError *error;\nNSMutableString *body = [NSMutableString string];\n\nfor (NSDictionary *param in parameters) {\n  [body appendFormat:@\"--%@\\r\\n\", boundary];\n  if (param[@\"fileName\"]) {\n    [body appendFormat:@\"Content-Disposition:form-data; name=\\\"%@\\\"; filename=\\\"%@\\\"\\r\\n\", param[@\"name\"], param[@\"fileName\"]];\n    [body appendFormat:@\"Content-Type: %@\\r\\n\\r\\n\", param[@\"contentType\"]];\n    [body appendFormat:@\"%@\", [NSString stringWithContentsOfFile:param[@\"fileName\"] encoding:NSUTF8StringEncoding error:&error]];\n    if (error) {\n      NSLog(@\"%@\", error);\n    }\n  } else {\n    [body appendFormat:@\"Content-Disposition:form-data; name=\\\"%@\\\"\\r\\n\\r\\n\", param[@\"name\"]];\n    [body appendFormat:@\"%@\", param[@\"value\"]];\n  }\n}\n[body appendFormat:@\"\\r\\n--%@--\\r\\n\", boundary];\nNSData *postData = [body dataUsingEncoding:NSUTF8StringEncoding];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"POST\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "Multiple query params with same names": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/get?query=value1&query=value2\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\n\n[request setHTTPMethod:@\"GET\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "GraphQL query": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.github.com/graphql\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"Content-Type\": @\"application/json\"\n};\n\n[request setAllHTTPHeaderFields:headers];\nNSData *postData = [[NSData alloc] initWithData:[@\"{\\\"query\\\":\\\"query {\\\\n    __schema\\\\n}\\\",\\\"variables\\\":\\\"\\\"}\" dataUsingEncoding:NSUTF8StringEncoding]];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"POST\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "POST textxml with raw": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/post\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"Content-Type\": @\"text/xml\"\n};\n\n[request setAllHTTPHeaderFields:headers];\nNSData *postData = [[NSData alloc] initWithData:[@\"<xml>\\n\tTest Test!@#$%^&*()+POL:},'';,[;[;\\n</xml>\" dataUsingEncoding:NSUTF8StringEncoding]];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"POST\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n",
+  "POST texthtml with raw": "#import <Foundation/Foundation.h>\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://postman-echo.com/post\"]\n  cachePolicy:NSURLRequestUseProtocolCachePolicy\n  timeoutInterval:10.0];\nNSDictionary *headers = @{\n  @\"Content-Type\": @\"text/html\"\n};\n\n[request setAllHTTPHeaderFields:headers];\nNSData *postData = [[NSData alloc] initWithData:[@\"<html>\\n  Test Test !@#$%^&*()+POL:},'';,[;[;\\n</html>\" dataUsingEncoding:NSUTF8StringEncoding]];\n[request setHTTPBody:postData];\n\n[request setHTTPMethod:@\"POST\"];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\ncompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n  if (error) {\n    NSLog(@\"%@\", error);\n  } else {\n    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n    NSLog(@\"%@\", httpResponse);\n  }\n}];\n[dataTask resume];\n"
+}
\ No newline at end of file