tangled
alpha
login
or
join now
alephcubed.com
/
jacquard
forked from
nonbinary.computer/jacquard
0
fork
atom
A better Rust ATProto crate
0
fork
atom
overview
issues
pulls
pipelines
interim more resilient error parsing for auth errors
Orual
2 months ago
bfb72e29
2c6880ce
+49
-11
1 changed file
expand all
collapse all
unified
split
crates
jacquard-common
src
xrpc.rs
+49
-11
crates/jacquard-common/src/xrpc.rs
···
48
48
};
49
49
use serde::{Deserialize, Serialize};
50
50
use smol_str::SmolStr;
51
51
+
51
52
#[cfg(feature = "websocket")]
52
53
pub use subscription::{
53
54
BasicSubscriptionClient, MessageEncoding, SubscriptionCall, SubscriptionClient,
···
485
486
Resp: XrpcResp,
486
487
{
487
488
let status = http_response.status();
489
489
+
488
490
// If the server returned 401 with a WWW-Authenticate header, expose it so higher layers
489
491
// (e.g., DPoP handling) can detect `error="invalid_token"` and trigger refresh.
490
492
#[allow(deprecated)]
491
493
if status.as_u16() == 401 {
492
494
if let Some(hv) = http_response.headers().get(http::header::WWW_AUTHENTICATE) {
493
493
-
return Err(crate::error::ClientError::auth(
494
494
-
crate::error::AuthError::Other(hv.clone()),
495
495
-
)
496
496
-
.for_nsid(Resp::NSID));
495
495
+
return Err(
496
496
+
crate::error::ClientError::auth(crate::error::AuthError::Other(hv.clone()))
497
497
+
.for_nsid(Resp::NSID),
498
498
+
);
497
499
}
498
500
}
499
501
let buffer = Bytes::from(http_response.into_body());
···
670
672
}
671
673
// 400: try typed XRPC error, fallback to generic error
672
674
} else if self.status.as_u16() == 400 {
673
673
-
match serde_json::from_slice::<_>(&self.buffer) {
674
674
-
Ok(error) => Err(XrpcError::Xrpc(error)),
675
675
+
match serde_json::from_slice::<R::Err<'_>>(&self.buffer) {
676
676
+
Ok(error) => {
677
677
+
use alloc::string::ToString;
678
678
+
if error.to_string().contains("InvalidToken") {
679
679
+
Err(XrpcError::Auth(AuthError::InvalidToken))
680
680
+
} else if error.to_string().contains("ExpiredToken") {
681
681
+
Err(XrpcError::Auth(AuthError::TokenExpired))
682
682
+
} else {
683
683
+
Err(XrpcError::Xrpc(error))
684
684
+
}
685
685
+
}
675
686
Err(_) => {
676
687
// Fallback to generic error (InvalidRequest, ExpiredToken, etc.)
677
688
match serde_json::from_slice::<GenericXrpcError>(&self.buffer) {
···
730
741
}
731
742
// 400: try typed XRPC error, fallback to generic error
732
743
} else if self.status.as_u16() == 400 {
733
733
-
match serde_json::from_slice::<_>(&self.buffer) {
734
734
-
Ok(error) => Err(XrpcError::Xrpc(error)),
744
744
+
match serde_json::from_slice::<R::Err<'_>>(&self.buffer) {
745
745
+
Ok(error) => {
746
746
+
use alloc::string::ToString;
747
747
+
if error.to_string().contains("InvalidToken") {
748
748
+
Err(XrpcError::Auth(AuthError::InvalidToken))
749
749
+
} else if error.to_string().contains("ExpiredToken") {
750
750
+
Err(XrpcError::Auth(AuthError::TokenExpired))
751
751
+
} else {
752
752
+
Err(XrpcError::Xrpc(error))
753
753
+
}
754
754
+
}
735
755
Err(_) => {
736
756
// Fallback to generic error (InvalidRequest, ExpiredToken, etc.)
737
757
match serde_json::from_slice::<GenericXrpcError>(&self.buffer) {
···
790
810
}
791
811
// 400: try typed XRPC error, fallback to generic error
792
812
} else if self.status.as_u16() == 400 {
793
793
-
match serde_json::from_slice::<_>(&self.buffer) {
794
794
-
Ok(error) => Err(XrpcError::Xrpc(error)),
813
813
+
match serde_json::from_slice::<R::Err<'_>>(&self.buffer) {
814
814
+
Ok(error) => {
815
815
+
use alloc::string::ToString;
816
816
+
if error.to_string().contains("InvalidToken") {
817
817
+
Err(XrpcError::Auth(AuthError::InvalidToken))
818
818
+
} else if error.to_string().contains("ExpiredToken") {
819
819
+
Err(XrpcError::Auth(AuthError::TokenExpired))
820
820
+
} else {
821
821
+
Err(XrpcError::Xrpc(error))
822
822
+
}
823
823
+
}
795
824
Err(_) => {
796
825
// Fallback to generic error (InvalidRequest, ExpiredToken, etc.)
797
826
match serde_json::from_slice::<GenericXrpcError>(&self.buffer) {
···
876
905
// 400: try typed XRPC error, fallback to generic error
877
906
} else if self.status.as_u16() == 400 {
878
907
let error = match parse_error::<R>(&self.buffer) {
879
879
-
Ok(error) => XrpcError::Xrpc(error),
908
908
+
Ok(error) => {
909
909
+
use alloc::string::ToString;
910
910
+
if error.to_string().contains("InvalidToken") {
911
911
+
XrpcError::Auth(AuthError::InvalidToken)
912
912
+
} else if error.to_string().contains("ExpiredToken") {
913
913
+
XrpcError::Auth(AuthError::TokenExpired)
914
914
+
} else {
915
915
+
XrpcError::Xrpc(error)
916
916
+
}
917
917
+
}
880
918
Err(_) => {
881
919
// Fallback to generic error (InvalidRequest, ExpiredToken, etc.)
882
920
match serde_json::from_slice::<GenericXrpcError>(&self.buffer) {