Skip to content

Commit 949a342

Browse files
Cleaning up parameters (#1683)
1 parent 0c3ea2a commit 949a342

File tree

11 files changed

+128
-49
lines changed

11 files changed

+128
-49
lines changed

src/RestSharp/Extensions/MiscExtensions.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ public static async Task<byte[]> ReadAsBytes(this Stream input, CancellationToke
3939

4040
return ms.ToArray();
4141
}
42-
43-
internal static IEnumerable<(string Name, object Value)> GetProperties(this object obj, params string[] includedProperties) {
42+
43+
internal static IEnumerable<(string Name, string? Value)> GetProperties(this object obj, params string[] includedProperties) {
4444
// automatically create parameters from object props
4545
var type = obj.GetType();
4646
var props = type.GetProperties();
@@ -63,12 +63,13 @@ public static async Task<byte[]> ReadAsBytes(this Stream input, CancellationToke
6363
if (array.Length > 0 && elementType != null) {
6464
// convert the array to an array of strings
6565
var values = array.Cast<object>().Select(item => item.ToString());
66+
yield return (prop.Name, string.Join(",", values));
6667

67-
val = string.Join(",", values);
68+
continue;
6869
}
6970
}
7071

71-
yield return(prop.Name, val);
72+
yield return (prop.Name, val.ToString());
7273
}
7374

7475
bool IsAllowedProperty(string propertyName)

src/RestSharp/KnownHeaders.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,5 @@ public static class KnownHeaders {
3131
public const string ContentType = "Content-Type";
3232
public const string LastModified = "Last-Modified";
3333
public const string ContentMD5 = "Content-MD5";
34+
public const string Host = "Host";
3435
}

src/RestSharp/Parameters/FileParameter.cs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,6 @@ namespace RestSharp;
1919
/// </summary>
2020
[PublicAPI]
2121
public record FileParameter {
22-
/// <summary>
23-
/// The length of data to be sent
24-
/// </summary>
25-
public long ContentLength { get; }
26-
2722
/// <summary>
2823
/// Provides raw data for file
2924
/// </summary>
@@ -44,10 +39,9 @@ public record FileParameter {
4439
/// </summary>
4540
public string Name { get; }
4641

47-
FileParameter(string name, string fileName, long contentLength, Func<Stream> getFile, string? contentType = null) {
42+
FileParameter(string name, string fileName, Func<Stream> getFile, string? contentType = null) {
4843
Name = name;
4944
FileName = fileName;
50-
ContentLength = contentLength;
5145
GetFile = getFile;
5246
ContentType = contentType ?? "application/octet-stream";
5347
}
@@ -61,7 +55,7 @@ public record FileParameter {
6155
/// <param name="contentType">The content type to use in the request.</param>
6256
/// <returns>The <see cref="FileParameter" /></returns>
6357
public static FileParameter Create(string name, byte[] data, string filename, string? contentType = null) {
64-
return new FileParameter(name, filename, data.Length, GetFile, contentType);
58+
return new FileParameter(name, filename, GetFile, contentType);
6559

6660
Stream GetFile() {
6761
var stream = new MemoryStream();
@@ -86,17 +80,16 @@ public static FileParameter Create(
8680
string fileName,
8781
string? contentType = null
8882
)
89-
=> new(name, fileName, contentLength, getFile, contentType ?? Serializers.ContentType.File);
83+
=> new(name, fileName, getFile, contentType ?? Serializers.ContentType.File);
9084

9185
public static FileParameter FromFile(string fullPath, string? name = null, string? contentType = null) {
9286
if (!File.Exists(Ensure.NotEmptyString(fullPath, nameof(fullPath))))
9387
throw new FileNotFoundException("File not found", fullPath);
9488

9589
var fileName = Path.GetFileName(fullPath);
9690
var parameterName = name ?? fileName;
97-
var length = new FileInfo(fullPath).Length;
9891

99-
return new FileParameter(parameterName, fileName, length, GetFile);
92+
return new FileParameter(parameterName, fileName, GetFile);
10093

10194
Stream GetFile() => File.OpenRead(fullPath);
10295
}

src/RestSharp/Parameters/GetOrPostParameter.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,15 @@
1111
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
14-
//
1514

1615
namespace RestSharp;
1716

1817
public record GetOrPostParameter : NamedParameter {
18+
/// <summary>
19+
/// Instantiates an HTTP parameter instance (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT)
20+
/// </summary>
21+
/// <param name="name">Name of the parameter</param>
22+
/// <param name="value">Value of the parameter</param>
23+
/// <param name="encode">Encode the value or not, default true</param>
1924
public GetOrPostParameter(string name, string? value, bool encode = true) : base(name, value, ParameterType.GetOrPost, encode) { }
2025
}

src/RestSharp/Parameters/HeaderParameter.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,10 @@
1616
namespace RestSharp;
1717

1818
public record HeaderParameter : Parameter {
19+
/// <summary>
20+
/// Instantiates a header parameter
21+
/// </summary>
22+
/// <param name="name">Parameter name</param>
23+
/// <param name="value">Parameter value</param>
1924
public HeaderParameter(string? name, string? value) : base(name, value, ParameterType.HttpHeader, false) { }
2025
}

src/RestSharp/Parameters/QueryParameter.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,11 @@
1616
namespace RestSharp;
1717

1818
public record QueryParameter : NamedParameter {
19+
/// <summary>
20+
/// Instantiates a new query parameter instance that will be added to the request URL as {name}={value} part of the query string.
21+
/// </summary>
22+
/// <param name="name">Parameter name</param>
23+
/// <param name="value">Parameter value</param>
24+
/// <param name="encode">Optional: encode the value, default is true</param>
1925
public QueryParameter(string name, string? value, bool encode = true) : base(name, value, ParameterType.QueryString, encode) { }
2026
}

src/RestSharp/Parameters/UrlSegmentParameter.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,17 @@
1111
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
14-
//
1514

1615
namespace RestSharp;
1716

1817
public record UrlSegmentParameter : NamedParameter {
18+
/// <summary>
19+
/// Instantiates a new query parameter instance that will be added to the request URL part of the query string.
20+
/// The request resource should have a placeholder {name} that will be replaced with the parameter value when the request is made.
21+
/// </summary>
22+
/// <param name="name">Parameter name</param>
23+
/// <param name="value">Parameter value</param>
24+
/// <param name="encode">Optional: encode the value, default is true</param>
1925
public UrlSegmentParameter(string name, string value, bool encode = true)
2026
: base(name, Ensure.NotEmpty(value, nameof(value)).Replace("%2F", "/").Replace("%2f", "/"), ParameterType.UrlSegment, encode) { }
2127
}

src/RestSharp/Request/RestRequest.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,18 @@ public Func<HttpResponseMessage, RestResponse>? AdvancedResponseWriter {
174174
}
175175
}
176176

177-
public RestRequest AddParameter(Parameter p) => this.With(x => x.Parameters.AddParameter(p));
177+
/// <summary>
178+
/// Adds a parameter object to the request parameters
179+
/// </summary>
180+
/// <param name="parameter">Parameter to add</param>
181+
/// <returns></returns>
182+
public RestRequest AddParameter(Parameter parameter) => this.With(x => x.Parameters.AddParameter(parameter));
178183

179-
public void RemoveParameter(Parameter p) => Parameters.RemoveParameter(p);
184+
/// <summary>
185+
/// Removes a parameter object from the request parameters
186+
/// </summary>
187+
/// <param name="parameter">Parameter to remove</param>
188+
public void RemoveParameter(Parameter parameter) => Parameters.RemoveParameter(parameter);
180189

181190
internal RestRequest AddFile(FileParameter file) => this.With(x => x._files.Add(file));
182191
}

src/RestSharp/Request/RestRequestExtensions.cs

Lines changed: 69 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -30,49 +30,75 @@ public static class RestRequestExtensions {
3030
/// <param name="value">Value of the parameter</param>
3131
/// <param name="encode">Encode the value or not, default true</param>
3232
/// <returns>This request</returns>
33-
public static RestRequest AddParameter(this RestRequest request, string name, object? value, bool encode = true)
34-
=> request.AddParameter(new GetOrPostParameter(name, value?.ToString(), encode));
33+
public static RestRequest AddParameter(this RestRequest request, string name, string? value, bool encode = true)
34+
=> request.AddParameter(new GetOrPostParameter(name, value, encode));
3535

36-
public static RestRequest AddParameter(this RestRequest request, string? name, object value, ParameterType type, bool encode = true)
37-
=> request.AddParameter(Parameter.CreateParameter(name, value, type, encode));
38-
39-
public static RestRequest AddOrUpdateParameter(this RestRequest request, Parameter parameter) {
40-
var p = request.Parameters.FirstOrDefault(x => x.Name == parameter.Name && x.Type == parameter.Type);
36+
/// <summary>
37+
/// Adds a HTTP parameter to the request (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT)
38+
/// </summary>
39+
/// <param name="request">Request instance</param>
40+
/// <param name="name">Name of the parameter</param>
41+
/// <param name="value">Value of the parameter</param>
42+
/// <param name="encode">Encode the value or not, default true</param>
43+
/// <returns>This request</returns>
44+
public static RestRequest AddParameter<T>(this RestRequest request, string name, T value, bool encode = true) where T : struct
45+
=> request.AddParameter(name, value.ToString(), encode);
4146

42-
if (p != null) request.RemoveParameter(p);
47+
/// <summary>
48+
/// Adds or updates a HTTP parameter to the request (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT)
49+
/// </summary>
50+
/// <param name="request">Request instance</param>
51+
/// <param name="name">Name of the parameter</param>
52+
/// <param name="value">Value of the parameter</param>
53+
/// <param name="encode">Encode the value or not, default true</param>
54+
/// <returns>This request</returns>
55+
public static RestRequest AddOrUpdateParameter(this RestRequest request, string name, string? value, bool encode = true)
56+
=> request.AddOrUpdateParameter(new GetOrPostParameter(name, value, encode));
4357

44-
request.AddParameter(parameter);
45-
return request;
46-
}
58+
/// <summary>
59+
/// Adds or updates a HTTP parameter to the request (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT)
60+
/// </summary>
61+
/// <param name="request">Request instance</param>
62+
/// <param name="name">Name of the parameter</param>
63+
/// <param name="value">Value of the parameter</param>
64+
/// <param name="encode">Encode the value or not, default true</param>
65+
/// <returns>This request</returns>
66+
public static RestRequest AddOrUpdateParameter<T>(this RestRequest request, string name, T value, bool encode = true) where T : struct
67+
=> request.AddOrUpdateParameter(name, value.ToString(), encode);
4768

48-
public static RestRequest AddOrUpdateParameters(this RestRequest request, IEnumerable<Parameter> parameters) {
49-
foreach (var parameter in parameters)
50-
request.AddOrUpdateParameter(parameter);
69+
public static RestRequest AddUrlSegment(this RestRequest request, string name, string value, bool encode = true)
70+
=> request.AddParameter(new UrlSegmentParameter(name, value, encode));
5171

52-
return request;
53-
}
72+
public static RestRequest AddUrlSegment<T>(this RestRequest request, string name, T value, bool encode = true) where T : struct
73+
=> request.AddUrlSegment(name, Ensure.NotNull(value.ToString(), nameof(value)), encode);
5474

55-
public static RestRequest AddOrUpdateParameter(this RestRequest request, string name, object? value)
56-
=> request.AddOrUpdateParameter(new GetOrPostParameter(name, value?.ToString()));
75+
public static RestRequest AddQueryParameter(this RestRequest request, string name, string? value, bool encode = true)
76+
=> request.AddParameter(new QueryParameter(name, value, encode));
5777

58-
public static RestRequest AddOrUpdateParameter(this RestRequest request, string name, object value, ParameterType type, bool encode = true)
59-
=> request.AddOrUpdateParameter(Parameter.CreateParameter(name, value, type, encode));
78+
public static RestRequest AddQueryParameter<T>(this RestRequest request, string name, T value, bool encode = true) where T : struct
79+
=> request.AddQueryParameter(name, value.ToString(), encode);
6080

6181
public static RestRequest AddHeader(this RestRequest request, string name, string value) {
6282
CheckAndThrowsForInvalidHost(name, value);
6383
return request.AddParameter(new HeaderParameter(name, value));
6484
}
6585

86+
public static RestRequest AddHeader<T>(this RestRequest request, string name, T value) where T : struct
87+
=> request.AddHeader(name, Ensure.NotNull(value.ToString(), nameof(value)));
88+
6689
public static RestRequest AddOrUpdateHeader(this RestRequest request, string name, string value) {
6790
CheckAndThrowsForInvalidHost(name, value);
6891
return request.AddOrUpdateParameter(new HeaderParameter(name, value));
6992
}
7093

94+
public static RestRequest AddOrUpdateHeader<T>(this RestRequest request, string name, T value) where T : struct
95+
=> request.AddOrUpdateHeader(name, Ensure.NotNull(value.ToString(), nameof(value)));
96+
7197
public static RestRequest AddHeaders(this RestRequest request, ICollection<KeyValuePair<string, string>> headers) {
7298
CheckAndThrowsDuplicateKeys(headers);
7399

74-
foreach (var pair in headers) {
75-
request.AddHeader(pair.Key, pair.Value);
100+
foreach (var header in headers) {
101+
request.AddHeader(header.Key, header.Value);
76102
}
77103

78104
return request;
@@ -88,11 +114,27 @@ public static RestRequest AddOrUpdateHeaders(this RestRequest request, ICollecti
88114
return request;
89115
}
90116

91-
public static RestRequest AddUrlSegment(this RestRequest request, string name, string value, bool encode = true)
92-
=> request.AddParameter(new UrlSegmentParameter(name, value, encode));
117+
public static RestRequest AddParameter(this RestRequest request, string? name, object value, ParameterType type, bool encode = true)
118+
=> request.AddParameter(Parameter.CreateParameter(name, value, type, encode));
93119

94-
public static RestRequest AddQueryParameter(this RestRequest request, string name, string value, bool encode = true)
95-
=> request.AddParameter(new QueryParameter(name, value, encode));
120+
public static RestRequest AddOrUpdateParameter(this RestRequest request, Parameter parameter) {
121+
var p = request.Parameters.FirstOrDefault(x => x.Name == parameter.Name && x.Type == parameter.Type);
122+
123+
if (p != null) request.RemoveParameter(p);
124+
125+
request.AddParameter(parameter);
126+
return request;
127+
}
128+
129+
public static RestRequest AddOrUpdateParameters(this RestRequest request, IEnumerable<Parameter> parameters) {
130+
foreach (var parameter in parameters)
131+
request.AddOrUpdateParameter(parameter);
132+
133+
return request;
134+
}
135+
136+
public static RestRequest AddOrUpdateParameter(this RestRequest request, string name, object value, ParameterType type, bool encode = true)
137+
=> request.AddOrUpdateParameter(Parameter.CreateParameter(name, value, type, encode));
96138

97139
/// <summary>
98140
/// Adds a file parameter to the request body. The file will be read from disk as a stream.
@@ -198,7 +240,7 @@ public static RestRequest AddObject(this RestRequest request, object obj, params
198240
static void CheckAndThrowsForInvalidHost(string name, string value) {
199241
static bool InvalidHost(string host) => Uri.CheckHostName(PortSplitRegex.Split(host)[0]) == UriHostNameType.Unknown;
200242

201-
if (name == "Host" && InvalidHost(value))
243+
if (name == KnownHeaders.Host && InvalidHost(value))
202244
throw new ArgumentException("The specified value is not a valid Host header string.", nameof(value));
203245
}
204246

src/RestSharp/RestClientExtensions.Json.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ public static partial class RestClientExtensions {
4545
var param = $"{name}";
4646

4747
if (resource.Contains(param)) {
48-
resource = resource.Replace(param, value.ToString());
48+
resource = resource.Replace(param, value);
4949
}
5050
else {
51-
query.Add(new QueryParameter(name, value?.ToString()));
51+
query.Add(new QueryParameter(name, value));
5252
}
5353
}
5454

test/RestSharp.Tests/ParametersTests.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,21 @@ public void AddDefaultHeadersUsingDictionary() {
1515

1616
var expected = headers.Select(x => new HeaderParameter(x.Key, x.Value));
1717

18-
var client = new RestClient(BaseUrl);
18+
var client = new RestClient(BaseUrl);
1919
client.AddDefaultHeaders(headers);
2020

2121
var actual = client.DefaultParameters.Select(x => x as HeaderParameter);
2222
expected.Should().BeSubsetOf(actual);
2323
}
24+
25+
[Fact]
26+
public void AddUrlSegmentWithInt() {
27+
const string name = "foo";
28+
29+
var request = new RestRequest().AddUrlSegment(name, 1);
30+
var actual = request.Parameters.FirstOrDefault(x => x.Name == name);
31+
var expected = new UrlSegmentParameter(name, "1");
32+
33+
expected.Should().BeEquivalentTo(actual);
34+
}
2435
}

0 commit comments

Comments
 (0)