System.Net.Http.HttpClientHandler.SendAsync C# (CSharp) Method

SendAsync() protected method

protected SendAsync ( HttpRequestMessage request, CancellationToken cancellationToken ) : Task
request HttpRequestMessage
cancellationToken System.Threading.CancellationToken
return Task
		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);
		}
	}