reject duplicate request fields
Authored by
mfwolffe <wolffemf@dukes.jmu.edu>
- SHA
01cdf422e7c2e4a095f19b1a5c0427c62f243072- Parents
-
265e97f - Tree
308b51a
01cdf42
01cdf422e7c2e4a095f19b1a5c0427c62f243072265e97f
308b51a| Status | File | + | - |
|---|---|---|---|
| M |
garwarp-ipc/src/lib.rs
|
9 | 0 |
| M |
garwarp/src/daemon.rs
|
29 | 0 |
garwarp-ipc/src/lib.rsmodified@@ -463,6 +463,9 @@ where | ||
| 463 | 463 | let mut fields = std::collections::HashMap::new(); |
| 464 | 464 | for part in parts { |
| 465 | 465 | let (key, value) = part.split_once('=')?; |
| 466 | + if fields.contains_key(key) { | |
| 467 | + return None; | |
| 468 | + } | |
| 466 | 469 | fields.insert(key.to_string(), value.to_string()); |
| 467 | 470 | } |
| 468 | 471 | Some(fields) |
@@ -558,4 +561,10 @@ mod tests { | ||
| 558 | 561 | let parsed = ControlResponse::parse_line("status protocol=one health=healthy in_flight=0"); |
| 559 | 562 | assert!(parsed.is_err()); |
| 560 | 563 | } |
| 564 | + | |
| 565 | + #[test] | |
| 566 | + fn request_parse_rejects_duplicate_fields() { | |
| 567 | + let parsed = ControlRequest::parse_line("inspect id=req-1 id=req-2"); | |
| 568 | + assert_eq!(parsed, None); | |
| 569 | + } | |
| 561 | 570 | } |
garwarp/src/daemon.rsmodified@@ -495,6 +495,35 @@ mod tests { | ||
| 495 | 495 | ); |
| 496 | 496 | } |
| 497 | 497 | |
| 498 | + #[test] | |
| 499 | + fn duplicate_request_fields_map_to_invalid_request() { | |
| 500 | + let (mut client, server) = UnixStream::pair().expect("pair should be created"); | |
| 501 | + client | |
| 502 | + .write_all(b"inspect id=req-1 id=req-2\n") | |
| 503 | + .expect("inspect request should be written"); | |
| 504 | + | |
| 505 | + let mut state = DaemonState { | |
| 506 | + health: HealthStatus::Healthy, | |
| 507 | + requests: RequestRegistry::new(Duration::from_secs(5)), | |
| 508 | + running: true, | |
| 509 | + }; | |
| 510 | + handle_connection(server, &mut state).expect("request should be handled"); | |
| 511 | + | |
| 512 | + let mut response_line = String::new(); | |
| 513 | + let mut reader = BufReader::new(client); | |
| 514 | + reader | |
| 515 | + .read_line(&mut response_line) | |
| 516 | + .expect("response should be readable"); | |
| 517 | + let response = ControlResponse::parse_line(&response_line).expect("response should parse"); | |
| 518 | + assert_eq!( | |
| 519 | + response, | |
| 520 | + ControlResponse::Error { | |
| 521 | + code: 2, | |
| 522 | + reason: "invalid_request".to_string(), | |
| 523 | + } | |
| 524 | + ); | |
| 525 | + } | |
| 526 | + | |
| 498 | 527 | #[test] |
| 499 | 528 | fn begin_request_tracks_parent_window_context() { |
| 500 | 529 | let (mut client, server) = UnixStream::pair().expect("pair should be created"); |