diff --git a/src/FlareSolverrSharp/Solvers/FlareSolverr.cs b/src/FlareSolverrSharp/Solvers/FlareSolverr.cs index 9109af6..3159aee 100644 --- a/src/FlareSolverrSharp/Solvers/FlareSolverr.cs +++ b/src/FlareSolverrSharp/Solvers/FlareSolverr.cs @@ -14,6 +14,7 @@ public class FlareSolverr { private static readonly SemaphoreLocker Locker = new SemaphoreLocker(); private HttpClient _httpClient; + private readonly Uri _flareSolverrIndexUri; private readonly Uri _flareSolverrUri; public int MaxTimeout = 60000; @@ -26,6 +27,8 @@ public FlareSolverr(string flareSolverrApiUrl) var apiUrl = flareSolverrApiUrl; if (!apiUrl.EndsWith("/")) apiUrl += "/"; + + _flareSolverrIndexUri = new Uri(apiUrl); _flareSolverrUri = new Uri(apiUrl + "v1"); } @@ -68,9 +71,51 @@ public async Task DestroySession(string sessionId) return await SendFlareSolverrRequest(GetSolverRequestContent(req)); } + public Task GetIndex() + { + return SendFlareSolverrRequestInternal(null); + } + private async Task SendFlareSolverrRequest(HttpContent flareSolverrRequest) { - FlareSolverrResponse result = null; + FlareSolverrResponse result = await SendFlareSolverrRequestInternal(flareSolverrRequest); + + try + { + Enum.TryParse(result.Status, true, out FlareSolverrStatusCode returnStatusCode); + + if (returnStatusCode.Equals(FlareSolverrStatusCode.ok)) + { + return result; + } + + if (returnStatusCode.Equals(FlareSolverrStatusCode.warning)) + { + throw new FlareSolverrException( + "FlareSolverr was able to process the request, but a captcha was detected. Message: " + + result.Message); + } + + if (returnStatusCode.Equals(FlareSolverrStatusCode.error)) + { + throw new FlareSolverrException( + "FlareSolverr was unable to process the request, please check FlareSolverr logs. Message: " + + result.Message); + } + + throw new FlareSolverrException("Unable to map FlareSolverr returned status code, received code: " + + result.Status + ". Message: " + result.Message); + } + catch (ArgumentException) + { + throw new FlareSolverrException("Error parsing status code, check FlareSolverr log. Status: " + + result.Status + ". Message: " + result.Message); + } + } + + private async Task SendFlareSolverrRequestInternal(HttpContent flareSolverrRequest) + { + T result = default; await Locker.LockAsync(async () => { @@ -78,9 +123,16 @@ await Locker.LockAsync(async () => try { _httpClient = new HttpClient(); - // wait 5 more seconds to make sure we return the FlareSolverr timeout message - _httpClient.Timeout = TimeSpan.FromMilliseconds(MaxTimeout + 5000); - response = await _httpClient.PostAsync(_flareSolverrUri, flareSolverrRequest); + if (flareSolverrRequest == null) + { + response = await _httpClient.GetAsync(_flareSolverrIndexUri); + } + else + { + // wait 5 more seconds to make sure we return the FlareSolverr timeout message + _httpClient.Timeout = TimeSpan.FromMilliseconds(MaxTimeout + 5000); + response = await _httpClient.PostAsync(_flareSolverrUri, flareSolverrRequest); + } } catch (HttpRequestException e) { @@ -104,44 +156,12 @@ await Locker.LockAsync(async () => var resContent = await response.Content.ReadAsStringAsync(); try { - result = JsonConvert.DeserializeObject(resContent); + result = JsonConvert.DeserializeObject(resContent); } catch (Exception) { throw new FlareSolverrException("Error parsing response, check FlareSolverr. Response: " + resContent); } - - try - { - Enum.TryParse(result.Status, true, out FlareSolverrStatusCode returnStatusCode); - - if (returnStatusCode.Equals(FlareSolverrStatusCode.ok)) - { - return result; - } - - if (returnStatusCode.Equals(FlareSolverrStatusCode.warning)) - { - throw new FlareSolverrException( - "FlareSolverr was able to process the request, but a captcha was detected. Message: " - + result.Message); - } - - if (returnStatusCode.Equals(FlareSolverrStatusCode.error)) - { - throw new FlareSolverrException( - "FlareSolverr was unable to process the request, please check FlareSolverr logs. Message: " - + result.Message); - } - - throw new FlareSolverrException("Unable to map FlareSolverr returned status code, received code: " - + result.Status + ". Message: " + result.Message); - } - catch (ArgumentException) - { - throw new FlareSolverrException("Error parsing status code, check FlareSolverr log. Status: " - + result.Status + ". Message: " + result.Message); - } }); return result; @@ -233,6 +253,5 @@ private HttpContent GenerateFlareSolverrRequest(HttpRequestMessage request, stri return GetSolverRequestContent(req); } - } } diff --git a/src/FlareSolverrSharp/Types/FlareSolverrIndexResponse.cs b/src/FlareSolverrSharp/Types/FlareSolverrIndexResponse.cs new file mode 100644 index 0000000..433ddf0 --- /dev/null +++ b/src/FlareSolverrSharp/Types/FlareSolverrIndexResponse.cs @@ -0,0 +1,12 @@ +using Newtonsoft.Json; + +namespace FlareSolverrSharp.Types +{ + public class FlareSolverrIndexResponse + { + [JsonProperty("msg")] + public string Message; + public string Version; + public string UserAgent; + } +}