1- using System ;
2- using System . Collections . Generic ;
3- using System . Globalization ;
4- using System . Net . Http ;
5- using System . Threading ;
6- using System . Threading . Tasks ;
7- using System . Xml . Linq ;
1+ // Ignore Spelling: Serializer Deserialize
82
93namespace FluentRest ;
104
@@ -13,6 +7,49 @@ namespace FluentRest;
137/// </summary>
148public static class HttpMessageExtensions
159{
10+ public static TValue GetOrAddOption < TValue > ( this HttpRequestMessage requestMessage , string key , Func < string , TValue > valueFactory )
11+ {
12+ #if NET5_0_OR_GREATER
13+ var optionKey = new HttpRequestOptionsKey < TValue > ( key ) ;
14+ if ( requestMessage . Options . TryGetValue ( optionKey , out var value ) )
15+ return value ;
16+
17+ value = valueFactory ( key ) ;
18+ requestMessage . Options . Set ( optionKey , value ) ;
19+ return value ;
20+ #else
21+ if ( requestMessage . Properties . TryGetValue ( key , out var propertyValue ) )
22+ return ( TValue ) propertyValue ;
23+
24+ propertyValue = valueFactory ( key ) ;
25+ requestMessage . Properties . Add ( key , propertyValue ) ;
26+
27+ return ( TValue ) propertyValue ;
28+ #endif
29+ }
30+
31+ public static bool TryGetOption < TValue > ( this HttpRequestMessage requestMessage , string key , out TValue value )
32+ {
33+ #if NET5_0_OR_GREATER
34+ var optionKey = new HttpRequestOptionsKey < TValue > ( key ) ;
35+ return requestMessage . Options . TryGetValue ( optionKey , out value ) ;
36+ #else
37+ var found = requestMessage . Properties . TryGetValue ( key , out var propertyValue ) ;
38+ value = found ? ( TValue ) propertyValue : default ;
39+ return found ;
40+ #endif
41+ }
42+
43+ public static void SetOption < TValue > ( this HttpRequestMessage requestMessage , string key , TValue value )
44+ {
45+ #if NET5_0_OR_GREATER
46+ var optionKey = new HttpRequestOptionsKey < TValue > ( key ) ;
47+ requestMessage . Options . Set ( optionKey , value ) ;
48+ #else
49+ requestMessage . Properties [ key ] = value ;
50+ #endif
51+ }
52+
1653 /// <summary>
1754 /// Gets the <see cref="UrlBuilder"/> from the specified <paramref name="requestMessage" /> properties dictionary.
1855 /// </summary>
@@ -26,13 +63,13 @@ public static UrlBuilder GetUrlBuilder(this HttpRequestMessage requestMessage)
2663 if ( requestMessage == null )
2764 throw new ArgumentNullException ( nameof ( requestMessage ) ) ;
2865
29- var propertyValue = requestMessage . Properties . GetOrAdd ( FluentProperties . RequestUrlBuilder , k =>
66+ var propertyValue = requestMessage . GetOrAddOption ( FluentProperties . RequestUrlBuilder , k =>
3067 requestMessage . RequestUri == null
3168 ? new UrlBuilder ( )
3269 : new UrlBuilder ( requestMessage . RequestUri )
3370 ) ;
3471
35- return propertyValue as UrlBuilder ;
72+ return propertyValue ;
3673 }
3774
3875 /// <summary>
@@ -46,7 +83,7 @@ public static void SetUrlBuilder(this HttpRequestMessage requestMessage, UrlBuil
4683 if ( requestMessage == null )
4784 throw new ArgumentNullException ( nameof ( requestMessage ) ) ;
4885
49- requestMessage . Properties [ FluentProperties . RequestUrlBuilder ] = urlBuilder ;
86+ requestMessage . SetOption ( FluentProperties . RequestUrlBuilder , urlBuilder ) ;
5087 }
5188
5289
@@ -63,7 +100,7 @@ public static object GetContentData(this HttpRequestMessage requestMessage)
63100 if ( requestMessage == null )
64101 throw new ArgumentNullException ( nameof ( requestMessage ) ) ;
65102
66- requestMessage . Properties . TryGetValue ( FluentProperties . RequestContentData , out var propertyValue ) ;
103+ requestMessage . TryGetOption < object > ( FluentProperties . RequestContentData , out var propertyValue ) ;
67104 return propertyValue ;
68105 }
69106
@@ -78,7 +115,7 @@ public static void SetContentData(this HttpRequestMessage requestMessage, object
78115 if ( requestMessage == null )
79116 throw new ArgumentNullException ( nameof ( requestMessage ) ) ;
80117
81- requestMessage . Properties [ FluentProperties . RequestContentData ] = contentData ;
118+ requestMessage . SetOption ( FluentProperties . RequestContentData , contentData ) ;
82119 }
83120
84121
@@ -95,8 +132,8 @@ public static Dictionary<string, ICollection<string>> GetFormData(this HttpReque
95132 if ( requestMessage == null )
96133 throw new ArgumentNullException ( nameof ( requestMessage ) ) ;
97134
98- var propertyValue = requestMessage . Properties . GetOrAdd ( FluentProperties . RequestFormData , k => new Dictionary < string , ICollection < string > > ( ) ) ;
99- return propertyValue as Dictionary < string , ICollection < string > > ;
135+ var propertyValue = requestMessage . GetOrAddOption ( FluentProperties . RequestFormData , k => new Dictionary < string , ICollection < string > > ( ) ) ;
136+ return propertyValue ;
100137 }
101138
102139
@@ -113,8 +150,10 @@ public static HttpCompletionOption GetCompletionOption(this HttpRequestMessage r
113150 if ( requestMessage == null )
114151 throw new ArgumentNullException ( nameof ( requestMessage ) ) ;
115152
116- requestMessage . Properties . TryGetValue ( FluentProperties . HttpCompletionOption , out var propertyValue ) ;
117- return ( HttpCompletionOption ) ( propertyValue ?? HttpCompletionOption . ResponseContentRead ) ;
153+ if ( requestMessage . TryGetOption < HttpCompletionOption > ( FluentProperties . HttpCompletionOption , out var value ) )
154+ return value ;
155+
156+ return HttpCompletionOption . ResponseContentRead ;
118157 }
119158
120159 /// <summary>
@@ -128,7 +167,7 @@ public static void SetCompletionOption(this HttpRequestMessage requestMessage, H
128167 if ( requestMessage == null )
129168 throw new ArgumentNullException ( nameof ( requestMessage ) ) ;
130169
131- requestMessage . Properties [ FluentProperties . HttpCompletionOption ] = completionOption ;
170+ requestMessage . SetOption ( FluentProperties . HttpCompletionOption , completionOption ) ;
132171 }
133172
134173
@@ -145,8 +184,10 @@ public static CancellationToken GetCancellationToken(this HttpRequestMessage req
145184 if ( requestMessage == null )
146185 throw new ArgumentNullException ( nameof ( requestMessage ) ) ;
147186
148- requestMessage . Properties . TryGetValue ( FluentProperties . CancellationToken , out var propertyValue ) ;
149- return ( CancellationToken ) ( propertyValue ?? CancellationToken . None ) ;
187+ if ( requestMessage . TryGetOption < CancellationToken > ( FluentProperties . CancellationToken , out var propertyValue ) )
188+ return propertyValue ;
189+
190+ return CancellationToken . None ;
150191 }
151192
152193 /// <summary>
@@ -160,7 +201,7 @@ public static void SetCancellationToken(this HttpRequestMessage requestMessage,
160201 if ( requestMessage == null )
161202 throw new ArgumentNullException ( nameof ( requestMessage ) ) ;
162203
163- requestMessage . Properties [ FluentProperties . CancellationToken ] = cancellationToken ;
204+ requestMessage . SetOption ( FluentProperties . CancellationToken , cancellationToken ) ;
164205 }
165206
166207
@@ -177,8 +218,8 @@ public static IContentSerializer GetContentSerializer(this HttpRequestMessage re
177218 if ( requestMessage == null )
178219 throw new ArgumentNullException ( nameof ( requestMessage ) ) ;
179220
180- var propertyValue = requestMessage . Properties . GetOrAdd ( FluentProperties . ContentSerializer , k => ContentSerializer . Current ) ;
181- return propertyValue as IContentSerializer ;
221+ var propertyValue = requestMessage . GetOrAddOption ( FluentProperties . ContentSerializer , k => ContentSerializer . Current ) ;
222+ return propertyValue ;
182223 }
183224
184225 /// <summary>
@@ -192,7 +233,7 @@ public static void SetContentSerializer(this HttpRequestMessage requestMessage,
192233 if ( requestMessage == null )
193234 throw new ArgumentNullException ( nameof ( requestMessage ) ) ;
194235
195- requestMessage . Properties [ FluentProperties . ContentSerializer ] = contentSerializer ?? ContentSerializer . Current ;
236+ requestMessage . SetOption ( FluentProperties . ContentSerializer , contentSerializer ?? ContentSerializer . Current ) ;
196237 }
197238
198239
0 commit comments