From ab3b532e30a3d9822dcb0f8ff72e774a1eba1dbf Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Sat, 14 Jul 2018 22:10:44 +0200 Subject: [PATCH] merge httpclient+restparserclient; add RequestAsString method --- PocketSharp.sln | 22 +++++- PocketSharp/PocketClient.cs | 133 +++++++++++++++++++++++------------- 2 files changed, 104 insertions(+), 51 deletions(-) diff --git a/PocketSharp.sln b/PocketSharp.sln index e40fba4..7436003 100644 --- a/PocketSharp.sln +++ b/PocketSharp.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.27428.2027 +VisualStudioVersion = 15.0.27130.2027 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PocketSharp.Examples", "PocketSharp.Examples", "{AFD4E3F1-B23C-4924-BA5B-D917FBADB8FA}" EndProject @@ -15,7 +15,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PocketSharp.UWP", "PocketSh EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PocketSharp", "PocketSharp\PocketSharp.csproj", "{0E22926C-7244-4A17-923C-84B46F5149C0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PocketSharp.Tests", "PocketSharp.Tests\PocketSharp.Tests.csproj", "{3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PocketSharp.Tests", "PocketSharp.Tests\PocketSharp.Tests.csproj", "{3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PocketSharp.Explore", "PocketSharp.Explore\PocketSharp.Explore.csproj", "{9A72F701-72B5-4400-AE9B-2814FE5FCBB1}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -83,6 +85,22 @@ Global {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Release|x64.Build.0 = Release|Any CPU {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Release|x86.ActiveCfg = Release|Any CPU {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Release|x86.Build.0 = Release|Any CPU + {9A72F701-72B5-4400-AE9B-2814FE5FCBB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A72F701-72B5-4400-AE9B-2814FE5FCBB1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A72F701-72B5-4400-AE9B-2814FE5FCBB1}.Debug|ARM.ActiveCfg = Debug|Any CPU + {9A72F701-72B5-4400-AE9B-2814FE5FCBB1}.Debug|ARM.Build.0 = Debug|Any CPU + {9A72F701-72B5-4400-AE9B-2814FE5FCBB1}.Debug|x64.ActiveCfg = Debug|Any CPU + {9A72F701-72B5-4400-AE9B-2814FE5FCBB1}.Debug|x64.Build.0 = Debug|Any CPU + {9A72F701-72B5-4400-AE9B-2814FE5FCBB1}.Debug|x86.ActiveCfg = Debug|Any CPU + {9A72F701-72B5-4400-AE9B-2814FE5FCBB1}.Debug|x86.Build.0 = Debug|Any CPU + {9A72F701-72B5-4400-AE9B-2814FE5FCBB1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A72F701-72B5-4400-AE9B-2814FE5FCBB1}.Release|Any CPU.Build.0 = Release|Any CPU + {9A72F701-72B5-4400-AE9B-2814FE5FCBB1}.Release|ARM.ActiveCfg = Release|Any CPU + {9A72F701-72B5-4400-AE9B-2814FE5FCBB1}.Release|ARM.Build.0 = Release|Any CPU + {9A72F701-72B5-4400-AE9B-2814FE5FCBB1}.Release|x64.ActiveCfg = Release|Any CPU + {9A72F701-72B5-4400-AE9B-2814FE5FCBB1}.Release|x64.Build.0 = Release|Any CPU + {9A72F701-72B5-4400-AE9B-2814FE5FCBB1}.Release|x86.ActiveCfg = Release|Any CPU + {9A72F701-72B5-4400-AE9B-2814FE5FCBB1}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/PocketSharp/PocketClient.cs b/PocketSharp/PocketClient.cs index 6e987fc..3f4896a 100644 --- a/PocketSharp/PocketClient.cs +++ b/PocketSharp/PocketClient.cs @@ -20,12 +20,7 @@ namespace PocketSharp /// /// REST client used for the API communication /// - protected readonly HttpClient _restClient; - - /// - /// REST client used for the API communication with the Text Parser API - /// - protected readonly HttpClient _restParserClient; + protected readonly HttpClient httpClient; /// /// Caches HTTP headers from last response @@ -40,7 +35,12 @@ namespace PocketSharp /// /// The base URL for the Pocket API /// - protected static Uri baseUri = new Uri("https://getpocket.com/v3/"); + protected static string baseUri = "https://getpocket.com/v3/"; + + /// + /// The base URL for Pocket reader requests + /// + protected static string parserUri = null; /// /// The authentification URL @@ -141,6 +141,7 @@ namespace PocketSharp this.isMobileClient = isMobileClient; this.useInsideWebAuthenticationBroker = useInsideWebAuthenticationBroker; this.cacheHTTPResponseData = cacheHTTPResponseData; + PocketClient.parserUri = parserUri.OriginalString; // assign access code if submitted if (accessCode != null) @@ -154,36 +155,19 @@ namespace PocketSharp CallbackUri = Uri.EscapeUriString(callbackUri.ToString()); } - // assign text parser if parserUri submitted - if (parserUri != null) - { - _restParserClient = new HttpClient(handler ?? new HttpClientHandler()); - _restParserClient.BaseAddress = parserUri; - _restParserClient.DefaultRequestHeaders.Add("Accept", "*/*"); - _restParserClient.DefaultRequestHeaders.Add("X-Accept", "application/json"); - - if (timeout.HasValue) - { - _restParserClient.Timeout = TimeSpan.FromSeconds(timeout.Value); - } - } - // initialize REST client - _restClient = new HttpClient(handler ?? new HttpClientHandler()); + httpClient = new HttpClient(handler ?? new HttpClientHandler()); if (timeout.HasValue) { - _restClient.Timeout = TimeSpan.FromSeconds(timeout.Value); + httpClient.Timeout = TimeSpan.FromSeconds(timeout.Value); } - // set base uri - _restClient.BaseAddress = baseUri; - // Pocket needs this specific Accept header :-S - _restClient.DefaultRequestHeaders.Add("Accept", "*/*"); + httpClient.DefaultRequestHeaders.Add("Accept", "*/*"); // defines the response format (according to the Pocket docs) - _restClient.DefaultRequestHeaders.Add("X-Accept", "application/json"); + httpClient.DefaultRequestHeaders.Add("X-Accept", "application/json"); } @@ -209,17 +193,15 @@ namespace PocketSharp throw new PocketException("SDK error: No access token available. Use authentication first."); } - // rewrite base if it is a request to the Parser API - if (isReaderRequest) + string httpBase = isReaderRequest ? parserUri : baseUri; + + if (isReaderRequest && String.IsNullOrEmpty(parserUri)) { - if (_restParserClient == null) - { - throw new PocketException("Please pass the parserUri in the PocketClient ctor."); - } + throw new PocketException("Please pass a valid parserUri in the PocketClient ctor."); } // every single Pocket API endpoint requires HTTP POST data - HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, method); + HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, httpBase + method); HttpResponseMessage response = null; string responseString = null; @@ -246,14 +228,7 @@ namespace PocketSharp // make async request try { - if (isReaderRequest) - { - response = await _restParserClient.SendAsync(request, cancellationToken); - } - else - { - response = await _restClient.SendAsync(request, cancellationToken); - } + response = await httpClient.SendAsync(request, cancellationToken); // validate HTTP response ValidateResponse(response); @@ -298,6 +273,71 @@ namespace PocketSharp } + /// + /// Fetches a string from a resource + /// + /// URI + /// The cancellation token. + /// + /// + protected async Task RequestAsString(string uri, CancellationToken cancellationToken) + { + // every single Pocket API endpoint requires HTTP POST data + HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, uri); + HttpResponseMessage response = null; + string responseString = null; + + // call pre request action + PreRequest?.Invoke(uri); + + // make async request + try + { + response = await httpClient.GetAsync(uri, cancellationToken); + + // validate HTTP response + ValidateResponse(response); + + // cache headers + if (cacheHTTPResponseData) + { + lastHeaders = response.Headers; + } + + // read response + responseString = await response.Content.ReadAsStringAsync(); + } + catch (HttpRequestException exc) + { + throw new PocketException(exc.Message, exc); + } + catch (PocketException exc) + { + throw exc; + } + finally + { + request.Dispose(); + + if (response != null) + { + response.Dispose(); + } + } + + // call after request action + AfterRequest?.Invoke(responseString); + + // cache response + if (cacheHTTPResponseData) + { + lastResponseData = responseString; + } + + return responseString; + } + + /// /// Converts JSON to Pocket objects /// @@ -451,13 +491,8 @@ namespace PocketSharp /// public void Dispose() { - _restClient.Dispose(); + httpClient.Dispose(); lastHeaders = null; - - if (_restParserClient != null) - { - _restParserClient.Dispose(); - } } } }