(
server_url: &str,
access_token: &str,
process_identifier: i64,
method: &str,
params: Value,
)
| 5059 | } |
| 5060 | |
| 5061 | async fn query_remote_service_inspector( |
| 5062 | server_url: &str, |
| 5063 | access_token: &str, |
| 5064 | process_identifier: i64, |
| 5065 | method: &str, |
| 5066 | params: Value, |
| 5067 | ) -> Result<Value, String> { |
| 5068 | let endpoint = InspectorServiceEndpoint::parse(server_url)?; |
| 5069 | let body = json_value!({ |
| 5070 | "processIdentifier": process_identifier, |
| 5071 | "method": method, |
| 5072 | "params": params, |
| 5073 | }) |
| 5074 | .to_string(); |
| 5075 | let request = format!( |
| 5076 | "POST /api/inspector/request HTTP/1.1\r\nHost: {}\r\nContent-Type: application/json\r\n{}: {}\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{}", |
| 5077 | endpoint.host_header(), |
| 5078 | crate::auth::ACCESS_TOKEN_HEADER, |
| 5079 | access_token, |
| 5080 | body.len(), |
| 5081 | body |
| 5082 | ); |
| 5083 | let mut stream = timeout( |
| 5084 | INSPECTOR_AGENT_TIMEOUT, |
| 5085 | TcpStream::connect((endpoint.host.as_str(), endpoint.port)), |
| 5086 | ) |
| 5087 | .await |
| 5088 | .map_err(|_| format!("Timed out connecting to published SimDeck service at {server_url}."))? |
| 5089 | .map_err(|error| { |
| 5090 | format!("Unable to connect to published SimDeck service at {server_url}: {error}") |
| 5091 | })?; |
| 5092 | stream |
| 5093 | .write_all(request.as_bytes()) |
| 5094 | .await |
| 5095 | .map_err(|error| format!("Unable to write published inspector request: {error}"))?; |
| 5096 | |
| 5097 | let mut response = Vec::new(); |
| 5098 | timeout(INSPECTOR_AGENT_TIMEOUT, stream.read_to_end(&mut response)) |
| 5099 | .await |
| 5100 | .map_err(|_| format!("Timed out waiting for published inspector method {method}."))? |
| 5101 | .map_err(|error| format!("Unable to read published inspector response: {error}"))?; |
| 5102 | let response = String::from_utf8_lossy(&response); |
| 5103 | let (headers, body) = response |
| 5104 | .split_once("\r\n\r\n") |
| 5105 | .ok_or_else(|| "Published inspector returned malformed HTTP.".to_owned())?; |
| 5106 | let status_line = headers.lines().next().unwrap_or_default(); |
| 5107 | if !status_line.contains(" 2") { |
| 5108 | return Err(format!( |
| 5109 | "Published inspector method {method} failed with {status_line}: {body}" |
| 5110 | )); |
| 5111 | } |
| 5112 | let value: Value = serde_json::from_str(body.trim()).map_err(|error| { |
| 5113 | format!("Published inspector returned malformed JSON for method {method}: {error}") |
| 5114 | })?; |
| 5115 | value |
| 5116 | .get("result") |
| 5117 | .cloned() |
| 5118 | .ok_or_else(|| format!("Published inspector method {method} did not include a result.")) |
no test coverage detected