Skip to content

Commit bc22477

Browse files
author
Maryam Taheri
committed
modify code
1 parent 54546fa commit bc22477

File tree

16 files changed

+548
-0
lines changed

16 files changed

+548
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System.Text;
2+
using HttpClientToCurl.Builder.Interface;
3+
using HttpClientToCurl.Config;
4+
5+
namespace HttpClientToCurl.Builder.Concrete.Common;
6+
7+
public abstract class BaseBuilder : IBuilder
8+
{
9+
protected readonly StringBuilder _stringBuilder = new();
10+
11+
public abstract string CreateCurl(HttpClient httpClient, HttpRequestMessage httpRequestMessage, BaseConfig config);
12+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace HttpClientToCurl.Builder.Concrete.Common;
2+
3+
public static class Constants
4+
{
5+
internal const string ContentLength = "Content-Length";
6+
internal const string FormUrlEncodedContentType = "application/x-www-form-urlencoded";
7+
}
Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
using System.Text;
2+
using System.Web;
3+
using HttpClientToCurl.Utility;
4+
5+
namespace HttpClientToCurl.Builder.Concrete.Common;
6+
7+
internal static class Extensions
8+
{
9+
internal static StringBuilder Initialize(this StringBuilder stringBuilder, HttpMethod httpMethod)
10+
{
11+
stringBuilder.Append("curl");
12+
13+
if (httpMethod != HttpMethod.Get)
14+
{
15+
stringBuilder
16+
.Append(' ')
17+
.Append("-X")
18+
.Append(' ')
19+
.Append(httpMethod.Method);
20+
}
21+
22+
return stringBuilder.Append(' ');
23+
}
24+
25+
internal static string Finalize(this StringBuilder stringBuilder, bool enableCompression)
26+
{
27+
return enableCompression
28+
? stringBuilder
29+
.Append(' ')
30+
.Append("--compressed")
31+
.ToString()
32+
: stringBuilder.ToString();
33+
}
34+
35+
internal static StringBuilder AddAbsoluteUrl(this StringBuilder stringBuilder, string baseAddress, Uri requestUri)
36+
{
37+
Uri baseAddressUri = Helpers.CreateUri(baseAddress);
38+
bool baseAddressIsAbsoluteUri = Helpers.CheckAddressIsAbsoluteUri(baseAddressUri);
39+
bool requestUriIsAbsoluteUri = Helpers.CheckAddressIsAbsoluteUri(requestUri);
40+
41+
string address = GetAbsoluteAddress(baseAddressUri, baseAddressIsAbsoluteUri, requestUri, requestUriIsAbsoluteUri);
42+
43+
var encodedAddress = address.ApplyEncodeUri();
44+
45+
return stringBuilder
46+
.Append($"{AddSingleQuotationMark(encodedAddress ?? address)}")
47+
.Append(' ');
48+
49+
static string AddSingleQuotationMark(string address)
50+
{
51+
return address is not null ? $"'{address}'" : null;
52+
}
53+
}
54+
55+
private static string GetAbsoluteAddress(Uri baseAddressUri, bool baseAddressIsAbsoluteUri, Uri requestUri, bool requestUriIsAbsoluteUri)
56+
{
57+
if (requestUri is null && baseAddressUri is not null && baseAddressIsAbsoluteUri)
58+
{
59+
return baseAddressUri.ToString();
60+
}
61+
62+
if (baseAddressUri is null && requestUri is not null && requestUriIsAbsoluteUri)
63+
{
64+
return requestUri.ToString();
65+
}
66+
67+
if (baseAddressUri is not null && requestUri is not null && baseAddressIsAbsoluteUri && !requestUriIsAbsoluteUri)
68+
{
69+
return new Uri(baseAddressUri, requestUri).ToString();
70+
}
71+
72+
if (baseAddressUri is not null && requestUri is not null && baseAddressIsAbsoluteUri)
73+
{
74+
return requestUri.ToString();
75+
}
76+
77+
if (baseAddressUri is null && requestUri is null)
78+
{
79+
return null;
80+
}
81+
82+
return $"{baseAddressUri}{requestUri}";
83+
}
84+
85+
private static string ApplyEncodeUri(this string address)
86+
{
87+
string result = null;
88+
89+
if (address is not null)
90+
{
91+
var questionMarkItems = address.Split('?');
92+
if (questionMarkItems.Length > 1)
93+
{
94+
var andItems = questionMarkItems[1].Split('&');
95+
if (andItems.Length > 1)
96+
{
97+
var addressEncodedStringBuilder = new StringBuilder()
98+
.Append(questionMarkItems[0])
99+
.Append('?');
100+
foreach (var ai in andItems)
101+
{
102+
var equalItems = ai.Split('=');
103+
if (equalItems.Length > 1)
104+
{
105+
addressEncodedStringBuilder
106+
.Append(equalItems[0])
107+
.Append('=')
108+
.Append(Uri.EscapeDataString(equalItems[1]))
109+
.Append('&');
110+
}
111+
}
112+
113+
result = addressEncodedStringBuilder
114+
.Remove(addressEncodedStringBuilder.Length - 1, 1)
115+
.ToString();
116+
}
117+
}
118+
}
119+
120+
return result;
121+
}
122+
123+
internal static StringBuilder AddHeaders(this StringBuilder stringBuilder, HttpClient httpClient,
124+
HttpRequestMessage httpRequestMessage, bool needAddDefaultHeaders = true)
125+
{
126+
bool hasHeader = false;
127+
128+
if (needAddDefaultHeaders && httpClient.DefaultRequestHeaders.Any())
129+
{
130+
var defaultHeaders =
131+
httpClient.DefaultRequestHeaders.Where(dh => dh.Key != Constants.ContentLength);
132+
foreach (var header in defaultHeaders)
133+
{
134+
stringBuilder
135+
.Append("-H")
136+
.Append(' ')
137+
.Append($"\'{header.Key}: {string.Join("; ", header.Value)}\'")
138+
.Append(' ');
139+
}
140+
141+
hasHeader = true;
142+
}
143+
144+
if (httpRequestMessage.Headers.Any())
145+
{
146+
var headers = httpRequestMessage.Headers.Where(h => h.Key != Constants.ContentLength);
147+
foreach (var header in headers)
148+
{
149+
stringBuilder
150+
.Append("-H")
151+
.Append(' ')
152+
.Append($"\'{header.Key}: {string.Join("; ", header.Value)}\'")
153+
.Append(' ');
154+
}
155+
156+
hasHeader = true;
157+
}
158+
159+
if (httpRequestMessage.Content is not null && httpRequestMessage.Content.Headers.Any())
160+
{
161+
foreach (var header in httpRequestMessage.Content.Headers.Where(h => h.Key != Constants.ContentLength))
162+
{
163+
stringBuilder
164+
.Append("-H")
165+
.Append(' ')
166+
.Append($"\'{header.Key}: {string.Join("; ", header.Value)}\'")
167+
.Append(' ');
168+
}
169+
170+
hasHeader = true;
171+
}
172+
173+
if (!hasHeader)
174+
{
175+
stringBuilder.Append(' ');
176+
}
177+
178+
return stringBuilder;
179+
}
180+
181+
internal static StringBuilder AddBody(this StringBuilder stringBuilder, HttpContent content)
182+
{
183+
string contentType = content?.Headers?.ContentType?.MediaType;
184+
string body = content?.ReadAsStringAsync().GetAwaiter().GetResult();
185+
186+
if (contentType == Constants.FormUrlEncodedContentType)
187+
{
188+
stringBuilder.AddFormUrlEncodedContentBody(body);
189+
}
190+
else
191+
{
192+
stringBuilder.AppendBodyItem(body);
193+
}
194+
195+
return stringBuilder;
196+
}
197+
198+
private static void AppendBodyItem(this StringBuilder stringBuilder, object body)
199+
=> stringBuilder
200+
.Append("-d")
201+
.Append(' ')
202+
.Append('\'')
203+
.Append(body)
204+
.Append('\'')
205+
.Append(' ');
206+
207+
private static void AddFormUrlEncodedContentBody(this StringBuilder stringBuilder, string body)
208+
{
209+
string decodedBody = HttpUtility.UrlDecode(body);
210+
string[] splitBodyArray = decodedBody.Split('&');
211+
if (splitBodyArray.Any())
212+
{
213+
foreach (string item in splitBodyArray)
214+
{
215+
stringBuilder.AppendBodyItem(item);
216+
}
217+
}
218+
}
219+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using HttpClientToCurl.Builder.Concrete.Common;
2+
using HttpClientToCurl.Config;
3+
4+
namespace HttpClientToCurl.Builder.Concrete;
5+
6+
public sealed class HttpDeleteBuilder : BaseBuilder
7+
{
8+
public override string CreateCurl(HttpClient httpClient, HttpRequestMessage httpRequestMessage, BaseConfig config)
9+
{
10+
return _stringBuilder
11+
.Initialize(httpRequestMessage.Method)
12+
.AddAbsoluteUrl(httpClient.BaseAddress?.AbsoluteUri, httpRequestMessage.RequestUri)
13+
.AddHeaders(httpClient, httpRequestMessage, config?.NeedAddDefaultHeaders ?? new BaseConfig().NeedAddDefaultHeaders)?
14+
.Finalize(config?.EnableCompression ?? new BaseConfig().EnableCompression);
15+
}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using HttpClientToCurl.Builder.Concrete.Common;
2+
using HttpClientToCurl.Config;
3+
4+
namespace HttpClientToCurl.Builder.Concrete;
5+
6+
public sealed class HttpGetBuilder : BaseBuilder
7+
{
8+
public override string CreateCurl(HttpClient httpClient, HttpRequestMessage httpRequestMessage, BaseConfig config)
9+
{
10+
return _stringBuilder
11+
.Initialize(httpRequestMessage.Method)
12+
.AddAbsoluteUrl(httpClient.BaseAddress?.AbsoluteUri, httpRequestMessage.RequestUri)
13+
.AddHeaders(httpClient, httpRequestMessage, config?.NeedAddDefaultHeaders ?? new BaseConfig().NeedAddDefaultHeaders)?
14+
.Finalize(config?.EnableCompression ?? new BaseConfig().EnableCompression);
15+
}
16+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using HttpClientToCurl.Builder.Concrete.Common;
2+
using HttpClientToCurl.Config;
3+
4+
namespace HttpClientToCurl.Builder.Concrete;
5+
6+
public sealed class HttpPatchBuilder : BaseBuilder
7+
{
8+
public override string CreateCurl(HttpClient httpClient, HttpRequestMessage httpRequestMessage, BaseConfig config)
9+
{
10+
return _stringBuilder
11+
.Initialize(httpRequestMessage.Method)
12+
.AddAbsoluteUrl(httpClient.BaseAddress?.AbsoluteUri, httpRequestMessage.RequestUri)
13+
.AddHeaders(httpClient, httpRequestMessage, config?.NeedAddDefaultHeaders ?? new BaseConfig().NeedAddDefaultHeaders)?
14+
.AddBody(httpRequestMessage.Content)?
15+
.Finalize(config?.EnableCompression ?? new BaseConfig().EnableCompression);
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using HttpClientToCurl.Builder.Concrete.Common;
2+
using HttpClientToCurl.Config;
3+
4+
namespace HttpClientToCurl.Builder.Concrete;
5+
6+
public sealed class HttpPostBuilder : BaseBuilder
7+
{
8+
public override string CreateCurl(HttpClient httpClient, HttpRequestMessage httpRequestMessage, BaseConfig config)
9+
{
10+
return _stringBuilder
11+
.Initialize(httpRequestMessage.Method)
12+
.AddAbsoluteUrl(httpClient.BaseAddress?.AbsoluteUri, httpRequestMessage.RequestUri)
13+
.AddHeaders(httpClient, httpRequestMessage, config?.NeedAddDefaultHeaders ?? new BaseConfig().NeedAddDefaultHeaders)?
14+
.AddBody(httpRequestMessage.Content)?
15+
.Finalize(config?.EnableCompression ?? new BaseConfig().EnableCompression);
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using HttpClientToCurl.Builder.Concrete.Common;
2+
using HttpClientToCurl.Config;
3+
4+
namespace HttpClientToCurl.Builder.Concrete;
5+
6+
public sealed class HttpPutBuilder : BaseBuilder
7+
{
8+
public override string CreateCurl(HttpClient httpClient, HttpRequestMessage httpRequestMessage, BaseConfig config)
9+
{
10+
return _stringBuilder
11+
.Initialize(httpRequestMessage.Method)
12+
.AddAbsoluteUrl(httpClient.BaseAddress?.AbsoluteUri, httpRequestMessage.RequestUri)
13+
.AddHeaders(httpClient, httpRequestMessage, config?.NeedAddDefaultHeaders ?? new BaseConfig().NeedAddDefaultHeaders)?
14+
.AddBody(httpRequestMessage.Content)?
15+
.Finalize(config?.EnableCompression ?? new BaseConfig().EnableCompression);
16+
}
17+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System.Text;
2+
using HttpClientToCurl.Config;
3+
using HttpClientToCurl.Builder.Interface;
4+
5+
namespace HttpClientToCurl.Builder.Director;
6+
7+
public abstract class BaseBuilder : IBuilder
8+
{
9+
protected readonly StringBuilder _stringBuilder = new();
10+
11+
public abstract string CreateCurl(HttpClient httpClient, HttpRequestMessage httpRequestMessage, BaseConfig config);
12+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using HttpClientToCurl.Builder.Concrete;
2+
using HttpClientToCurl.Builder.Interface;
3+
using HttpClientToCurl.Config;
4+
5+
namespace HttpClientToCurl.Builder;
6+
7+
public static class Generator
8+
{
9+
public static string GenerateCurl(HttpClient httpClient, HttpRequestMessage httpRequestMessage, BaseConfig config)
10+
{
11+
var builder = GetBuilder(httpRequestMessage.Method);
12+
return builder.CreateCurl(httpClient, httpRequestMessage, config);
13+
}
14+
15+
private static IBuilder GetBuilder(HttpMethod method)
16+
{
17+
string methodName = method.Method;
18+
return methodName switch
19+
{
20+
"GET" => new HttpGetBuilder(),
21+
"POST" => new HttpPostBuilder(),
22+
"PUT" => new HttpPutBuilder(),
23+
"PATCH" => new HttpPatchBuilder(),
24+
"DELETE" => new HttpDeleteBuilder(),
25+
_ => throw new NotSupportedException($"HTTP method {method} is not supported."),
26+
};
27+
}
28+
}

0 commit comments

Comments
 (0)