@@ -382,13 +382,7 @@ fn parse_path_query_fragment(input: &str) -> (String, Option<String>, Option<Str
382382
383383 if let Some ( q_pos) = before_fragment. find ( '?' ) {
384384 path. push_str ( & before_fragment[ ..q_pos] ) ;
385- let q_part = & before_fragment[ q_pos + 1 ..] ;
386- if let Some ( f_pos) = q_part. find ( '#' ) {
387- query = Some ( q_part[ ..f_pos] . to_string ( ) ) ;
388- fragment = Some ( q_part[ f_pos + 1 ..] . to_string ( ) ) ;
389- } else {
390- query = Some ( q_part. to_string ( ) ) ;
391- }
385+ query = Some ( before_fragment[ q_pos + 1 ..] . to_string ( ) ) ;
392386 } else {
393387 path. push_str ( before_fragment) ;
394388 }
@@ -489,4 +483,97 @@ mod tests {
489483 assert_eq ! ( url. fragment( ) , Some ( "FRAGMENT" ) ) ;
490484 assert_eq ! ( url. as_str( ) , "http://localhost:1234/PATH#FRAGMENT" ) ;
491485 }
486+
487+ #[ test]
488+ fn test_empty_host_rejected ( ) {
489+ assert ! ( matches!( Url :: parse( "http:///path" ) , Err ( ParseError :: EmptyHost ) ) ) ;
490+ }
491+
492+ #[ test]
493+ fn test_path_segments_mut_push_adds_separator ( ) {
494+ let mut url = Url :: parse ( "http://example.com/base" ) . unwrap ( ) ;
495+ {
496+ let mut segs = url. path_segments_mut ( ) . unwrap ( ) ;
497+ segs. push ( "child" ) ;
498+ }
499+ assert_eq ! ( url. path( ) , "/base/child" ) ;
500+ assert_eq ! ( url. as_str( ) , "http://example.com/base/child" ) ;
501+ }
502+
503+ #[ test]
504+ fn test_host_str ( ) {
505+ let url = Url :: parse ( "http://example.com/" ) . unwrap ( ) ;
506+ assert_eq ! ( url. host_str( ) , Some ( "example.com" . to_string( ) ) ) ;
507+ }
508+
509+ #[ test]
510+ fn test_host_str_ipv4 ( ) {
511+ let mut url = Url :: parse ( "http://127.0.0.1/" ) . unwrap ( ) ;
512+ url. host = Some ( Host :: Ipv4 ( [ 192 , 168 , 1 , 1 ] ) ) ;
513+ url. rebuild_raw ( ) ;
514+ assert_eq ! ( url. host_str( ) , Some ( "192.168.1.1" . to_string( ) ) ) ;
515+ assert ! ( url. as_str( ) . contains( "192.168.1.1" ) ) ;
516+ }
517+
518+ #[ test]
519+ fn test_set_port ( ) {
520+ let mut url = Url :: parse ( "http://example.com/path" ) . unwrap ( ) ;
521+ url. set_port ( Some ( 9090 ) ) ;
522+ assert_eq ! ( url. port( ) , Some ( 9090 ) ) ;
523+ assert_eq ! ( url. as_str( ) , "http://example.com:9090/path" ) ;
524+ url. set_port ( None ) ;
525+ assert_eq ! ( url. port( ) , None ) ;
526+ assert_eq ! ( url. as_str( ) , "http://example.com/path" ) ;
527+ }
528+
529+ #[ test]
530+ fn test_path_segments_root ( ) {
531+ let url = Url :: parse ( "http://example.com/" ) . unwrap ( ) ;
532+ let segs: Vec < _ > = url. path_segments ( ) . unwrap ( ) . collect ( ) ;
533+ assert ! ( segs. is_empty( ) ) ;
534+
535+ let url = Url :: parse ( "http://example.com" ) . unwrap ( ) ;
536+ let segs: Vec < _ > = url. path_segments ( ) . unwrap ( ) . collect ( ) ;
537+ assert ! ( segs. is_empty( ) ) ;
538+ }
539+
540+ #[ test]
541+ fn test_set_query ( ) {
542+ let mut url = Url :: parse ( "http://example.com/path" ) . unwrap ( ) ;
543+ url. set_query ( Some ( "key=value" ) ) ;
544+ assert_eq ! ( url. query( ) , Some ( "key=value" ) ) ;
545+ assert_eq ! ( url. as_str( ) , "http://example.com/path?key=value" ) ;
546+ url. set_query ( None ) ;
547+ assert_eq ! ( url. query( ) , None ) ;
548+ assert_eq ! ( url. as_str( ) , "http://example.com/path" ) ;
549+ }
550+
551+ #[ test]
552+ fn test_join_dot_segments ( ) {
553+ let base = Url :: parse ( "http://example.com/a/b/c" ) . unwrap ( ) ;
554+
555+ let joined = base. join ( "./d" ) . unwrap ( ) ;
556+ assert_eq ! ( joined. path( ) , "/a/b/d" ) ;
557+
558+ let joined = base. join ( "../d" ) . unwrap ( ) ;
559+ assert_eq ! ( joined. path( ) , "/a/d" ) ;
560+ }
561+
562+ #[ test]
563+ fn test_parse_query_and_fragment ( ) {
564+ let url = Url :: parse ( "http://example.com/path?q=1#frag" ) . unwrap ( ) ;
565+ assert_eq ! ( url. path( ) , "/path" ) ;
566+ assert_eq ! ( url. query( ) , Some ( "q=1" ) ) ;
567+ assert_eq ! ( url. fragment( ) , Some ( "frag" ) ) ;
568+ }
569+
570+ #[ test]
571+ fn test_has_host ( ) {
572+ let url = Url :: parse ( "http://example.com/" ) . unwrap ( ) ;
573+ assert ! ( url. has_host( ) ) ;
574+
575+ let mut url = Url :: parse ( "http://example.com/" ) . unwrap ( ) ;
576+ url. host = None ;
577+ assert ! ( !url. has_host( ) ) ;
578+ }
492579}
0 commit comments