12
12
// See the License for the specific language governing permissions and
13
13
// limitations under the License.
14
14
15
+ using System . Net ;
15
16
using System . Net . Http . Headers ;
16
17
using System . Runtime . Serialization ;
17
18
using RestSharp . Extensions ;
18
19
using static RestSharp . KnownHeaders ;
20
+
19
21
// ReSharper disable InvertIf
20
22
// ReSharper disable SuggestBaseTypeForParameter
21
23
@@ -26,8 +28,6 @@ class RequestContent : IDisposable {
26
28
readonly RestRequest _request ;
27
29
readonly List < Stream > _streams = new ( ) ;
28
30
29
-
30
-
31
31
HttpContent ? Content { get ; set ; }
32
32
33
33
public RequestContent ( RestClient client , RestRequest request ) {
@@ -55,8 +55,7 @@ void AddFiles() {
55
55
_streams . Add ( stream ) ;
56
56
var fileContent = new StreamContent ( stream ) ;
57
57
58
- if ( file . ContentType != null )
59
- fileContent . Headers . ContentType = MediaTypeHeaderValue . Parse ( file . ContentType ) ;
58
+ if ( file . ContentType != null ) fileContent . Headers . ContentType = MediaTypeHeaderValue . Parse ( file . ContentType ) ;
60
59
61
60
fileContent . Headers . ContentDisposition = new ContentDispositionHeaderValue ( "form-data" ) {
62
61
Name = $ "\" { file . Name } \" ",
@@ -97,8 +96,7 @@ HttpContent GetSerialized() {
97
96
98
97
var content = serializer . Serialize ( body ) ;
99
98
100
- if ( content == null )
101
- throw new SerializationException ( "Request body serialized to null" ) ;
99
+ if ( content == null ) throw new SerializationException ( "Request body serialized to null" ) ;
102
100
103
101
return new StringContent (
104
102
content ,
@@ -150,20 +148,33 @@ void AddPostParameters(ParametersCollection? postParameters) {
150
148
// we got the multipart form already instantiated, just add parameters to it
151
149
foreach ( var postParameter in postParameters ! ) {
152
150
var parameterName = postParameter . Name ! ;
151
+
153
152
mpContent . Add (
154
153
new StringContent ( postParameter . Value ! . ToString ( ) ! , _client . Options . Encoding , postParameter . ContentType ) ,
155
154
_request . MultipartFormQuoteParameters ? $ "\" { parameterName } \" " : parameterName
156
155
) ;
157
156
}
158
157
}
159
158
else {
160
- // we should not have anything else except the parameters, so we send them as form URL encoded
159
+ #if NETCORE
160
+ // We should not have anything else except the parameters, so we send them as form URL encoded.
161
161
var formContent = new FormUrlEncodedContent (
162
162
_request . Parameters
163
163
. Where ( x => x . Type == ParameterType . GetOrPost )
164
164
. Select ( x => new KeyValuePair < string , string > ( x . Name ! , x . Value ! . ToString ( ) ! ) ) !
165
165
) ;
166
166
Content = formContent ;
167
+ #else
168
+ // However due to bugs in HttpClient FormUrlEncodedContent (see https://github.com/restsharp/RestSharp/issues/1814) we
169
+ // do the encoding ourselves using WebUtility.UrlEncode instead.
170
+ var formData = _request . Parameters
171
+ . Where ( x => x . Type == ParameterType . GetOrPost )
172
+ . Select ( x => new KeyValuePair < string , string > ( x . Name ! , x . Value ! . ToString ( ) ! ) ) ! ;
173
+ var encodedItems = formData . Select ( i => $ "{ WebUtility . UrlEncode ( i . Key ) } ={ WebUtility . UrlEncode ( i . Value ) } " /*.Replace("%20", "+")*/ ) ;
174
+ var encodedContent = new StringContent ( string . Join ( "&" , encodedItems ) , null , "application/x-www-form-urlencoded" ) ;
175
+
176
+ Content = encodedContent ;
177
+ #endif
167
178
}
168
179
}
169
180
0 commit comments