]> git.proxmox.com Git - proxmox.git/commitdiff
login: improve response handling
authorWolfgang Bumiller <w.bumiller@proxmox.com>
Tue, 1 Aug 2023 13:16:07 +0000 (15:16 +0200)
committerWolfgang Bumiller <w.bumiller@proxmox.com>
Tue, 1 Aug 2023 13:21:09 +0000 (15:21 +0200)
we have use cases where we have bytes, and serde_json has a from_slice
method, doing the utf-8 check unnecessarily is pointless, while going
from &str to &[u8] is free...

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
proxmox-login/src/lib.rs

index 6fbccd9f3c10c58aeaf9fff6c8ac0fb2fb3af785..f5f95933e6c2e7c9a8bcf23478a45ded5a840a20 100644 (file)
@@ -128,10 +128,17 @@ impl Login {
     ///
     /// On success, this will either yield an [`Authentication`] or a [`SecondFactorChallenge`] if
     /// Two-Factor-Authentication is required.
-    pub fn response(&self, body: &str) -> Result<TicketResult, ResponseError> {
+    pub fn response<T: ?Sized + AsRef<[u8]>>(
+        &self,
+        body: &T,
+    ) -> Result<TicketResult, ResponseError> {
+        self.response_bytes(body.as_ref())
+    }
+
+    fn response_bytes(&self, body: &[u8]) -> Result<TicketResult, ResponseError> {
         use ticket::TicketResponse;
 
-        let response: api::ApiResponse<api::CreateTicketResponse> = serde_json::from_str(body)?;
+        let response: api::ApiResponse<api::CreateTicketResponse> = serde_json::from_slice(body)?;
         let response = response.data.ok_or("missing response data")?;
 
         if response.username != self.userid {
@@ -271,8 +278,15 @@ impl SecondFactorChallenge {
     }
 
     /// Deal with the API's response object to extract the ticket.
-    pub fn response(&self, body: &str) -> Result<Authentication, ResponseError> {
-        let response: api::ApiResponse<api::CreateTicketResponse> = serde_json::from_str(body)?;
+    pub fn response<T: ?Sized + AsRef<[u8]>>(
+        &self,
+        body: &T,
+    ) -> Result<Authentication, ResponseError> {
+        self.response_bytes(body.as_ref())
+    }
+
+    fn response_bytes(&self, body: &[u8]) -> Result<Authentication, ResponseError> {
+        let response: api::ApiResponse<api::CreateTicketResponse> = serde_json::from_slice(body)?;
         let response = response.data.ok_or("missing response data")?;
 
         if response.username != self.userid {