Skip to content

Commit b51f49e

Browse files
authored
Python workers: Better error handling when the handler is not defined (#3495)
1 parent 6d7815a commit b51f49e

File tree

6 files changed

+68
-2
lines changed

6 files changed

+68
-2
lines changed

src/pyodide/python-entrypoint-helper.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,14 @@ function makeHandler(pyHandlerName: string): Handler {
131131
'prep_python',
132132
async () => await preparePython()
133133
);
134-
134+
const handler = mainModule[pyHandlerName];
135+
if (!handler) {
136+
throw new Error(
137+
`Python entrypoint "${MAIN_MODULE_NAME}" does not export a handler named "${pyHandlerName}"`
138+
);
139+
}
135140
const result = await enterJaegerSpan('python_code', () => {
136-
return mainModule[pyHandlerName].callRelaxed(...args);
141+
return handler.callRelaxed(...args);
137142
});
138143

139144
// Support returning a pyodide.ffi.FetchResponse.

src/workerd/server/tests/python/BUILD.bazel

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,12 @@ gen_import_tests(
5757
],
5858
},
5959
)
60+
61+
py_wd_test(
62+
"undefined-handler",
63+
# TODO: Requires a new bundle deploy
64+
skip_python_flags = [
65+
"0.26.0a2",
66+
"0.27.1",
67+
],
68+
)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
def test():
2+
pass
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { rejects } from 'node:assert';
2+
3+
export default {
4+
async test(ctrl, env) {
5+
await rejects(env.pythonWorker.fetch(new Request('http://example.com')), {
6+
name: 'Error',
7+
message:
8+
'Python entrypoint "undefined_handler.py" does not export a handler named "on_fetch"',
9+
});
10+
},
11+
};
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using Workerd = import "/workerd/workerd.capnp";
2+
3+
const undefinedHandler :Workerd.Worker = (
4+
modules = [
5+
(name = "undefined_handler.py", pythonModule = embed "undefined_handler.py")
6+
],
7+
compatibilityDate = "2024-10-01",
8+
compatibilityFlags = [%PYTHON_FEATURE_FLAGS],
9+
);
10+
11+
const server :Workerd.Worker = (
12+
modules = [
13+
(name = "server.js", esModule = embed "server.mjs")
14+
],
15+
bindings = [
16+
( name = "pythonWorker", service = "undefinedHandler" ),
17+
],
18+
compatibilityDate = "2024-10-01",
19+
compatibilityFlags = ["nodejs_compat"],
20+
);
21+
22+
23+
const unitTests :Workerd.Config = (
24+
services = [
25+
( name = "external",
26+
network = (
27+
tlsOptions = (trustBrowserCas = true)
28+
)
29+
),
30+
( name = "server",
31+
worker = .server
32+
),
33+
( name = "undefinedHandler",
34+
worker = .undefinedHandler
35+
),
36+
],
37+
);
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
def test():
2+
pass

0 commit comments

Comments
 (0)