@@ -71,12 +71,25 @@ def on_close(self):
7171 self .event_logger .remove_listener (listener = self .event_listener )
7272
7373
74- def validate_model (data : dict [str , Any ]) -> None :
75- """Validates for required fields in the JSON request body"""
74+ def validate_model (
75+ data : dict [str , Any ], registry : jupyter_events .schema_registry .SchemaRegistry
76+ ) -> None :
77+ """Validates for required fields in the JSON request body and verifies that
78+ a registered schema/version exists"""
7679 required_keys = {"schema_id" , "version" , "data" }
7780 for key in required_keys :
7881 if key not in data :
79- raise web .HTTPError (400 , f"Missing `{ key } ` in the JSON request body." )
82+ message = f"Missing `{ key } ` in the JSON request body."
83+ raise Exception (message )
84+ schema_id = cast (str , data .get ("schema_id" ))
85+ # The case where a given schema_id isn't found,
86+ # jupyter_events raises a useful error, so there's no need to
87+ # handle that case here.
88+ schema = registry .get (schema_id )
89+ version = int (cast (int , data .get ("version" )))
90+ if schema .version != version :
91+ message = f"Unregistered version: { version } ≠{ schema .version } for `{ schema_id } `"
92+ raise Exception (message )
8093
8194
8295def get_timestamp (data : dict [str , Any ]) -> Optional [datetime ]:
@@ -111,18 +124,18 @@ async def post(self):
111124 raise web .HTTPError (400 , "No JSON data provided" )
112125
113126 try :
114- validate_model (payload )
127+ validate_model (payload , self . event_logger . schemas )
115128 self .event_logger .emit (
116129 schema_id = cast (str , payload .get ("schema_id" )),
117130 data = cast ("Dict[str, Any]" , payload .get ("data" )),
118131 timestamp_override = get_timestamp (payload ),
119132 )
120133 self .set_status (204 )
121134 self .finish ()
122- except web .HTTPError :
123- raise
124135 except Exception as e :
125- raise web .HTTPError (500 , str (e )) from e
136+ # All known exceptions are raised by bad requests, e.g., bad
137+ # version, unregistered schema, invalid emission data payload, etc.
138+ raise web .HTTPError (400 , str (e )) from e
126139
127140
128141default_handlers = [
0 commit comments