/// <summary>Submits a POST request. Returns null on success, otherwise returns error information.</summary> /// <param name="baseUrl">Root URL for the API.</param> /// <param name="tableName">The table name to add to the end of the baseUrl.</param> /// <param name="data">The data payload to post.</param> /// <param name="cred">Authentication credentials if needed.</param> /// <param name="canceller">A object that can be sued to canel the request. </param> /// <returns>Null on success otherwise an error message.</returns> public static async Task <string> PostTable([NotNull] string baseUrl, [NotNull] string tableName, [NotNull] string data, [CanBeNull] Creds cred = null, [CanBeNull] CancellationToken?canceller = null) { if (!IsInternetAvailable()) { //Responses starting with "Error:" should be filtered as failures. return("Error: No Internet, post request aborted."); } // Must add the AllowUI=false setting otherwise it tries enumerating UI and doesn't report errors properly. var client = new HttpClient(new HttpBaseProtocolFilter { AllowUI = false }); var tokenHeader = "X-ZUMO-AUTH"; var headers = client.DefaultRequestHeaders; if (cred != null) { headers.Add(tokenHeader, cred.Token); } var url = UrlCombiner.CombineAsSeparateElements(baseUrl, tableName); if (canceller == null) { var cs = new CancellationTokenSource(TimeSpan.FromSeconds(DefaultTimeout)); canceller = cs.Token; } try { var buffUtf8 = CryptographicBuffer.ConvertStringToBinary(data, BinaryStringEncoding.Utf8); IHttpContent content = new HttpBufferContent(buffUtf8, 0, buffUtf8.Length); var body = await content.ReadAsStringAsync(); content.Headers.ContentType = new HttpMediaTypeHeaderValue("application/json"); var response = await client.PostAsync(url, content).AsTask((CancellationToken)canceller); var it = response.Content; return(response.IsSuccessStatusCode ? null : $"Error: Request returned {response.StatusCode} ({response.ReasonPhrase}), Content:{it}"); } catch (TaskCanceledException) { Debug.WriteLine($"Req '{tableName}' cancelled ot timedout."); return("Error: Cancelled or timed out."); } catch (Exception ex) { Debug.WriteLine($"Req '{tableName}' error: {ex}"); return($"Error: NetFail: {ex.Message}, {ex.InnerException}, END"); } }
/// <summary>Fetches a table, catches errors either returns the resonse or a message starting with /// "Error". A valid message will be Json starting enad ending with either [] or {}.</summary> /// <param name="baseUrl">Base url of the request API.</param> /// <param name="tableName">The name of the table to put on the end of the baseUrl.</param> /// <param name="cred">A credentials object used to authenticate the request, optional.</param> /// <param name="canceller">A token that can be used to cancell the request.</param> /// <returns>The response or an error message starting with "Error:"</returns> public static async Task <string> GetTable([NotNull] string baseUrl, [NotNull] string tableName, [CanBeNull] Creds cred = null, [CanBeNull] CancellationToken?canceller = null) { if (!IsInternetAvailable()) { //Responses starting with "Error:" should be filtered as failures. return("Error: No Internet, get request aborted."); } // Must add the AllowUI=false setting otherwise it tries enumerating UI and doesn't report errors properly. var client = new HttpClient(new HttpBaseProtocolFilter { AllowUI = false }); var tokenHeader = "X-ZUMO-AUTH"; var headers = client.DefaultRequestHeaders; if (cred != null) { headers.Add(tokenHeader, cred.Token); } var url = UrlCombiner.CombineAsSeparateElements(baseUrl, tableName); if (canceller == null) { var cs = new CancellationTokenSource(TimeSpan.FromSeconds(DefaultTimeout)); canceller = cs.Token; } try { var response = await client.GetStringAsync(url).AsTask((CancellationToken)canceller); return(response); } catch (TaskCanceledException) { Debug.WriteLine($"Req '{tableName}' cancelled ot timedout."); return("Error: Cancelled or timed out."); } catch (Exception ex) { Debug.WriteLine($"Req '{tableName}' error: {ex}"); return($"Error: NetFail: {ex.Message}, {ex.InnerException}, END"); } }
private async Task <bool> TryConnect() { if (SettingsService.Instance.IsLoggedIn == false) { return(false); } _webSocket = new MessageWebSocket(); _webSocket.Control.MessageType = SocketMessageType.Utf8; _webSocket.Closed += SocketClosed; _webSocket.MessageReceived += MessageRecieved; var tokenHeader = "X-ZUMO-AUTH"; var creds = Creds.FromUserIdAndToken(SettingsService.Instance.CredUserId, SettingsService.Instance.CredToken); _webSocket.SetRequestHeader(tokenHeader, creds.Token); try { var uri = new Uri("wss://greenhouseapi.azurewebsites.net/api/Websocket"); await _webSocket.ConnectAsync(uri); _messageWriter = new DataWriter(_webSocket.OutputStream); _reconnectionAttempt = 0; LoggingService.LogInfo("Websocket connected", Windows.Foundation.Diagnostics.LoggingLevel.Information); return(true); } catch (Exception ex) { var error = WebSocketError.GetStatus(ex.HResult); if (error == Windows.Web.WebErrorStatus.CannotConnect) { LoggingService.LogInfo($"Websocket cannot connect", Windows.Foundation.Diagnostics.LoggingLevel.Information); } else { LoggingService.LogInfo($"Websocket connection failed due to {error}, full exception: {ex.ToString()}", Windows.Foundation.Diagnostics.LoggingLevel.Warning); } _reconnectionAttempt++; CleanUp(); return(false); } }
private async Task <bool> TryConnect() { if (Settings.Instance.IsLoggedIn == false) { return(false); } _webSocket = new MessageWebSocket(); _webSocket.Control.MessageType = SocketMessageType.Utf8; _webSocket.Closed += SocketClosed; _webSocket.MessageReceived += MessageRecieved; var tokenHeader = "X-ZUMO-AUTH"; var creds = Creds.FromUserIdAndToken(Settings.Instance.CredUserId, Settings.Instance.CredToken); _webSocket.SetRequestHeader(tokenHeader, creds.Token); try { var uri = new Uri("wss://greenhouseapi.azurewebsites.net/api/Websocket"); await _webSocket.ConnectAsync(uri); _messageWriter = new DataWriter(_webSocket.OutputStream); _reconnectionAttempt = 0; Debug.WriteLine("Websocket connected"); return(true); } catch { Debug.WriteLine("Websocket connection failed"); _reconnectionAttempt++; CleanUp(); return(false); } }