summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2025-09-14 11:28:19 +0800
committerlittleblack111 <littleblack11111@gmail.com>2025-09-14 11:28:19 +0800
commite80250d00d62761d80b6caf9750dd5b7e80af8ef (patch)
tree5173580e05bd261769d22e9152163cf7c54f0269
parent9285dd6839ee15fd1426b1014ebef39cec07ab68 (diff)
perf(httpconnector): unified handle_response
-rw-r--r--src/client/connector/connectors/httpconnector.rs78
1 files changed, 37 insertions, 41 deletions
diff --git a/src/client/connector/connectors/httpconnector.rs b/src/client/connector/connectors/httpconnector.rs
index a671b94..5c1cc73 100644
--- a/src/client/connector/connectors/httpconnector.rs
+++ b/src/client/connector/connectors/httpconnector.rs
@@ -1,13 +1,16 @@
-use reqwest::{Error, StatusCode, Url, blocking::Client};
+use reqwest::{
+ Error, StatusCode, Url,
+ blocking::{Client, Response},
+};
-use crate::connector::{self, *};
+use crate::connector::*;
use std::{thread::sleep, time::Duration};
pub(crate) struct HTTPConnector {
pull_url: Url,
ntfy_url: Url,
client: Client,
- prev: <HTTPConnector as connector::Connection>::Ok,
+ prev: <HTTPConnector as Connection>::Ok,
}
impl HTTPConnector {
@@ -19,6 +22,30 @@ impl HTTPConnector {
client: Client::new(),
})
}
+
+ fn handle_response<F: Fn() -> std::result::Result<Response, Error>>(
+ &self,
+ resp: F,
+ ) -> Result<<HTTPConnector as Connection>::Ok, <HTTPConnector as Connection>::Err> {
+ match resp() {
+ Ok(resp) => match resp.status() {
+ StatusCode::TOO_MANY_REQUESTS => {
+ sleep(Duration::from_secs(5));
+ return self.update();
+ }
+ status => {
+ if !status.is_success() {
+ return Result::Err(Err::StatusCode(status));
+ }
+ match resp.text() {
+ Ok(text) => Result::Ok(text),
+ Err(e) => return Result::Err(Err::Reqwest(e)),
+ }
+ }
+ },
+ Err(e) => return Result::Err(Err::Reqwest(e)),
+ }
+ }
}
pub(crate) enum Err {
@@ -40,47 +67,16 @@ impl Connection for HTTPConnector {
// consider StatusCode::NOT_MODIFIED
fn update(&self) -> Result<Self::Ok, Self::Err> {
- Result::Ok(match self.client.get(self.pull_url.as_str()).send() {
- Ok(resp) => match resp.status() {
- StatusCode::TOO_MANY_REQUESTS => {
- sleep(Duration::from_secs(5));
- return self.update();
- }
- status => {
- if !status.is_success() {
- return Result::Err(Err::StatusCode(status));
- }
- match resp.text() {
- Ok(text) => text,
- Err(e) => return Result::Err(Err::Reqwest(e)),
- }
- }
- },
- Err(e) => return Result::Err(Err::Reqwest(e)),
- })
+ self.handle_response(|| self.client.get(self.pull_url.as_str()).send())
}
fn ntfy(&self, data: String) -> Result<Self::Ok, Self::Err> {
- Result::Ok(
- match self.client.post(self.ntfy_url.as_str()).body(data).send() {
- Ok(resp) => match resp.status() {
- StatusCode::TOO_MANY_REQUESTS => {
- sleep(Duration::from_secs(5));
- return self.update();
- }
- status => {
- if !status.is_success() {
- return Result::Err(Err::StatusCode(status));
- }
- match resp.text() {
- Ok(text) => text,
- Err(e) => return Result::Err(Err::Reqwest(e)),
- }
- }
- },
- Err(e) => return Result::Err(Err::Reqwest(e)),
- },
- )
+ self.handle_response(|| {
+ self.client
+ .post(self.ntfy_url.as_str())
+ .body(data.to_owned())
+ .send()
+ })
}
fn is_prev(&mut self, str: &Self::Ok) -> bool {