Skip to content

Commit 658f098

Browse files
author
Michael Hallett
committed
Merge pull request #683 from issafram/Issue672
closes #672
2 parents aebc699 + ede7457 commit 658f098

File tree

2 files changed

+97
-22
lines changed

2 files changed

+97
-22
lines changed

RestSharp.IntegrationTests/MultipartFormDataTests.cs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System;
44
using System.IO;
55
using System.Net;
6+
using System.Threading;
67

78
using RestSharp.IntegrationTests.Helpers;
89

@@ -58,6 +59,84 @@ public void MultipartFormData()
5859
}
5960
}
6061

62+
[Fact]
63+
public void AlwaysMultipartFormData_WithParameter_Execute()
64+
{
65+
const string baseUrl = "http://localhost:8888/";
66+
67+
using (SimpleServer.Create(baseUrl, EchoHandler))
68+
{
69+
var client = new RestClient(baseUrl);
70+
var request = new RestRequest("?json_route=/posts")
71+
{
72+
AlwaysMultipartFormData = true,
73+
Method = Method.POST,
74+
};
75+
request.AddParameter("title", "test", ParameterType.RequestBody);
76+
77+
var response = client.Execute(request);
78+
Assert.Null(response.ErrorException);
79+
}
80+
}
81+
82+
[Fact]
83+
public void AlwaysMultipartFormData_WithParameter_ExecuteTaskAsync()
84+
{
85+
const string baseUrl = "http://localhost:8888/";
86+
87+
using (SimpleServer.Create(baseUrl, EchoHandler))
88+
{
89+
var client = new RestClient(baseUrl);
90+
var request = new RestRequest("?json_route=/posts")
91+
{
92+
AlwaysMultipartFormData = true,
93+
Method = Method.POST,
94+
};
95+
request.AddParameter("title", "test", ParameterType.RequestBody);
96+
97+
var task = client.ExecuteTaskAsync(request).ContinueWith(
98+
x =>
99+
{
100+
Assert.Null(x.Result.ErrorException);
101+
});
102+
103+
task.Wait();
104+
}
105+
}
106+
107+
[Fact]
108+
public void AlwaysMultipartFormData_WithParameter_ExecuteAsync()
109+
{
110+
const string baseUrl = "http://localhost:8888/";
111+
112+
using (SimpleServer.Create(baseUrl, EchoHandler))
113+
{
114+
var client = new RestClient(baseUrl);
115+
var request = new RestRequest("?json_route=/posts")
116+
{
117+
AlwaysMultipartFormData = true,
118+
Method = Method.POST,
119+
};
120+
request.AddParameter("title", "test", ParameterType.RequestBody);
121+
IRestResponse syncResponse = null;
122+
123+
using (var eventWaitHandle = new AutoResetEvent(false))
124+
{
125+
client.ExecuteAsync(
126+
request,
127+
response =>
128+
{
129+
syncResponse = response;
130+
eventWaitHandle.Set();
131+
});
132+
133+
eventWaitHandle.WaitOne();
134+
}
135+
136+
Assert.Null(syncResponse.ErrorException);
137+
}
138+
}
139+
61140
private static void EchoHandler(HttpListenerContext obj)
62141
{
63142
obj.Response.StatusCode = 200;

RestSharp/Http.Sync.cs

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ private HttpResponse PostPutInternal(string method)
140140
{
141141
var webRequest = ConfigureWebRequest(method, Url);
142142

143-
PreparePostData(webRequest);
143+
PreparePostBody(webRequest);
144144

145145
WriteRequestBody(webRequest);
146146
return GetResponse(webRequest);
@@ -214,33 +214,29 @@ private static HttpWebResponse GetRawResponse(HttpWebRequest request)
214214
}
215215
}
216216

217-
private void PreparePostData(HttpWebRequest webRequest)
217+
private void WriteRequestBody(HttpWebRequest webRequest)
218218
{
219-
if (HasFiles || AlwaysMultipartFormData)
219+
if (HasBody || HasFiles || AlwaysMultipartFormData)
220220
{
221-
webRequest.ContentType = GetMultipartFormContentType();
222-
223-
using (var requestStream = webRequest.GetRequestStream())
224-
{
225-
WriteMultipartFormData(requestStream);
226-
}
221+
#if !WINDOWS_PHONE && !PocketPC
222+
webRequest.ContentLength = CalculateContentLength();
223+
#endif
227224
}
228225

229-
PreparePostBody(webRequest);
230-
}
231-
232-
private void WriteRequestBody(HttpWebRequest webRequest)
233-
{
234-
if (!HasBody)
235-
return;
236-
237-
var bytes = this.RequestBodyBytes ?? this.Encoding.GetBytes(this.RequestBody);
238-
239-
webRequest.ContentLength = bytes.Length;
240-
241226
using (var requestStream = webRequest.GetRequestStream())
242227
{
243-
requestStream.Write(bytes, 0, bytes.Length);
228+
if (HasFiles || AlwaysMultipartFormData)
229+
{
230+
WriteMultipartFormData(requestStream);
231+
}
232+
else if (RequestBodyBytes != null)
233+
{
234+
requestStream.Write(RequestBodyBytes, 0, RequestBodyBytes.Length);
235+
}
236+
else
237+
{
238+
WriteStringTo(requestStream, RequestBody);
239+
}
244240
}
245241
}
246242

0 commit comments

Comments
 (0)