Skip to content

Commit ad0b095

Browse files
committed
Merge pull request restsharp#614 from restsharp/608_Encoding
Exposed the Encoding used for the querystring and form body
2 parents 6d3ef35 + d95b473 commit ad0b095

File tree

7 files changed

+241
-251
lines changed

7 files changed

+241
-251
lines changed

RestSharp/Http.Async.cs

+18-20
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#endregion
1616

1717
using System;
18+
using System.Linq;
1819
using System.Net;
1920
using System.Threading;
2021
using RestSharp.Extensions;
@@ -40,7 +41,7 @@ namespace RestSharp
4041
/// </summary>
4142
public partial class Http
4243
{
43-
private TimeOutState _timeoutState;
44+
private TimeOutState timeoutState;
4445

4546
public HttpWebRequest DeleteAsync(Action<HttpResponse> action)
4647
{
@@ -129,11 +130,11 @@ private HttpWebRequest GetStyleMethodInternalAsync(string method, Action<HttpRes
129130
}
130131
else
131132
{
132-
_timeoutState = new TimeOutState { Request = webRequest };
133+
this.timeoutState = new TimeOutState { Request = webRequest };
133134

134135
var asyncResult = webRequest.BeginGetResponse(result => ResponseCallback(result, callback), webRequest);
135136

136-
SetTimeout(asyncResult, _timeoutState);
137+
SetTimeout(asyncResult, this.timeoutState);
137138
}
138139
}
139140
catch (Exception ex)
@@ -151,7 +152,7 @@ private HttpResponse CreateErrorResponse(Exception ex)
151152

152153
if (webException != null && webException.Status == WebExceptionStatus.RequestCanceled)
153154
{
154-
response.ResponseStatus = _timeoutState.TimedOut ? ResponseStatus.TimedOut : ResponseStatus.Aborted;
155+
response.ResponseStatus = this.timeoutState.TimedOut ? ResponseStatus.TimedOut : ResponseStatus.Aborted;
155156
return response;
156157
}
157158

@@ -182,7 +183,7 @@ private HttpWebRequest PutPostInternalAsync(string method, Action<HttpResponse>
182183
private void WriteRequestBodyAsync(HttpWebRequest webRequest, Action<HttpResponse> callback)
183184
{
184185
IAsyncResult asyncResult;
185-
_timeoutState = new TimeOutState { Request = webRequest };
186+
this.timeoutState = new TimeOutState { Request = webRequest };
186187

187188
if (HasBody || HasFiles || AlwaysMultipartFormData)
188189
{
@@ -196,7 +197,7 @@ private void WriteRequestBodyAsync(HttpWebRequest webRequest, Action<HttpRespons
196197
asyncResult = webRequest.BeginGetResponse(r => ResponseCallback(r, callback), webRequest);
197198
}
198199

199-
SetTimeout(asyncResult, _timeoutState);
200+
SetTimeout(asyncResult, this.timeoutState);
200201
}
201202

202203
private long CalculateContentLength()
@@ -206,33 +207,31 @@ private long CalculateContentLength()
206207

207208
if (!HasFiles && !AlwaysMultipartFormData)
208209
{
209-
return _defaultEncoding.GetByteCount(RequestBody);
210+
return encoding.GetByteCount(RequestBody);
210211
}
211212

212213
// calculate length for multipart form
213214
long length = 0;
214215

215216
foreach (var file in Files)
216217
{
217-
length += _defaultEncoding.GetByteCount(GetMultipartFileHeader(file));
218+
length += this.Encoding.GetByteCount(GetMultipartFileHeader(file));
218219
length += file.ContentLength;
219-
length += _defaultEncoding.GetByteCount(_lineBreak);
220+
length += this.Encoding.GetByteCount(LINE_BREAK);
220221
}
221222

222-
foreach (var param in Parameters)
223-
{
224-
length += _defaultEncoding.GetByteCount(GetMultipartFormData(param));
225-
}
223+
length = this.Parameters.Aggregate(length,
224+
(current, param) => current + this.Encoding.GetByteCount(this.GetMultipartFormData(param)));
226225

227-
length += _defaultEncoding.GetByteCount(GetMultipartFooter());
226+
length += this.Encoding.GetByteCount(GetMultipartFooter());
228227
return length;
229228
}
230229

231230
private void RequestStreamCallback(IAsyncResult result, Action<HttpResponse> callback)
232231
{
233232
var webRequest = (HttpWebRequest)result.AsyncState;
234233

235-
if (_timeoutState.TimedOut)
234+
if (this.timeoutState.TimedOut)
236235
{
237236
var response = new HttpResponse { ResponseStatus = ResponseStatus.TimedOut };
238237
ExecuteCallback(response, callback);
@@ -265,7 +264,7 @@ private void RequestStreamCallback(IAsyncResult result, Action<HttpResponse> cal
265264
}
266265

267266
IAsyncResult asyncResult = webRequest.BeginGetResponse(r => ResponseCallback(r, callback), webRequest);
268-
SetTimeout(asyncResult, _timeoutState);
267+
SetTimeout(asyncResult, this.timeoutState);
269268
}
270269

271270
private void SetTimeout(IAsyncResult asyncResult, TimeOutState timeOutState)
@@ -304,7 +303,6 @@ private static void TimeoutCallback(object state, bool timedOut)
304303

305304
private static void GetRawResponseAsync(IAsyncResult result, Action<HttpWebResponse> callback)
306305
{
307-
var response = new HttpResponse { ResponseStatus = ResponseStatus.None };
308306
HttpWebResponse raw;
309307

310308
try
@@ -349,7 +347,7 @@ private void ResponseCallback(IAsyncResult result, Action<HttpResponse> callback
349347

350348
try
351349
{
352-
if (_timeoutState.TimedOut)
350+
if (this.timeoutState.TimedOut)
353351
{
354352
response.ResponseStatus = ResponseStatus.TimedOut;
355353
ExecuteCallback(response, callback);
@@ -376,12 +374,12 @@ private static void ExecuteCallback(HttpResponse response, Action<HttpResponse>
376374
partial void AddAsyncHeaderActions()
377375
{
378376
#if SILVERLIGHT
379-
_restrictedHeaderActions.Add("Content-Length", (r, v) => r.ContentLength = Convert.ToInt64(v));
377+
restrictedHeaderActions.Add("Content-Length", (r, v) => r.ContentLength = Convert.ToInt64(v));
380378
#endif
381379
#if WINDOWS_PHONE
382380
// WP7 doesn't as of Beta doesn't support a way to set Content-Length either directly
383381
// or indirectly
384-
_restrictedHeaderActions.Add("Content-Length", (r, v) => { });
382+
restrictedHeaderActions.Add("Content-Length", (r, v) => { });
385383
#endif
386384
}
387385

RestSharp/Http.Sync.cs

+8-8
Original file line numberDiff line numberDiff line change
@@ -148,13 +148,13 @@ private HttpResponse PostPutInternal(string method)
148148

149149
partial void AddSyncHeaderActions()
150150
{
151-
_restrictedHeaderActions.Add("Connection", (r, v) => r.Connection = v);
152-
_restrictedHeaderActions.Add("Content-Length", (r, v) => r.ContentLength = Convert.ToInt64(v));
153-
_restrictedHeaderActions.Add("Expect", (r, v) => r.Expect = v);
154-
_restrictedHeaderActions.Add("If-Modified-Since", (r, v) => r.IfModifiedSince = Convert.ToDateTime(v));
155-
_restrictedHeaderActions.Add("Referer", (r, v) => r.Referer = v);
156-
_restrictedHeaderActions.Add("Transfer-Encoding", (r, v) => { r.TransferEncoding = v; r.SendChunked = true; });
157-
_restrictedHeaderActions.Add("User-Agent", (r, v) => r.UserAgent = v);
151+
restrictedHeaderActions.Add("Connection", (r, v) => r.Connection = v);
152+
restrictedHeaderActions.Add("Content-Length", (r, v) => r.ContentLength = Convert.ToInt64(v));
153+
restrictedHeaderActions.Add("Expect", (r, v) => r.Expect = v);
154+
restrictedHeaderActions.Add("If-Modified-Since", (r, v) => r.IfModifiedSince = Convert.ToDateTime(v));
155+
restrictedHeaderActions.Add("Referer", (r, v) => r.Referer = v);
156+
restrictedHeaderActions.Add("Transfer-Encoding", (r, v) => { r.TransferEncoding = v; r.SendChunked = true; });
157+
restrictedHeaderActions.Add("User-Agent", (r, v) => r.UserAgent = v);
158158
}
159159

160160
private void ExtractErrorResponse(HttpResponse httpResponse, Exception ex)
@@ -234,7 +234,7 @@ private void WriteRequestBody(HttpWebRequest webRequest)
234234
if (!HasBody)
235235
return;
236236

237-
var bytes = RequestBodyBytes == null ? _defaultEncoding.GetBytes(RequestBody) : RequestBodyBytes;
237+
var bytes = this.RequestBodyBytes ?? this.Encoding.GetBytes(this.RequestBody);
238238

239239
webRequest.ContentLength = bytes.Length;
240240

RestSharp/Http.cs

+29-27
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ namespace RestSharp
3434
/// </summary>
3535
public partial class Http : IHttp, IHttpFactory
3636
{
37-
private const string _lineBreak = "\r\n";
38-
private static readonly Encoding _defaultEncoding = Encoding.UTF8;
37+
private const string LINE_BREAK = "\r\n";
3938

4039
///<summary>
4140
/// Creates an IHttp
@@ -148,6 +147,9 @@ protected bool HasFiles
148147
/// </summary>
149148
public bool UseDefaultCredentials { get; set; }
150149
#endif
150+
private Encoding encoding = Encoding.UTF8;
151+
152+
public Encoding Encoding { get { return this.encoding; } set { this.encoding = value; } }
151153

152154
/// <summary>
153155
/// HTTP headers to be sent with request
@@ -201,15 +203,15 @@ protected bool HasFiles
201203
/// </summary>
202204
public Http()
203205
{
204-
Headers = new List<HttpHeader>();
205-
Files = new List<HttpFile>();
206-
Parameters = new List<HttpParameter>();
207-
Cookies = new List<HttpCookie>();
206+
this.Headers = new List<HttpHeader>();
207+
this.Files = new List<HttpFile>();
208+
this.Parameters = new List<HttpParameter>();
209+
this.Cookies = new List<HttpCookie>();
208210

209-
_restrictedHeaderActions = new Dictionary<string, Action<HttpWebRequest, string>>(StringComparer.OrdinalIgnoreCase);
211+
restrictedHeaderActions = new Dictionary<string, Action<HttpWebRequest, string>>(StringComparer.OrdinalIgnoreCase);
210212

211-
AddSharedHeaderActions();
212-
AddSyncHeaderActions();
213+
this.AddSharedHeaderActions();
214+
this.AddSyncHeaderActions();
213215
}
214216

215217
partial void AddSyncHeaderActions();
@@ -218,10 +220,10 @@ public Http()
218220

219221
private void AddSharedHeaderActions()
220222
{
221-
_restrictedHeaderActions.Add("Accept", (r, v) => r.Accept = v);
222-
_restrictedHeaderActions.Add("Content-Type", (r, v) => r.ContentType = v);
223+
restrictedHeaderActions.Add("Accept", (r, v) => r.Accept = v);
224+
restrictedHeaderActions.Add("Content-Type", (r, v) => r.ContentType = v);
223225
#if NET4
224-
_restrictedHeaderActions.Add("Date", (r, v) =>
226+
restrictedHeaderActions.Add("Date", (r, v) =>
225227
{
226228
DateTime parsed;
227229

@@ -231,28 +233,28 @@ private void AddSharedHeaderActions()
231233
}
232234
});
233235

234-
_restrictedHeaderActions.Add("Host", (r, v) => r.Host = v);
236+
restrictedHeaderActions.Add("Host", (r, v) => r.Host = v);
235237
#else
236-
_restrictedHeaderActions.Add("Date", (r, v) => { /* Set by system */ });
237-
_restrictedHeaderActions.Add("Host", (r, v) => { /* Set by system */ });
238+
restrictedHeaderActions.Add("Date", (r, v) => { /* Set by system */ });
239+
restrictedHeaderActions.Add("Host", (r, v) => { /* Set by system */ });
238240
#endif
239241

240242
#if FRAMEWORK
241-
_restrictedHeaderActions.Add("Range", (r, v) => { AddRange(r, v); });
243+
restrictedHeaderActions.Add("Range", (r, v) => { AddRange(r, v); });
242244
#endif
243245
}
244246

245-
private const string FormBoundary = "-----------------------------28947758029299";
247+
private const string FORM_BOUNDARY = "-----------------------------28947758029299";
246248

247249
private static string GetMultipartFormContentType()
248250
{
249-
return string.Format("multipart/form-data; boundary={0}", FormBoundary);
251+
return string.Format("multipart/form-data; boundary={0}", FORM_BOUNDARY);
250252
}
251253

252254
private static string GetMultipartFileHeader(HttpFile file)
253255
{
254256
return string.Format("--{0}{4}Content-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"{4}Content-Type: {3}{4}{4}",
255-
FormBoundary, file.Name, file.FileName, file.ContentType ?? "application/octet-stream", _lineBreak);
257+
FORM_BOUNDARY, file.Name, file.FileName, file.ContentType ?? "application/octet-stream", LINE_BREAK);
256258
}
257259

258260
private string GetMultipartFormData(HttpParameter param)
@@ -261,25 +263,25 @@ private string GetMultipartFormData(HttpParameter param)
261263
? "--{0}{3}Content-Type: {1}{3}Content-Disposition: form-data; name=\"{1}\"{3}{3}{2}{3}"
262264
: "--{0}{3}Content-Disposition: form-data; name=\"{1}\"{3}{3}{2}{3}";
263265

264-
return string.Format(format, FormBoundary, param.Name, param.Value, _lineBreak);
266+
return string.Format(format, FORM_BOUNDARY, param.Name, param.Value, LINE_BREAK);
265267
}
266268

267269
private static string GetMultipartFooter()
268270
{
269-
return string.Format("--{0}--{1}", FormBoundary, _lineBreak);
271+
return string.Format("--{0}--{1}", FORM_BOUNDARY, LINE_BREAK);
270272
}
271273

272-
private readonly IDictionary<string, Action<HttpWebRequest, string>> _restrictedHeaderActions;
274+
private readonly IDictionary<string, Action<HttpWebRequest, string>> restrictedHeaderActions;
273275

274276
// handle restricted headers the .NET way - thanks @dimebrain!
275277
// http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.headers.aspx
276278
private void AppendHeaders(HttpWebRequest webRequest)
277279
{
278280
foreach (var header in Headers)
279281
{
280-
if (_restrictedHeaderActions.ContainsKey(header.Name))
282+
if (restrictedHeaderActions.ContainsKey(header.Name))
281283
{
282-
_restrictedHeaderActions[header.Name].Invoke(webRequest, header.Value);
284+
restrictedHeaderActions[header.Name].Invoke(webRequest, header.Value);
283285
}
284286
else
285287
{
@@ -356,9 +358,9 @@ private void PreparePostBody(HttpWebRequest webRequest)
356358
}
357359
}
358360

359-
private static void WriteStringTo(Stream stream, string toWrite)
361+
private void WriteStringTo(Stream stream, string toWrite)
360362
{
361-
var bytes = _defaultEncoding.GetBytes(toWrite);
363+
var bytes = this.Encoding.GetBytes(toWrite);
362364
stream.Write(bytes, 0, bytes.Length);
363365
}
364366

@@ -376,7 +378,7 @@ private void WriteMultipartFormData(Stream requestStream)
376378

377379
// Write the file data directly to the Stream, rather than serializing it to a string.
378380
file.Writer(requestStream);
379-
WriteStringTo(requestStream, _lineBreak);
381+
WriteStringTo(requestStream, LINE_BREAK);
380382
}
381383

382384
WriteStringTo(requestStream, GetMultipartFooter());

RestSharp/IHttp.cs

+3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
using System.IO;
2020
using System.Net;
2121
using System.Security.Cryptography.X509Certificates;
22+
using System.Text;
2223

2324
namespace RestSharp
2425
{
@@ -57,6 +58,8 @@ public interface IHttp
5758
bool UseDefaultCredentials { get; set; }
5859
#endif
5960

61+
Encoding Encoding { get; set; }
62+
6063
IList<HttpHeader> Headers { get; }
6164

6265
IList<HttpParameter> Parameters { get; }

0 commit comments

Comments
 (0)