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();
- }
}
}
}