Skip to content

Commit 3fd5bbc

Browse files
authored
fix: Support Restsharp 107+ (#179)
After version 107, restsharp completely changed their API. This PR fixes the code generator to support the new API. - also add the escaping function from Kong#289 - I think there are probably still escaping bugs here, but it seems to be working Well Enough™
1 parent d04de71 commit 3fd5bbc

19 files changed

+243
-89
lines changed

src/targets/csharp/restsharp/client.ts

Lines changed: 59 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ import type { Client } from '../../targets';
22

33
import { CodeBuilder } from '../../../helpers/code-builder';
44
import { escapeForDoubleQuotes } from '../../../helpers/escape';
5-
import { getHeader } from '../../../helpers/headers';
5+
6+
function title(s: string): string {
7+
return s[0].toUpperCase() + s.slice(1).toLowerCase();
8+
}
69

710
export const restsharp: Client = {
811
info: {
@@ -11,7 +14,7 @@ export const restsharp: Client = {
1114
link: 'http://restsharp.org/',
1215
description: 'Simple REST and HTTP API Client for .NET',
1316
},
14-
convert: ({ allHeaders, method, fullUrl, headersObj, cookies, postData }) => {
17+
convert: ({ method, fullUrl, headersObj, cookies, postData, uriObj }) => {
1518
const { push, join } = new CodeBuilder();
1619
const isSupportedMethod = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'].includes(
1720
method.toUpperCase()
@@ -21,26 +24,71 @@ export const restsharp: Client = {
2124
return 'Method not supported';
2225
}
2326

24-
push(`var client = new RestClient("${fullUrl}");`);
25-
push(`var request = new RestRequest(Method.${method.toUpperCase()});`);
27+
push('using RestSharp;\n\n');
28+
push(`var options = new RestClientOptions("${fullUrl}");`);
29+
push('var client = new RestClient(options);');
2630

27-
// Add headers, including the cookies
31+
// The first argument is the sub-path to the base URL, given as the
32+
// constructor to RestClient; for our purposes we're just giving the entire
33+
// URL as the base path so it can be an empty string
34+
push('var request = new RestRequest("");');
35+
36+
// If we have multipart form data, set this value. Setting the content-type header manually and then trying to add a mutlipart file parameter
37+
const isMultipart = postData.mimeType && postData.mimeType === 'multipart/form-data';
38+
if (isMultipart) {
39+
push('request.AlwaysMultipartFormData = true;');
40+
}
2841

42+
// Add headers, including the cookies
2943
Object.keys(headersObj).forEach(key => {
44+
// if we have post data, restsharp really wants to set the contentType
45+
// itself; do not add a content-type header or you end up with failures
46+
// which manifest as unhandled exceptions.
47+
if (postData.mimeType && key.toLowerCase() === 'content-type') {
48+
if (isMultipart && postData.boundary) {
49+
push(`request.FormBoundary = "${postData.boundary}";`);
50+
}
51+
return;
52+
}
3053
push(`request.AddHeader("${key}", "${escapeForDoubleQuotes(headersObj[key])}");`);
3154
});
3255

3356
cookies.forEach(({ name, value }) => {
34-
push(`request.AddCookie("${name}", "${value}");`);
57+
push(`request.AddCookie("${name}", "${escapeForDoubleQuotes(value)}", "${uriObj.pathname}", "${uriObj.host}");`);
3558
});
3659

37-
if (postData.text) {
38-
const header = getHeader(allHeaders, 'content-type');
39-
const text = JSON.stringify(postData.text);
40-
push(`request.AddParameter("${header}", ${text}, ParameterType.RequestBody);`);
60+
switch (postData.mimeType) {
61+
case 'multipart/form-data':
62+
if (!postData.params) break;
63+
postData.params.forEach(param => {
64+
if (param.fileName) {
65+
push(`request.AddFile("${param.name}", "${param.fileName}");`);
66+
} else {
67+
push(`request.AddParameter("${param.name}", "${param.value}");`);
68+
}
69+
});
70+
break;
71+
case 'application/x-www-form-urlencoded':
72+
if (!postData.params) break;
73+
postData.params.forEach(param => {
74+
push(`request.AddParameter("${param.name}", "${param.value}");`);
75+
});
76+
break;
77+
case 'application/json': {
78+
if (!postData.text) break;
79+
const text = JSON.stringify(postData.text);
80+
push(`request.AddJsonBody(${text}, false);`);
81+
break;
82+
}
83+
default:
84+
if (!postData.text) break;
85+
push(`request.AddStringBody("${postData.text}", "${postData.mimeType}");`);
4186
}
4287

43-
push('IRestResponse response = client.Execute(request);');
88+
push(`var response = await client.${title(method)}Async(request);\n`);
89+
90+
push('Console.WriteLine("{0}", response.Content);');
91+
4492
return join();
4593
},
4694
};
Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1-
var client = new RestClient("https://httpbin.org/anything");
2-
var request = new RestRequest(Method.POST);
3-
request.AddHeader("content-type", "application/x-www-form-urlencoded");
4-
request.AddParameter("application/x-www-form-urlencoded", "foo=bar&hello=world", ParameterType.RequestBody);
5-
IRestResponse response = client.Execute(request);
1+
using RestSharp;
2+
3+
4+
var options = new RestClientOptions("https://httpbin.org/anything");
5+
var client = new RestClient(options);
6+
var request = new RestRequest("");
7+
request.AddParameter("foo", "bar");
8+
request.AddParameter("hello", "world");
9+
var response = await client.PostAsync(request);
10+
11+
Console.WriteLine("{0}", response.Content);
Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1-
var client = new RestClient("https://httpbin.org/anything");
2-
var request = new RestRequest(Method.POST);
3-
request.AddHeader("content-type", "application/json");
4-
request.AddParameter("application/json", "{\"number\":1,\"string\":\"f\\\"oo\",\"arr\":[1,2,3],\"nested\":{\"a\":\"b\"},\"arr_mix\":[1,\"a\",{\"arr_mix_nested\":[]}],\"boolean\":false}", ParameterType.RequestBody);
5-
IRestResponse response = client.Execute(request);
1+
using RestSharp;
2+
3+
4+
var options = new RestClientOptions("https://httpbin.org/anything");
5+
var client = new RestClient(options);
6+
var request = new RestRequest("");
7+
request.AddJsonBody("{\"number\":1,\"string\":\"f\\\"oo\",\"arr\":[1,2,3],\"nested\":{\"a\":\"b\"},\"arr_mix\":[1,\"a\",{\"arr_mix_nested\":[]}],\"boolean\":false}", false);
8+
var response = await client.PostAsync(request);
9+
10+
Console.WriteLine("{0}", response.Content);
Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1-
var client = new RestClient("https://httpbin.org/cookies");
2-
var request = new RestRequest(Method.GET);
3-
request.AddCookie("foo", "bar");
4-
request.AddCookie("bar", "baz");
5-
IRestResponse response = client.Execute(request);
1+
using RestSharp;
2+
3+
4+
var options = new RestClientOptions("https://httpbin.org/cookies");
5+
var client = new RestClient(options);
6+
var request = new RestRequest("");
7+
request.AddCookie("foo", "bar", "/cookies", "httpbin.org");
8+
request.AddCookie("bar", "baz", "/cookies", "httpbin.org");
9+
var response = await client.GetAsync(request);
10+
11+
Console.WriteLine("{0}", response.Content);
Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1-
var client = new RestClient("https://httpbin.org/anything?foo=bar&foo=baz&baz=abc&key=value");
2-
var request = new RestRequest(Method.POST);
1+
using RestSharp;
2+
3+
4+
var options = new RestClientOptions("https://httpbin.org/anything?foo=bar&foo=baz&baz=abc&key=value");
5+
var client = new RestClient(options);
6+
var request = new RestRequest("");
37
request.AddHeader("accept", "application/json");
4-
request.AddHeader("content-type", "application/x-www-form-urlencoded");
5-
request.AddCookie("foo", "bar");
6-
request.AddCookie("bar", "baz");
7-
request.AddParameter("application/x-www-form-urlencoded", "foo=bar", ParameterType.RequestBody);
8-
IRestResponse response = client.Execute(request);
8+
request.AddCookie("foo", "bar", "/anything", "httpbin.org");
9+
request.AddCookie("bar", "baz", "/anything", "httpbin.org");
10+
request.AddParameter("foo", "bar");
11+
var response = await client.PostAsync(request);
12+
13+
Console.WriteLine("{0}", response.Content);
Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
var client = new RestClient("https://httpbin.org/headers");
2-
var request = new RestRequest(Method.GET);
1+
using RestSharp;
2+
3+
4+
var options = new RestClientOptions("https://httpbin.org/headers");
5+
var client = new RestClient(options);
6+
var request = new RestRequest("");
37
request.AddHeader("accept", "application/json");
48
request.AddHeader("x-foo", "Bar");
59
request.AddHeader("x-bar", "Foo");
610
request.AddHeader("quoted-value", "\"quoted\" 'string'");
7-
IRestResponse response = client.Execute(request);
11+
var response = await client.GetAsync(request);
12+
13+
Console.WriteLine("{0}", response.Content);
Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1-
var client = new RestClient("http://httpbin.org/anything");
2-
var request = new RestRequest(Method.GET);
3-
IRestResponse response = client.Execute(request);
1+
using RestSharp;
2+
3+
4+
var options = new RestClientOptions("http://httpbin.org/anything");
5+
var client = new RestClient(options);
6+
var request = new RestRequest("");
7+
var response = await client.GetAsync(request);
8+
9+
Console.WriteLine("{0}", response.Content);
Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1-
var client = new RestClient("https://httpbin.org/anything");
2-
var request = new RestRequest(Method.POST);
3-
request.AddHeader("content-type", "application/json");
4-
request.AddParameter("application/json", "{\n \"foo\": \"bar\"\n}", ParameterType.RequestBody);
5-
IRestResponse response = client.Execute(request);
1+
using RestSharp;
2+
3+
4+
var options = new RestClientOptions("https://httpbin.org/anything");
5+
var client = new RestClient(options);
6+
var request = new RestRequest("");
7+
request.AddJsonBody("{\n \"foo\": \"bar\"\n}", false);
8+
var response = await client.PostAsync(request);
9+
10+
Console.WriteLine("{0}", response.Content);
Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1-
var client = new RestClient("https://httpbin.org/anything");
2-
var request = new RestRequest(Method.POST);
3-
request.AddHeader("content-type", "application/json");
4-
request.AddParameter("application/json", "{\"foo\":null}", ParameterType.RequestBody);
5-
IRestResponse response = client.Execute(request);
1+
using RestSharp;
2+
3+
4+
var options = new RestClientOptions("https://httpbin.org/anything");
5+
var client = new RestClient(options);
6+
var request = new RestRequest("");
7+
request.AddJsonBody("{\"foo\":null}", false);
8+
var response = await client.PostAsync(request);
9+
10+
Console.WriteLine("{0}", response.Content);
Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
1-
var client = new RestClient("https://httpbin.org/anything");
2-
var request = new RestRequest(Method.POST);
3-
request.AddHeader("content-type", "multipart/form-data; boundary=---011000010111000001101001");
4-
request.AddParameter("multipart/form-data; boundary=---011000010111000001101001", "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"foo\"; filename=\"hello.txt\"\r\nContent-Type: text/plain\r\n\r\nHello World\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bar\"\r\n\r\nBonjour le monde\r\n-----011000010111000001101001--\r\n", ParameterType.RequestBody);
5-
IRestResponse response = client.Execute(request);
1+
using RestSharp;
2+
3+
4+
var options = new RestClientOptions("https://httpbin.org/anything");
5+
var client = new RestClient(options);
6+
var request = new RestRequest("");
7+
request.AlwaysMultipartFormData = true;
8+
request.FormBoundary = "---011000010111000001101001";
9+
request.AddFile("foo", "src/fixtures/files/hello.txt");
10+
request.AddParameter("bar", "Bonjour le monde");
11+
var response = await client.PostAsync(request);
12+
13+
Console.WriteLine("{0}", response.Content);
Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1-
var client = new RestClient("https://httpbin.org/anything");
2-
var request = new RestRequest(Method.POST);
3-
request.AddHeader("content-type", "multipart/form-data; boundary=---011000010111000001101001");
4-
request.AddParameter("multipart/form-data; boundary=---011000010111000001101001", "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"foo\"; filename=\"hello.txt\"\r\nContent-Type: text/plain\r\n\r\n\r\n-----011000010111000001101001--\r\n", ParameterType.RequestBody);
5-
IRestResponse response = client.Execute(request);
1+
using RestSharp;
2+
3+
4+
var options = new RestClientOptions("https://httpbin.org/anything");
5+
var client = new RestClient(options);
6+
var request = new RestRequest("");
7+
request.AlwaysMultipartFormData = true;
8+
request.FormBoundary = "---011000010111000001101001";
9+
request.AddFile("foo", "src/fixtures/files/hello.txt");
10+
var response = await client.PostAsync(request);
11+
12+
Console.WriteLine("{0}", response.Content);
Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
var client = new RestClient("https://httpbin.org/anything");
2-
var request = new RestRequest(Method.POST);
3-
request.AddHeader("Content-Type", "multipart/form-data");
4-
IRestResponse response = client.Execute(request);
1+
using RestSharp;
2+
3+
4+
var options = new RestClientOptions("https://httpbin.org/anything");
5+
var client = new RestClient(options);
6+
var request = new RestRequest("");
7+
request.AlwaysMultipartFormData = true;
8+
var response = await client.PostAsync(request);
9+
10+
Console.WriteLine("{0}", response.Content);
Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1-
var client = new RestClient("https://httpbin.org/anything");
2-
var request = new RestRequest(Method.POST);
3-
request.AddHeader("Content-Type", "multipart/form-data; boundary=---011000010111000001101001");
4-
request.AddParameter("multipart/form-data; boundary=---011000010111000001101001", "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"foo\"\r\n\r\nbar\r\n-----011000010111000001101001--\r\n", ParameterType.RequestBody);
5-
IRestResponse response = client.Execute(request);
1+
using RestSharp;
2+
3+
4+
var options = new RestClientOptions("https://httpbin.org/anything");
5+
var client = new RestClient(options);
6+
var request = new RestRequest("");
7+
request.AlwaysMultipartFormData = true;
8+
request.FormBoundary = "---011000010111000001101001";
9+
request.AddParameter("foo", "bar");
10+
var response = await client.PostAsync(request);
11+
12+
Console.WriteLine("{0}", response.Content);
Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1-
var client = new RestClient("https://httpbin.org/anything?foo%5Bbar%5D=baz%2Czap&fiz=buz&key=value");
2-
var request = new RestRequest(Method.GET);
3-
IRestResponse response = client.Execute(request);
1+
using RestSharp;
2+
3+
4+
var options = new RestClientOptions("https://httpbin.org/anything?foo%5Bbar%5D=baz%2Czap&fiz=buz&key=value");
5+
var client = new RestClient(options);
6+
var request = new RestRequest("");
7+
var response = await client.GetAsync(request);
8+
9+
Console.WriteLine("{0}", response.Content);
Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
var client = new RestClient("https://httpbin.org/anything");
2-
var request = new RestRequest(Method.POST);
3-
request.AddHeader("content-type", "application/json");
4-
IRestResponse response = client.Execute(request);
1+
using RestSharp;
2+
3+
4+
var options = new RestClientOptions("https://httpbin.org/anything");
5+
var client = new RestClient(options);
6+
var request = new RestRequest("");
7+
var response = await client.PostAsync(request);
8+
9+
Console.WriteLine("{0}", response.Content);
Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1-
var client = new RestClient("https://httpbin.org/anything?startTime=2019-06-13T19%3A08%3A25.455Z&endTime=2015-09-15T14%3A00%3A12-04%3A00");
2-
var request = new RestRequest(Method.GET);
3-
IRestResponse response = client.Execute(request);
1+
using RestSharp;
2+
3+
4+
var options = new RestClientOptions("https://httpbin.org/anything?startTime=2019-06-13T19%3A08%3A25.455Z&endTime=2015-09-15T14%3A00%3A12-04%3A00");
5+
var client = new RestClient(options);
6+
var request = new RestRequest("");
7+
var response = await client.GetAsync(request);
8+
9+
Console.WriteLine("{0}", response.Content);
Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1-
var client = new RestClient("https://httpbin.org/anything?foo=bar&foo=baz&baz=abc&key=value");
2-
var request = new RestRequest(Method.GET);
3-
IRestResponse response = client.Execute(request);
1+
using RestSharp;
2+
3+
4+
var options = new RestClientOptions("https://httpbin.org/anything?foo=bar&foo=baz&baz=abc&key=value");
5+
var client = new RestClient(options);
6+
var request = new RestRequest("");
7+
var response = await client.GetAsync(request);
8+
9+
Console.WriteLine("{0}", response.Content);

0 commit comments

Comments
 (0)