Skip to content
36 changes: 36 additions & 0 deletions relay-event-normalization/src/replay.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,17 @@ pub fn validate(replay: &mut Replay) -> Result<(), ReplayError> {
.value()
.ok_or_else(|| ReplayError::InvalidPayload("missing replay_id".to_string()))?;

let segment_id = replay
.segment_id
.value()
.ok_or_else(|| ReplayError::InvalidPayload("missing segment_id".to_string()))?;

if segment_id > &65535 {
return Err(ReplayError::InvalidPayload(
"segment_id exceeded u16 limit".to_string(),
));
}

Ok(())
}

Expand Down Expand Up @@ -321,6 +332,31 @@ mod tests {
assert!(replay_value.urls.value().unwrap().len() == 100);
}

#[test]
fn test_validate_u16_segment_id() {
// Does not fit within a u16.
let replay_id =
Annotated::new(EventId("52df9022835246eeb317dbd739ccd059".parse().unwrap()));
let segment_id: Annotated<u64> = Annotated::new(65536);
let mut replay = Annotated::new(Replay {
replay_id,
segment_id,
..Default::default()
});
assert!(validate(replay.value_mut().as_mut().unwrap()).is_err());

// Fits within a u16.
let replay_id =
Annotated::new(EventId("52df9022835246eeb317dbd739ccd059".parse().unwrap()));
let segment_id: Annotated<u64> = Annotated::new(65535);
let mut replay = Annotated::new(Replay {
replay_id,
segment_id,
..Default::default()
});
assert!(validate(replay.value_mut().as_mut().unwrap()).is_ok());
}

#[test]
fn test_truncated_list_less_than_limit() {
let mut replay = Annotated::new(Replay {
Expand Down