@@ -4,32 +4,100 @@ var _ = require('./lodash'),
44 sanitize = require ( './util' ) . sanitize ,
55 sanitizeOptions = require ( './util' ) . sanitizeOptions ,
66 addFormParam = require ( './util' ) . addFormParam ,
7+ { URL } = require ( 'url' ) ,
78 self ;
89
910/**
10- * Generates snippet in csharp-restsharp by parsing data from Postman-SDK request object
11+ * Takes in a string and returns a new string with only the first character capitalized
12+ *
13+ * @param {string } string - string to change
14+ * @returns {String } - the same string with the first litter as capital letter
15+ */
16+ function capitalizeFirstLetter ( string ) {
17+ return string . charAt ( 0 ) . toUpperCase ( ) + string . slice ( 1 ) . toLowerCase ( ) ;
18+ }
19+
20+ /**
21+ * Generates snippet for the RestClientOptions object
1122 *
12- * @param {Object } request - Postman SDK request object
23+ * @param {string } urlOrigin - String representing the origin of the url
1324 * @param {Object } options - Options to tweak code snippet
14- * @returns {String } csharp-restsharp code snippet for given request object
25+ * @param {string } indentString - String representing value of indentation required
26+ * @param {Array } headers - request headers
27+ * @returns {String } csharp-restsharp RestClientOptions object snippet
1528 */
16- function makeSnippet ( request , options ) {
17- const UNSUPPORTED_METHODS_LIKE_POST = [ 'LINK' , 'UNLINK' , 'LOCK' , 'PROPFIND' ] ,
18- UNSUPPORTED_METHODS_LIKE_GET = [ 'PURGE' , 'UNLOCK' , 'VIEW' , 'COPY' ] ;
29+ function makeOptionsSnippet ( urlOrigin , options , indentString , headers ) {
30+ let userAgentHeader ,
31+ snippet = `var options = new RestClientOptions("${ sanitize ( urlOrigin ) } ")\n{\n` ;
32+ if ( Array . isArray ( headers ) ) {
33+ userAgentHeader = headers . find ( ( header ) => {
34+ return ( ! header . disabled && sanitize ( header . key , true ) . toLowerCase ( ) === 'user-agent' ) ;
1935
20- var snippet = `var client = new RestClient("${ sanitize ( request . url . toString ( ) ) } ");\n` ,
21- isUnSupportedMethod = UNSUPPORTED_METHODS_LIKE_GET . includes ( request . method ) ||
22- UNSUPPORTED_METHODS_LIKE_POST . includes ( request . method ) ;
36+ } ) ;
37+ }
2338 if ( options . requestTimeout ) {
24- snippet += `client.Timeout = ${ options . requestTimeout } ; \n` ;
39+ snippet += `${ indentString } MaxTimeout = ${ options . requestTimeout } , \n` ;
2540 }
2641 else {
27- snippet += 'client.Timeout = -1;\n' ;
42+ snippet += ` ${ indentString } MaxTimeout = -1,\n` ;
2843 }
2944 if ( ! options . followRedirect ) {
30- snippet += 'client.FollowRedirects = false;\n' ;
45+ snippet += `${ indentString } FollowRedirects = false,\n` ;
46+ }
47+ if ( userAgentHeader ) {
48+ snippet += `${ indentString } UserAgent = "${ userAgentHeader . value } ",\n` ;
49+ }
50+ snippet += '};\n' ;
51+ return snippet ;
52+ }
53+
54+ /**
55+ * Generates an URL object from the string
56+ *
57+ * @param {string } stringToParse - url in string representation
58+ * @returns {object } the URL object
59+ */
60+ function parseURL ( stringToParse ) {
61+ try {
62+ let objectURL = new URL ( stringToParse ) ;
63+ return objectURL ;
64+ }
65+ catch ( err ) {
66+ try {
67+ var url = require ( 'url' ) ;
68+ let urlObj = url . parse ( stringToParse ) ;
69+ if ( urlObj . hostname === null ) {
70+ return false ;
71+ }
72+ return urlObj ;
73+ }
74+ catch ( parseErr ) {
75+ return false ;
76+ }
3177 }
32- snippet += `var request = new RestRequest(${ isUnSupportedMethod ? '' : ( 'Method.' + request . method ) } );\n` ;
78+ }
79+
80+ /**
81+ * Generates snippet in csharp-restsharp by parsing data from Postman-SDK request object
82+ *
83+ * @param {Object } request - Postman SDK request object
84+ * @param {Object } options - Options to tweak code snippet
85+ * @param {string } indentString - String representing value of indentation required
86+ * @returns {string } csharp-restsharp code snippet for given request object
87+ */
88+ function makeSnippet ( request , options , indentString ) {
89+ const UNSUPPORTED_METHODS_LIKE_POST = [ 'LINK' , 'UNLINK' , 'LOCK' , 'PROPFIND' ] ,
90+ UNSUPPORTED_METHODS_LIKE_GET = [ 'PURGE' , 'UNLOCK' , 'VIEW' ] ,
91+ isUnSupportedMethod = UNSUPPORTED_METHODS_LIKE_GET . includes ( request . method ) ||
92+ UNSUPPORTED_METHODS_LIKE_POST . includes ( request . method ) ,
93+ url = parseURL ( request . url . toString ( ) ) ,
94+ urlOrigin = url ? parseURL ( request . url . toString ( ) ) . origin : request . url . toString ( ) ,
95+ urlPathAndHash = url ? request . url . toString ( ) . replace ( urlOrigin , '' ) : '' ;
96+
97+ let snippet = makeOptionsSnippet ( urlOrigin , options , indentString , request . toJSON ( ) . header ) ;
98+ snippet += 'var client = new RestClient(options);\n' ;
99+ snippet += `var request = new RestRequest("${ sanitize ( urlPathAndHash ) } ", ` +
100+ `${ isUnSupportedMethod ? 'Method.Get' : ( 'Method.' + capitalizeFirstLetter ( request . method ) ) } );\n` ;
33101 if ( request . body && request . body . mode === 'graphql' && ! request . headers . has ( 'Content-Type' ) ) {
34102 request . addHeader ( {
35103 key : 'Content-Type' ,
@@ -38,17 +106,11 @@ function makeSnippet (request, options) {
38106 }
39107 snippet += parseRequest . parseHeader ( request . toJSON ( ) , options . trimRequestBody ) ;
40108 if ( request . body && request . body . mode === 'formdata' ) {
41- let isFile = false ,
42- formdata = request . body . formdata ,
109+ let formdata = request . body . formdata ,
43110 formdataArray = [ ] ;
44- request . body . toJSON ( ) . formdata . forEach ( ( data ) => {
45- if ( ! data . disabled && data . type === 'file' ) {
46- isFile = true ;
47- }
48- } ) ;
49111 // The following statement needs to be added else the multipart/form-data request where there is no file
50112 // is being sent as x-www-form-urlencoded by default
51- if ( ! isFile ) {
113+ if ( formdata . members . length > 0 ) {
52114 snippet += 'request.AlwaysMultipartFormData = true;\n' ;
53115 }
54116
@@ -92,14 +154,14 @@ function makeSnippet (request, options) {
92154 }
93155 snippet += parseRequest . parseBody ( request , options . trimRequestBody ) ;
94156 if ( isUnSupportedMethod ) {
95- ( UNSUPPORTED_METHODS_LIKE_GET . includes ( request . method ) ) &&
96- ( snippet += `IRestResponse response = client.ExecuteAsGet(request, "${ request . method } ");\n` ) ;
97- ( UNSUPPORTED_METHODS_LIKE_POST . includes ( request . method ) ) &&
98- ( snippet += `IRestResponse response = client.ExecuteAsPost(request, "${ request . method } ");\n` ) ;
99- }
100- else {
101- snippet += 'IRestResponse response = client.Execute(request);\n' ;
157+ snippet += 'request.OnBeforeRequest = (request) =>\n' ;
158+ snippet += '{\n' ;
159+ snippet += `${ indentString } request.Method = new HttpMethod("${ request . method } ");\n` ;
160+ snippet += `${ indentString } return default;\n` ;
161+ snippet += '};\n' ;
102162 }
163+
164+ snippet += 'RestResponse response = await client.ExecuteAsync(request);\n' ;
103165 snippet += 'Console.WriteLine(response.Content);' ;
104166
105167 return snippet ;
@@ -192,7 +254,8 @@ self = module.exports = {
192254 // snippets to include C# class definition according to options
193255 headerSnippet = '' ,
194256 footerSnippet = '' ,
195-
257+ mainMethodSnippet = '' ,
258+ importTask = '' ,
196259 // snippet to create request in csharp-restsharp
197260 snippet = '' ;
198261
@@ -202,15 +265,20 @@ self = module.exports = {
202265 indentString = indentString . repeat ( options . indentCount ) ;
203266
204267 if ( options . includeBoilerplate ) {
268+
269+ mainMethodSnippet = indentString . repeat ( 2 ) + 'static async Task Main(string[] args) {\n' ;
270+ importTask = 'using System.Threading;\nusing System.Threading.Tasks;\n' ;
271+
205272 headerSnippet = 'using System;\n' +
206273 'using RestSharp;\n' +
274+ importTask +
207275 'namespace HelloWorldApplication {\n' +
208276 indentString + 'class HelloWorld {\n' +
209- indentString . repeat ( 2 ) + 'static void Main(string[] args) {\n' ;
277+ mainMethodSnippet ;
210278 footerSnippet = indentString . repeat ( 2 ) + '}\n' + indentString + '}\n}\n' ;
211279 }
212280
213- snippet = makeSnippet ( request , options ) ;
281+ snippet = makeSnippet ( request , options , indentString ) ;
214282
215283 // if boilerplate is included then two more indentString needs to be added in snippet
216284 ( options . includeBoilerplate ) &&
0 commit comments