diff --git a/RestSharp.IntegrationTests/MultipartFormDataTests.cs b/RestSharp.IntegrationTests/MultipartFormDataTests.cs index 611fb11ff..f13448b41 100644 --- a/RestSharp.IntegrationTests/MultipartFormDataTests.cs +++ b/RestSharp.IntegrationTests/MultipartFormDataTests.cs @@ -3,6 +3,7 @@ using System; using System.IO; using System.Net; + using System.Threading; using RestSharp.IntegrationTests.Helpers; @@ -58,6 +59,84 @@ public void MultipartFormData() } } + [Fact] + public void AlwaysMultipartFormData_WithParameter_Execute() + { + const string baseUrl = "http://localhost:8888/"; + + using (SimpleServer.Create(baseUrl, EchoHandler)) + { + var client = new RestClient(baseUrl); + var request = new RestRequest("?json_route=/posts") + { + AlwaysMultipartFormData = true, + Method = Method.POST, + }; + request.AddParameter("title", "test", ParameterType.RequestBody); + + var response = client.Execute(request); + Assert.Null(response.ErrorException); + } + } + + [Fact] + public void AlwaysMultipartFormData_WithParameter_ExecuteTaskAsync() + { + const string baseUrl = "http://localhost:8888/"; + + using (SimpleServer.Create(baseUrl, EchoHandler)) + { + var client = new RestClient(baseUrl); + var request = new RestRequest("?json_route=/posts") + { + AlwaysMultipartFormData = true, + Method = Method.POST, + }; + request.AddParameter("title", "test", ParameterType.RequestBody); + + var task = client.ExecuteTaskAsync(request).ContinueWith( + x => + { + Assert.Null(x.Result.ErrorException); + }); + + task.Wait(); + } + } + + [Fact] + public void AlwaysMultipartFormData_WithParameter_ExecuteAsync() + { + const string baseUrl = "http://localhost:8888/"; + + using (SimpleServer.Create(baseUrl, EchoHandler)) + { + var client = new RestClient(baseUrl); + var request = new RestRequest("?json_route=/posts") + { + AlwaysMultipartFormData = true, + Method = Method.POST, + }; + request.AddParameter("title", "test", ParameterType.RequestBody); + IRestResponse syncResponse = null; + + using (var eventWaitHandle = new AutoResetEvent(false)) + { + client.ExecuteAsync( + request, + response => + { + syncResponse = response; + eventWaitHandle.Set(); + }); + + eventWaitHandle.WaitOne(); + } + + Assert.Null(syncResponse.ErrorException); + } + } + private static void EchoHandler(HttpListenerContext obj) { obj.Response.StatusCode = 200; diff --git a/RestSharp/Http.Sync.cs b/RestSharp/Http.Sync.cs index c11e46163..a13965008 100644 --- a/RestSharp/Http.Sync.cs +++ b/RestSharp/Http.Sync.cs @@ -140,7 +140,7 @@ private HttpResponse PostPutInternal(string method) { var webRequest = ConfigureWebRequest(method, Url); - PreparePostData(webRequest); + PreparePostBody(webRequest); WriteRequestBody(webRequest); return GetResponse(webRequest); @@ -214,33 +214,29 @@ private static HttpWebResponse GetRawResponse(HttpWebRequest request) } } - private void PreparePostData(HttpWebRequest webRequest) + private void WriteRequestBody(HttpWebRequest webRequest) { - if (HasFiles || AlwaysMultipartFormData) + if (HasBody || HasFiles || AlwaysMultipartFormData) { - webRequest.ContentType = GetMultipartFormContentType(); - - using (var requestStream = webRequest.GetRequestStream()) - { - WriteMultipartFormData(requestStream); - } +#if !WINDOWS_PHONE && !PocketPC + webRequest.ContentLength = CalculateContentLength(); +#endif } - PreparePostBody(webRequest); - } - - private void WriteRequestBody(HttpWebRequest webRequest) - { - if (!HasBody) - return; - - var bytes = this.RequestBodyBytes ?? this.Encoding.GetBytes(this.RequestBody); - - webRequest.ContentLength = bytes.Length; - using (var requestStream = webRequest.GetRequestStream()) { - requestStream.Write(bytes, 0, bytes.Length); + if (HasFiles || AlwaysMultipartFormData) + { + WriteMultipartFormData(requestStream); + } + else if (RequestBodyBytes != null) + { + requestStream.Write(RequestBodyBytes, 0, RequestBodyBytes.Length); + } + else + { + WriteStringTo(requestStream, RequestBody); + } } }