/// <summary> /// Sends a POST request as an asynchronous operation. /// </summary> /// <param name="url">The URL.</param> /// <param name="prm">The parameters.</param> /// <param name="authorizationHeader">The OAuth header.</param> /// <param name="options">The connection options for the request.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns> /// <para>The task object representing the asynchronous operation.</para> /// <para>The Result property on the task object returns the response.</para> /// </returns> internal static Task<AsyncResponse> HttpPostAsync(string url, IEnumerable<KeyValuePair<string, object>> prm, string authorizationHeader, ConnectionOptions options, CancellationToken cancellationToken) { if(options == null) options = new ConnectionOptions(); if(prm == null) prm = new Dictionary<string, object>(); #if WIN_RT var req = new HttpRequestMessage(HttpMethod.Post, new Uri(url)); req.Content = new HttpFormUrlEncodedContent( prm.Select(kvp =>new KeyValuePair<string, string>(kvp.Key, kvp.Value.ToString())) ); return ExecuteRequest(req, authorizationHeader, options, cancellationToken); #else var task = new TaskCompletionSource<AsyncResponse>(); if(cancellationToken.IsCancellationRequested) { task.TrySetCanceled(); return task.Task; } try { var req = (HttpWebRequest)WebRequest.Create(url); var reg = cancellationToken.Register(() => { task.TrySetCanceled(); req.Abort(); }); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; req.Headers[HttpRequestHeader.Authorization] = authorizationHeader; #if !(PCL || WP) req.ServicePoint.Expect100Continue = false; req.ReadWriteTimeout = options.ReadWriteTimeout; req.Proxy = options.Proxy; if(options.UseCompression) req.AutomaticDecompression = CompressionType; if (options.DisableKeepAlive) req.KeepAlive = false; #endif #if !PCL req.UserAgent = options.UserAgent; if (options.BeforeRequestAction != null) options.BeforeRequestAction(req); #endif var timeoutCancellation = new CancellationTokenSource(); DelayAction(options.Timeout, timeoutCancellation.Token, () => { try { #if PCL throw new TimeoutException(); #else throw new WebException("Timeout", WebExceptionStatus.Timeout); #endif } catch(Exception ex) { task.TrySetException(ex); } req.Abort(); }); req.BeginGetRequestStream(reqStrAr => { try { var data = Encoding.UTF8.GetBytes(CreateQueryString(prm)); using(var stream = req.EndGetRequestStream(reqStrAr)) stream.Write(data, 0, data.Length); req.BeginGetResponse(resAr => { timeoutCancellation.Cancel(); reg.Dispose(); try { task.TrySetResult(new AsyncResponse((HttpWebResponse)req.EndGetResponse(resAr))); } catch(Exception ex) { task.TrySetException(ex); } }, null); } catch(Exception ex) { task.TrySetException(ex); } }, null); } catch(Exception ex) { task.TrySetException(ex); } return task.Task; #endif }
Task<AsyncResponse> HttpPostWithMultipartFormDataAsync(string url, IEnumerable<KeyValuePair<string, object>> prm, string authorizationHeader, ConnectionOptions options, CancellationToken cancellationToken) { if(options == null) options = new ConnectionOptions(); #if WIN_RT var req = new HttpRequestMessage(HttpMethod.Post, new Uri(url)); var content = new HttpMultipartFormDataContent(); foreach(var x in prm) { cancellationToken.ThrowIfCancellationRequested(); var valueStream = x.Value as Stream; var valueInputStream = x.Value as IInputStream; var valueBytes = x.Value as IEnumerable<byte>; var valueBuffer = x.Value as IBuffer; var valueInputStreamReference = x.Value as IInputStreamReference; var valueStorageItem = x.Value as IStorageItem; if(valueInputStreamReference != null) valueInputStream = await valueInputStreamReference.OpenSequentialReadAsync(); if(valueStream != null) valueInputStream = valueStream.AsInputStream(); if(valueBytes != null) { var valueByteArray = valueBytes as byte[]; if(valueByteArray == null) valueByteArray = valueBytes.ToArray(); valueBuffer = valueByteArray.AsBuffer(); } if(valueInputStream != null) content.Add(new HttpStreamContent(valueInputStream), x.Key, valueStorageItem != null ? valueStorageItem.Name : "file"); else if(valueBuffer != null) content.Add(new HttpBufferContent(valueBuffer), x.Key, valueStorageItem != null ? valueStorageItem.Name : "file"); else content.Add(new HttpStringContent(x.Value.ToString()), x.Key); } cancellationToken.ThrowIfCancellationRequested(); req.Content = content; return await ExecuteRequest(req, authorizationHeader, options, cancellationToken).ConfigureAwait(false); #else var task = new TaskCompletionSource<AsyncResponse>(); if(cancellationToken.IsCancellationRequested) { task.TrySetCanceled(); return task.Task; } try { var boundary = Guid.NewGuid().ToString(); var req = (HttpWebRequest)WebRequest.Create(url); var reg = cancellationToken.Register(() => { task.TrySetCanceled(); req.Abort(); }); req.Method = "POST"; #if !(PCL || WP) req.ServicePoint.Expect100Continue = false; req.ReadWriteTimeout = options.ReadWriteTimeout; req.Proxy = options.Proxy; req.SendChunked = true; if(options.UseCompression) req.AutomaticDecompression = CompressionType; if (options.DisableKeepAlive) req.KeepAlive = false; #endif #if !PCL req.UserAgent = options.UserAgent; #endif req.ContentType = "multipart/form-data;boundary=" + boundary; req.Headers[HttpRequestHeader.Authorization] = authorizationHeader; #if !PCL if(options.BeforeRequestAction != null) options.BeforeRequestAction(req); #endif var timeoutCancellation = new CancellationTokenSource(); DelayAction(options.Timeout, timeoutCancellation.Token, () => { try { #if PCL throw new TimeoutException(); #else throw new WebException("Timeout", WebExceptionStatus.Timeout); #endif } catch(Exception ex) { task.TrySetException(ex); } req.Abort(); }); req.BeginGetRequestStream(reqStrAr => { try { using(var stream = req.EndGetRequestStream(reqStrAr)) WriteMultipartFormData(stream, boundary, prm); req.BeginGetResponse(resAr => { timeoutCancellation.Cancel(); reg.Dispose(); try { task.TrySetResult(new AsyncResponse((HttpWebResponse)req.EndGetResponse(resAr))); } catch(Exception ex) { task.TrySetException(ex); } }, null); } catch(Exception ex) { task.TrySetException(ex); } }, null); } catch(Exception ex) { task.TrySetException(ex); } return task.Task; #endif }
/// <summary> /// Sends a GET request as an asynchronous operation. /// </summary> /// <param name="url">The URL.</param> /// <param name="prm">The parameters.</param> /// <param name="authorizationHeader">The OAuth header.</param> /// <param name="options">The connection options for the request.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns> /// <para>The task object representing the asynchronous operation.</para> /// <para>The Result property on the task object returns the response.</para> /// </returns> internal static Task<AsyncResponse> HttpGetAsync(string url, IEnumerable<KeyValuePair<string, object>> prm, string authorizationHeader, ConnectionOptions options, CancellationToken cancellationToken) { if(options == null) options = new ConnectionOptions(); if(prm == null) prm = new Dictionary<string, object>(); var reqUrl = url + '?' + CreateQueryString(prm); #if WIN_RT var req = new HttpRequestMessage(HttpMethod.Get, new Uri(reqUrl)); return ExecuteRequest(req, authorizationHeader, options, cancellationToken); #else var task = new TaskCompletionSource<AsyncResponse>(); if(cancellationToken.IsCancellationRequested) { task.TrySetCanceled(); return task.Task; } try { if(prm == null) prm = new Dictionary<string, object>(); var req = (HttpWebRequest)WebRequest.Create(reqUrl); var reg = cancellationToken.Register(() => { task.TrySetCanceled(); req.Abort(); }); #if !(PCL || WP) req.ReadWriteTimeout = options.ReadWriteTimeout; req.Proxy = options.Proxy; if(options.UseCompression) req.AutomaticDecompression = CompressionType; if (options.DisableKeepAlive) req.KeepAlive = false; #endif req.Headers[HttpRequestHeader.Authorization] = authorizationHeader; #if !PCL req.UserAgent = options.UserAgent; if(options.BeforeRequestAction != null) options.BeforeRequestAction(req); #endif var timeoutCancellation = new CancellationTokenSource(); DelayAction(options.Timeout, timeoutCancellation.Token, () => { try { #if PCL throw new TimeoutException(); #else throw new WebException("Timeout", WebExceptionStatus.Timeout); #endif } catch(Exception ex) { task.TrySetException(ex); } req.Abort(); }); req.BeginGetResponse(ar => { timeoutCancellation.Cancel(); reg.Dispose(); try { task.TrySetResult(new AsyncResponse((HttpWebResponse)req.EndGetResponse(ar))); } catch(Exception ex) { task.TrySetException(ex); } }, null); } catch(Exception ex) { task.TrySetException(ex); } return task.Task; #endif }