gardesk/garwarp / 01cdf42

Browse files

reject duplicate request fields

Authored by mfwolffe <wolffemf@dukes.jmu.edu>
SHA
01cdf422e7c2e4a095f19b1a5c0427c62f243072
Parents
265e97f
Tree
308b51a

2 changed files

StatusFile+-
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
     let mut fields = std::collections::HashMap::new();
463
     let mut fields = std::collections::HashMap::new();
464
     for part in parts {
464
     for part in parts {
465
         let (key, value) = part.split_once('=')?;
465
         let (key, value) = part.split_once('=')?;
466
+        if fields.contains_key(key) {
467
+            return None;
468
+        }
466
         fields.insert(key.to_string(), value.to_string());
469
         fields.insert(key.to_string(), value.to_string());
467
     }
470
     }
468
     Some(fields)
471
     Some(fields)
@@ -558,4 +561,10 @@ mod tests {
558
         let parsed = ControlResponse::parse_line("status protocol=one health=healthy in_flight=0");
561
         let parsed = ControlResponse::parse_line("status protocol=one health=healthy in_flight=0");
559
         assert!(parsed.is_err());
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
     #[test]
527
     #[test]
499
     fn begin_request_tracks_parent_window_context() {
528
     fn begin_request_tracks_parent_window_context() {
500
         let (mut client, server) = UnixStream::pair().expect("pair should be created");
529
         let (mut client, server) = UnixStream::pair().expect("pair should be created");