- let mut response = self.client.post::<JsonResponse>(&uri, &host, &self.basic_auth, content)
- .await?.0;
+ let mut client = if let Some(client) = self.client.lock().unwrap().take() { client }
+ else { HttpClient::connect(&self.endpoint)? };
+ let http_response = client.post::<JsonResponse>(&uri, &host, &self.basic_auth, content).await;
+ *self.client.lock().unwrap() = Some(client);
+
+ let mut response = match http_response {
+ Ok(JsonResponse(response)) => response,
+ Err(e) if e.kind() == std::io::ErrorKind::Other => {
+ match e.get_ref().unwrap().downcast_ref::<HttpError>() {
+ Some(http_error) => match JsonResponse::try_from(http_error.contents.clone()) {
+ Ok(JsonResponse(response)) => response,
+ Err(_) => Err(e)?,
+ },
+ None => Err(e)?,
+ }
+ },
+ Err(e) => Err(e)?,
+ };
+