diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2021-07-20 15:41:36 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-20 15:41:36 +0200 |
commit | 9b9becf1ae256b645e37a7eecf3441f3ae4b8ea5 (patch) | |
tree | 6c38ba3bab912db6c1fd0cd1f2b6601d2bbb8ca6 | |
parent | 73ed009ddae73353c4df882a43db28508d6ef35e (diff) |
fix: panic for non-WS connections to inspector (#11466)
-rw-r--r-- | cli/tests/integration/inspector_tests.rs | 26 | ||||
-rw-r--r-- | runtime/inspector_server.rs | 8 |
2 files changed, 33 insertions, 1 deletions
diff --git a/cli/tests/integration/inspector_tests.rs b/cli/tests/integration/inspector_tests.rs index ebbfe94d2..edc18b8d7 100644 --- a/cli/tests/integration/inspector_tests.rs +++ b/cli/tests/integration/inspector_tests.rs @@ -493,3 +493,29 @@ async fn inspector_json_list() { assert!(matching_endpoint.is_some()); child.kill().unwrap(); } + +#[tokio::test] +async fn inspector_connect_non_ws() { + // https://github.com/denoland/deno/issues/11449 + // Verify we don't panic if non-WS connection is being established + let script = util::tests_path().join("inspector1.js"); + let mut child = util::deno_cmd() + .arg("run") + .arg(inspect_flag_with_unique_port("--inspect")) + .arg(script) + .stderr(std::process::Stdio::piped()) + .spawn() + .unwrap(); + + let stderr = child.stderr.as_mut().unwrap(); + let mut stderr_lines = + std::io::BufReader::new(stderr).lines().map(|r| r.unwrap()); + let mut ws_url = extract_ws_url_from_stderr(&mut stderr_lines); + // Change scheme to URL and try send a request. We're not interested + // in the request result, just that the process doesn't panic. + ws_url.set_scheme("http").unwrap(); + let resp = reqwest::get(ws_url).await.unwrap(); + assert_eq!("400 Bad Request", resp.status().to_string()); + child.kill().unwrap(); + child.wait().unwrap(); +} diff --git a/runtime/inspector_server.rs b/runtime/inspector_server.rs index 793cd2866..9f631ed2f 100644 --- a/runtime/inspector_server.rs +++ b/runtime/inspector_server.rs @@ -133,7 +133,13 @@ fn handle_ws_request( if resp.is_ok() { tokio::task::spawn_local(async move { - let upgraded = hyper::upgrade::on(req).await.unwrap(); + let upgrade_result = hyper::upgrade::on(req).await; + let upgraded = if let Ok(u) = upgrade_result { + u + } else { + eprintln!("Inspector server failed to upgrade to WS connection"); + return; + }; let websocket = deno_websocket::tokio_tungstenite::WebSocketStream::from_raw_socket( upgraded, |