Skip to content

Commit e2c3ac3

Browse files
authored
Mark unrelated parsing error as warning (#1491)
* mark known parsing error as warning * add copilot suggestion * adjust unknown enum handling for json
1 parent d12e1b8 commit e2c3ac3

4 files changed

Lines changed: 36 additions & 22 deletions

File tree

connect/src/spirc.rs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::{
44
authentication::Credentials,
55
dealer::{
66
manager::{BoxedStream, BoxedStreamResult, Reply, RequestReply},
7-
protocol::{Command, Message, Request},
7+
protocol::{Command, FallbackWrapper, Message, Request},
88
},
99
session::UserAttributes,
1010
Error, Session, SpotifyId,
@@ -81,7 +81,7 @@ struct SpircTask {
8181
connect_state_volume_update: BoxedStreamResult<SetVolumeCommand>,
8282
connect_state_logout_request: BoxedStreamResult<LogoutCommand>,
8383
playlist_update: BoxedStreamResult<PlaylistModificationInfo>,
84-
session_update: BoxedStreamResult<SessionUpdate>,
84+
session_update: BoxedStreamResult<FallbackWrapper<SessionUpdate>>,
8585
connect_state_command: BoxedStream<RequestReply>,
8686
user_attributes_update: BoxedStreamResult<UserAttributesUpdate>,
8787
user_attributes_mutation: BoxedStreamResult<UserAttributesMutation>,
@@ -191,7 +191,7 @@ impl Spirc {
191191

192192
let session_update = session
193193
.dealer()
194-
.listen_for("social-connect/v2/session_update", Message::from_json)?;
194+
.listen_for("social-connect/v2/session_update", Message::try_from_json)?;
195195

196196
let user_attributes_update = session
197197
.dealer()
@@ -1552,7 +1552,24 @@ impl SpircTask {
15521552
Ok(())
15531553
}
15541554

1555-
fn handle_session_update(&mut self, mut session_update: SessionUpdate) {
1555+
fn handle_session_update(&mut self, session_update: FallbackWrapper<SessionUpdate>) {
1556+
// we know that this enum value isn't present in our current proto definitions, by that
1557+
// the json parsing fails because the enum isn't known as proto representation
1558+
const WBC: &str = "WIFI_BROADCAST_CHANGED";
1559+
1560+
let mut session_update = match session_update {
1561+
FallbackWrapper::Inner(update) => update,
1562+
FallbackWrapper::Fallback(value) => {
1563+
let fallback_inner = value.to_string();
1564+
if fallback_inner.contains(WBC) {
1565+
log::debug!("Received SessionUpdate::{WBC}");
1566+
} else {
1567+
log::warn!("SessionUpdate couldn't be parse correctly: {value:?}");
1568+
}
1569+
return;
1570+
}
1571+
};
1572+
15561573
let reason = session_update.reason.enum_value();
15571574

15581575
let mut session = match session_update.session.take() {

core/src/dealer/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ impl DealerShared {
357357
}
358358
}
359359

360-
warn!("No subscriber for msg.uri: {}", msg.uri);
360+
debug!("No subscriber for msg.uri: {}", msg.uri);
361361
}
362362

363363
fn dispatch_request(

core/src/dealer/protocol.rs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ pub use request::*;
55
use std::collections::HashMap;
66
use std::io::{Error as IoError, Read};
77

8-
use crate::Error;
9-
use base64::prelude::BASE64_STANDARD;
10-
use base64::{DecodeError, Engine};
8+
use crate::{deserialize_with::json_proto, Error};
9+
use base64::{prelude::BASE64_STANDARD, DecodeError, Engine};
1110
use flate2::read::GzDecoder;
1211
use log::LevelFilter;
1312
use serde::Deserialize;
@@ -99,17 +98,19 @@ pub struct Message {
9998
pub uri: String,
10099
}
101100

101+
#[derive(Deserialize)]
102+
#[serde(untagged)]
103+
pub enum FallbackWrapper<T: protobuf::MessageFull> {
104+
Inner(#[serde(deserialize_with = "json_proto")] T),
105+
Fallback(JsonValue),
106+
}
107+
102108
impl Message {
103-
pub fn from_json<M: protobuf::MessageFull>(value: Self) -> Result<M, Error> {
104-
use protobuf_json_mapping::*;
109+
pub fn try_from_json<M: protobuf::MessageFull>(
110+
value: Self,
111+
) -> Result<FallbackWrapper<M>, Error> {
105112
match value.payload {
106-
PayloadValue::Json(json) => match parse_from_str::<M>(&json) {
107-
Ok(message) => Ok(message),
108-
Err(_) => match parse_from_str_with_options(&json, &IGNORE_UNKNOWN) {
109-
Ok(message) => Ok(message),
110-
Err(why) => Err(Error::failed_precondition(why)),
111-
},
112-
},
113+
PayloadValue::Json(json) => Ok(serde_json::from_str(&json)?),
113114
other => Err(ProtocolError::UnexpectedData(other).into()),
114115
}
115116
}

core/src/deserialize_with.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,7 @@ where
3535
D: Deserializer<'de>,
3636
{
3737
let v: Value = Deserialize::deserialize(de)?;
38-
parse_value_to_msg(&v).map_err(|why| {
39-
warn!("deserialize_json_proto: {v}");
40-
error!("deserialize_json_proto: {why}");
41-
Error::custom(why)
42-
})
38+
parse_value_to_msg(&v).map_err(Error::custom)
4339
}
4440

4541
pub fn option_json_proto<'de, T, D>(de: D) -> Result<Option<T>, D::Error>

0 commit comments

Comments
 (0)