/// <summary>
		/// Creates, configures and processes an asynchronous request to the indicated resource.
		/// </summary>
		/// <returns>Task in which the request is executed</returns>
		/// <param name="request">Request provided by <see cref="System.Net.Http.HttpClient"/></param>
		/// <param name="cancellationToken">Cancellation token.</param>
		protected override async Task <HttpResponseMessage> SendAsync (HttpRequestMessage request, CancellationToken cancellationToken)
		{
			AssertSelf ();
			if (request == null)
				throw new ArgumentNullException (nameof (request));
			
			if (!request.RequestUri.IsAbsoluteUri)
				throw new ArgumentException ("Must represent an absolute URI", "request");

			/*using (*/java_url = new URL (request.RequestUri.ToString ());/*) {*/
				/*using (*/java_connection = java_url.OpenConnection ();/*) {*/
					HttpURLConnection httpConnection = SetupRequestInternal (request, java_connection);
					return await ProcessRequest (request, httpConnection, cancellationToken);
				/*}
			}*/
		}
		HttpURLConnection SetupRequestInternal (HttpRequestMessage request, URLConnection conn)
		{
			if (conn == null)
				throw new ArgumentNullException (nameof (conn));
			var httpConnection = conn.JavaCast <HttpURLConnection> ();
			if (httpConnection == null)
				throw new InvalidOperationException ($"Unsupported URL scheme {conn.URL.Protocol}");

			// SSL context must be set up as soon as possible, before adding any content or
			// headers. Otherwise Java won't use the socket factory
			SetupSSL (httpConnection as HttpsURLConnection);
			if (request.Content != null)
				AddHeaders (httpConnection, request.Content.Headers);
			AddHeaders (httpConnection, request.Headers);
			
			List <string> accept_encoding = null;

			decompress_here = false;
			if ((AutomaticDecompression & DecompressionMethods.GZip) != 0) {
				AppendEncoding (GZIP_ENCODING, ref accept_encoding);
				decompress_here = true;
			}
			
			if ((AutomaticDecompression & DecompressionMethods.Deflate) != 0) {
				AppendEncoding (DEFLATE_ENCODING, ref accept_encoding);
				decompress_here = true;
			}

			if (AutomaticDecompression == DecompressionMethods.None) {
				accept_encoding?.Clear ();
				AppendEncoding (IDENTITY_ENCODING, ref accept_encoding); // Turns off compression for the Java client
			}

			if (accept_encoding?.Count > 0)
				httpConnection.SetRequestProperty ("Accept-Encoding", String.Join (",", accept_encoding));

			if (UseCookies && CookieContainer != null) {
				string cookieHeaderValue = CookieContainer.GetCookieHeader (request.RequestUri);
				if (!String.IsNullOrEmpty (cookieHeaderValue))
					httpConnection.SetRequestProperty ("Cookie", cookieHeaderValue);
			}
			
			HandlePreAuthentication (httpConnection);
			SetupRequest (request, httpConnection);
			SetupRequestBody (httpConnection, request);
			
			return httpConnection;
		}
		protected override void Dispose (bool disposing)
		{
			disposed  = true;
			if (java_connection != null) {
				java_connection.Dispose ();
				java_connection = null;
			}

			if (java_url != null) {
				java_url.Dispose ();
				java_url = null;
			}

			base.Dispose (disposing);
		}