@@ -71,12 +71,25 @@ def on_close(self):
71
71
self .event_logger .remove_listener (listener = self .event_listener )
72
72
73
73
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"""
76
79
required_keys = {"schema_id" , "version" , "data" }
77
80
for key in required_keys :
78
81
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 )
80
93
81
94
82
95
def get_timestamp (data : dict [str , Any ]) -> Optional [datetime ]:
@@ -111,18 +124,18 @@ async def post(self):
111
124
raise web .HTTPError (400 , "No JSON data provided" )
112
125
113
126
try :
114
- validate_model (payload )
127
+ validate_model (payload , self . event_logger . schemas )
115
128
self .event_logger .emit (
116
129
schema_id = cast (str , payload .get ("schema_id" )),
117
130
data = cast ("Dict[str, Any]" , payload .get ("data" )),
118
131
timestamp_override = get_timestamp (payload ),
119
132
)
120
133
self .set_status (204 )
121
134
self .finish ()
122
- except web .HTTPError :
123
- raise
124
135
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
126
139
127
140
128
141
default_handlers = [
0 commit comments