public async Task <string> FetchAttachmentWithToken(string url, string attachmentsPath, string filenamePrefix, TokenHolder token) { var httpClient = new System.Net.Http.HttpClient(); try { var fileMetadataStr = await GetHttpContentWithToken(url, token); Metadata obj = null; if (fileMetadataStr != null) { obj = JsonConvert.DeserializeObject <Metadata>(fileMetadataStr); } int backOffMultiplier = 1; begin: var request = new System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Get, url + "/$value"); //Add the token in Authorization header request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token.getToken()); var response = httpClient.SendAsync(request); if (response.Result.IsSuccessStatusCode) { var content = response.Result.Content.ReadAsByteArrayAsync().Result; string filenameSuffix = GetFilenameSuffix(response.Result.Content.Headers.ContentType.MediaType, obj); System.IO.File.WriteAllBytes(Path.Combine(attachmentsPath, $"{filenamePrefix}{filenameSuffix}"), content); return($"{filenamePrefix}{filenameSuffix}"); } else { if (response.Result.StatusCode.Equals(System.Net.HttpStatusCode.NotFound)) { return(null); } if (fileMetadataStr.Contains("ErrorInsufficientPermissionsInAccessToken")) { LogText.Text = "ClientId lacks permission to fetch: " + url; return(null); } if (response.Result.StatusCode.Equals(System.Net.HttpStatusCode.Unauthorized)) { token.refreshToken(); goto begin; } LogText.Text = $"Error statuscode: {response.Result.StatusCode} content: {response.Result.Content}" + Environment.NewLine + $"sleeping for {30*backOffMultiplier}sec.."; Thread.Sleep(backOffMultiplier * 30 * 1000); backOffMultiplier *= 2; goto begin; } return(null); // no picture found } catch (Exception ex) { LogText.Text = ex.ToString(); return(null); // probably no profile picture was found } }
/// <summary> /// Perform an HTTP GET request to a URL using an HTTP Authorization header /// </summary> /// <param name="url">The URL</param> /// <param name="token">The token</param> /// <returns>String containing the results of the GET operation</returns> public async Task <string> GetHttpContentWithToken(string url, TokenHolder token) { var httpClient = new System.Net.Http.HttpClient(); System.Net.Http.HttpResponseMessage response; try { int backOffMultiplier = 1; begin: var request = new System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Get, url); //Add the token in Authorization header request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token.getToken()); response = await httpClient.SendAsync(request); var content = await response.Content.ReadAsStringAsync(); if (response.IsSuccessStatusCode) { return(content); } else { if (response.StatusCode.Equals(System.Net.HttpStatusCode.NotFound)) { // resource probably belongs to another tenant return(content); } if (response.StatusCode.Equals(System.Net.HttpStatusCode.Forbidden)) { // client id lacks permissions LogText.Text = "ClientId lacks permission to fetch: " + url; return(content); } if (response.StatusCode.Equals(System.Net.HttpStatusCode.Unauthorized)) { LogText.Text = "Token expired?? Not authorized to fetch: " + url; token.refreshToken(); goto begin; } else { LogText.Text = $"Error statuscode: {response.StatusCode} content: {response.Content}" + Environment.NewLine + $"sleeping for {30*backOffMultiplier}sec.."; Thread.Sleep(backOffMultiplier * 30 * 1000); LogText.Text = "Continuing..."; backOffMultiplier *= 2; goto begin; } } } catch (Exception ex) { LogText.Text = ex.ToString(); return(ex.ToString()); } }