Skip to content

Commit de6859b

Browse files
committed
Merge branch 'main' into modelcomments
2 parents 33f77c0 + e53d814 commit de6859b

5 files changed

Lines changed: 31 additions & 29 deletions

src/Docker.DotNet/QueryString.cs

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,46 +21,48 @@ public QueryString(T value)
2121
AttributedPublicProperties = FindAttributedPublicProperties<T, QueryStringParameterAttribute>();
2222
}
2323

24-
public IDictionary<string, string[]> GetKeyValuePairs()
24+
/// <summary>
25+
/// Returns formatted query string.
26+
/// </summary>
27+
/// <returns></returns>
28+
public string GetQueryString()
2529
{
26-
var queryParameters = new Dictionary<string, string[]>();
27-
foreach (var pair in AttributedPublicProperties)
30+
var queryStringBuilder = new StringBuilder();
31+
32+
foreach (var attributedProperty in AttributedPublicProperties)
2833
{
29-
var property = pair.Key;
30-
var attribute = pair.Value;
34+
var property = attributedProperty.Key;
35+
var attribute = attributedProperty.Value;
36+
3137
var value = property.GetValue(Object, null);
3238

3339
// 'Required' check
3440
if (attribute.IsRequired && value == null)
3541
{
36-
string propertyFullName = $"{property.DeclaringType?.FullName}.{property.Name}";
42+
var propertyFullName = $"{property.DeclaringType?.FullName}.{property.Name}";
3743
throw new ArgumentException("Got null/unset value for a required query parameter.", propertyFullName);
3844
}
3945

40-
// Serialize
46+
// Serialization
4147
if (attribute.IsRequired || !IsDefaultOfType(value))
4248
{
43-
var keyStr = attribute.Name;
44-
var valueStr = attribute.Convert(value!);
49+
var queryParameterName = attribute.Name;
4550

46-
queryParameters[keyStr] = valueStr;
51+
foreach (var queryParameterValue in attribute.Convert(value!))
52+
{
53+
if (queryStringBuilder.Length > 0)
54+
{
55+
queryStringBuilder.Append('&');
56+
}
57+
58+
queryStringBuilder.Append(Uri.EscapeDataString(queryParameterName));
59+
queryStringBuilder.Append('=');
60+
queryStringBuilder.Append(Uri.EscapeDataString(queryParameterValue));
61+
}
4762
}
4863
}
4964

50-
return queryParameters;
51-
}
52-
53-
/// <summary>
54-
/// Returns formatted query string.
55-
/// </summary>
56-
/// <returns></returns>
57-
public string GetQueryString()
58-
{
59-
return string.Join("&",
60-
GetKeyValuePairs().Select(
61-
pair => string.Join("&",
62-
pair.Value.Select(
63-
v => $"{Uri.EscapeDataString(pair.Key)}={Uri.EscapeDataString(v)}"))));
65+
return queryStringBuilder.ToString();
6466
}
6567

6668
private static Dictionary<PropertyInfo, TAttribType> FindAttributedPublicProperties<

src/Docker.DotNet/QueryStringBoolParameterAttribute.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ namespace Docker.DotNet;
22

33
internal sealed class QueryStringBoolParameterAttribute(string name, bool required) : QueryStringParameterAttribute(name, required)
44
{
5-
public override string[] Convert(object value)
5+
public override IEnumerable<string> Convert(object value)
66
{
77
Debug.Assert(value != null);
88

src/Docker.DotNet/QueryStringListParameterAttribute.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ namespace Docker.DotNet;
22

33
internal sealed class QueryStringListParameterAttribute(string name, bool required) : QueryStringParameterAttribute(name, required)
44
{
5-
public override string[] Convert(object value)
5+
public override IEnumerable<string> Convert(object value)
66
{
77
Debug.Assert(value != null);
88
Debug.Assert(value is IList<string>);
@@ -12,6 +12,6 @@ public override string[] Convert(object value)
1212
throw new ArgumentException($"Expected value of type '{typeof(IList<string>)}'.", nameof(value));
1313
}
1414

15-
return typedValue.ToArray();
15+
return typedValue;
1616
}
1717
}

src/Docker.DotNet/QueryStringMapParameterAttribute.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ namespace Docker.DotNet;
22

33
internal sealed class QueryStringMapParameterAttribute<T>(string name, bool required) : QueryStringParameterAttribute(name, required)
44
{
5-
public override string[] Convert(object value)
5+
public override IEnumerable<string> Convert(object value)
66
{
77
Debug.Assert(value != null);
88
Debug.Assert(value is T);

src/Docker.DotNet/QueryStringParameterAttribute.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ internal class QueryStringParameterAttribute : Attribute
77

88
public bool IsRequired { get; private set; }
99

10-
public virtual string[] Convert(object value) => [value.ToString()!];
10+
public virtual IEnumerable<string> Convert(object value) => [value.ToString()!];
1111

1212
public QueryStringParameterAttribute(string name, bool required)
1313
{

0 commit comments

Comments
 (0)