protected async internal override Task<HttpResponseMessage> SendAsync (HttpRequestMessage request, CancellationToken cancellationToken)
{
if (disposed)
throw new ObjectDisposedException (GetType ().ToString ());
Volatile.Write (ref sentRequest, true);
var wrequest = CreateWebRequest (request);
HttpWebResponse wresponse = null;
try {
using (cancellationToken.Register (l => ((HttpWebRequest)l).Abort (), wrequest)) {
var content = request.Content;
if (content != null) {
var headers = wrequest.Headers;
foreach (var header in content.Headers) {
foreach (var value in header.Value) {
headers.AddValue (header.Key, value);
}
}
//
// Content length has to be set because HttpWebRequest is running without buffering
//
var contentLength = content.Headers.ContentLength;
if (contentLength != null) {
wrequest.ContentLength = contentLength.Value;
} else {
await content.LoadIntoBufferAsync (MaxRequestContentBufferSize).ConfigureAwait (false);
wrequest.ContentLength = content.Headers.ContentLength.Value;
}
var stream = await wrequest.GetRequestStreamAsync ().ConfigureAwait (false);
await request.Content.CopyToAsync (stream).ConfigureAwait (false);
} else if (HttpMethod.Post.Equals (request.Method) || HttpMethod.Put.Equals (request.Method) || HttpMethod.Delete.Equals (request.Method)) {
// Explicitly set this to make sure we're sending a "Content-Length: 0" header.
// This fixes the issue that's been reported on the forums:
// http://forums.xamarin.com/discussion/17770/length-required-error-in-http-post-since-latest-release
wrequest.ContentLength = 0;
}
wresponse = (HttpWebResponse)await wrequest.GetResponseAsync ().ConfigureAwait (false);
}
} catch (WebException we) {
if (we.Status != WebExceptionStatus.RequestCanceled)
throw;
}
if (cancellationToken.IsCancellationRequested) {
var cancelled = new TaskCompletionSource<HttpResponseMessage> ();
cancelled.SetCanceled ();
return await cancelled.Task;
}
return CreateResponseMessage (wresponse, request, cancellationToken);
}
}