1515_OUTCOME_KEYS = frozenset ({"feed_id" , "feed_url" , "kind" , "state" , "rows" , "error_code" })
1616_ERROR_RE = re .compile (r"^[a-z][a-z0-9_]{0,63}$" )
1717_DIGEST_RE = re .compile (r"^[0-9a-f]{64}$" )
18+ _EMPTY_DIGEST = hashlib .sha256 (b"[]" ).hexdigest ()
1819_WIRE_KEYS = frozenset (
1920 {
2021 "status_version" ,
@@ -244,7 +245,7 @@ def _validate_wire(value: object) -> dict[str, object]:
244245 if not _DIGEST_RE .fullmatch (aggregate ):
245246 _fail ("status_digest_invalid" )
246247 feeds = data ["feeds" ]
247- if not isinstance (feeds , list ):
248+ if not isinstance (feeds , list ) or not feeds :
248249 _fail ("feed_invalid" )
249250 previous : tuple [str , str ] | None = None
250251 feed_ids : set [str ] = set ()
@@ -268,14 +269,20 @@ def _validate_wire(value: object) -> dict[str, object]:
268269 if state in {"accepted" , "quarantined" } and kind not in {"rss2" , "atom" }:
269270 _fail ("feed_kind_invalid" )
270271 accepted_count = _integer (item ["accepted_row_count" ], "feed_counter_invalid" )
271- _integer (item ["rejected_row_count" ], "feed_counter_invalid" )
272+ rejected_count = _integer (item ["rejected_row_count" ], "feed_counter_invalid" )
273+ if accepted_count > MAX_ROWS_PER_FEED :
274+ _fail ("feed_counter_invalid" )
275+ if rejected_count != 0 :
276+ _fail ("rejected_count_invalid" )
272277 if state == "accepted" and accepted_count == 0 :
273278 _fail ("feed_state_invalid" )
274279 if state != "accepted" and accepted_count != 0 :
275280 _fail ("feed_state_invalid" )
276281 digest = _string (item ["row_digest" ], "status_digest_invalid" )
277282 if not _DIGEST_RE .fullmatch (digest ):
278283 _fail ("status_digest_invalid" )
284+ if state != "accepted" and digest != _EMPTY_DIGEST :
285+ _fail ("empty_digest_invalid" )
279286 error = item ["error_code" ]
280287 if state == "accepted" and error is not None :
281288 _fail ("feed_state_invalid" )
@@ -287,10 +294,18 @@ def _validate_wire(value: object) -> dict[str, object]:
287294 failed = sum (item ["state" ] == "failed" for item in feeds )
288295 quarantined = sum (item ["state" ] == "quarantined" for item in feeds )
289296 accepted_rows = sum (item ["accepted_row_count" ] for item in feeds )
297+ rejected_rows = sum (item ["rejected_row_count" ] for item in feeds )
290298 if data ["successful_feed_count" ] != accepted or data ["failed_feed_count" ] != failed :
291299 _fail ("status_counter_invalid" )
292- if data ["quarantined_feed_count" ] != quarantined or data ["accepted_row_count" ] != accepted_rows :
300+ if (
301+ data ["quarantined_feed_count" ] != quarantined
302+ or data ["accepted_row_count" ] != accepted_rows
303+ or rejected_rows != 0
304+ or data ["rejected_row_count" ] != 0
305+ ):
293306 _fail ("status_counter_invalid" )
307+ if accepted_rows == 0 and data ["aggregate_row_digest" ] != _EMPTY_DIGEST :
308+ _fail ("empty_digest_invalid" )
294309 complete = failed == 0 and quarantined == 0
295310 if data ["publication_complete" ] != complete or data ["eligible_for_live_publication" ] != complete :
296311 _fail ("status_flag_invalid" )
0 commit comments