@@ -301,7 +301,7 @@ impl Url {
301
301
/// ```rust
302
302
/// use url::Url;
303
303
/// # use url::ParseError;
304
- ///
304
+ ///
305
305
/// # fn run() -> Result<(), ParseError> {
306
306
/// let base = Url::parse("https://example.net/a/b.html")?;
307
307
/// let url = base.join("c.png")?;
@@ -729,6 +729,28 @@ impl Url {
729
729
!matches ! ( self . host, HostInternal :: None )
730
730
}
731
731
732
+ /// Equivalent to `url.port().is_some()`.
733
+ ///
734
+ /// # Examples
735
+ ///
736
+ /// ```
737
+ /// use url::Url;
738
+ /// # use url::ParseError;
739
+ ///
740
+ /// # fn run() -> Result<(), ParseError> {
741
+ /// let url = Url::parse("http://example.com:8080")?;
742
+ /// assert!(url.has_port());
743
+ ///
744
+ /// let url = Url::parse("file:///tmp/something")?;
745
+ /// assert!(!url.has_port());
746
+ /// # Ok(())
747
+ /// # }
748
+ /// # run().unwrap();
749
+ /// ```
750
+ pub fn has_port ( & self ) -> bool {
751
+ self . port . is_some ( )
752
+ }
753
+
732
754
/// Return the string representation of the host (domain or IP address) for this URL, if any.
733
755
///
734
756
/// Non-ASCII domains are punycode-encoded per IDNA.
@@ -1310,7 +1332,7 @@ impl Url {
1310
1332
/// ```
1311
1333
/// use url::Url;
1312
1334
/// # use url::ParseError;
1313
- ///
1335
+ ///
1314
1336
/// # fn run() -> Result<(), ParseError> {
1315
1337
/// let mut url = Url::parse("foo://example.net")?;
1316
1338
/// let result = url.set_host(None);
@@ -1326,7 +1348,7 @@ impl Url {
1326
1348
/// ```
1327
1349
/// use url::Url;
1328
1350
/// # use url::ParseError;
1329
- ///
1351
+ ///
1330
1352
/// # fn run() -> Result<(), ParseError> {
1331
1353
/// let mut url = Url::parse("https://example.net")?;
1332
1354
/// let result = url.set_host(None);
@@ -1342,7 +1364,7 @@ impl Url {
1342
1364
/// ```
1343
1365
/// use url::Url;
1344
1366
/// # use url::ParseError;
1345
- ///
1367
+ ///
1346
1368
/// # fn run() -> Result<(), ParseError> {
1347
1369
/// let mut url = Url::parse("mailto:[email protected] ")?;
1348
1370
///
@@ -1552,7 +1574,7 @@ impl Url {
1552
1574
/// ```
1553
1575
/// use url::Url;
1554
1576
/// # use url::ParseError;
1555
- ///
1577
+ ///
1556
1578
/// # fn run() -> Result<(), ParseError> {
1557
1579
/// let mut url = Url::parse("https://example.net")?;
1558
1580
/// let result = url.set_scheme("foo");
@@ -1569,7 +1591,7 @@ impl Url {
1569
1591
/// ```
1570
1592
/// use url::Url;
1571
1593
/// # use url::ParseError;
1572
- ///
1594
+ ///
1573
1595
/// # fn run() -> Result<(), ParseError> {
1574
1596
/// let mut url = Url::parse("https://example.net")?;
1575
1597
/// let result = url.set_scheme("foõ");
@@ -1585,7 +1607,7 @@ impl Url {
1585
1607
/// ```
1586
1608
/// use url::Url;
1587
1609
/// # use url::ParseError;
1588
- ///
1610
+ ///
1589
1611
/// # fn run() -> Result<(), ParseError> {
1590
1612
/// let mut url = Url::parse("mailto:[email protected] ")?;
1591
1613
/// let result = url.set_scheme("https");
@@ -1598,8 +1620,8 @@ impl Url {
1598
1620
pub fn set_scheme ( & mut self , scheme : & str ) -> Result < ( ) , ( ) > {
1599
1621
let mut parser = Parser :: for_setter ( String :: new ( ) ) ;
1600
1622
let remaining = parser. parse_scheme ( parser:: Input :: new ( scheme) ) ?;
1601
- if !remaining. is_empty ( ) ||
1602
- ( ! self . has_host ( ) && SchemeType :: from ( & parser. serialization ) . is_special ( ) ) {
1623
+ if !( remaining. is_empty ( ) &&
1624
+ self . can_use_scheme ( & parser. serialization ) ) {
1603
1625
return Err ( ( ) )
1604
1626
}
1605
1627
let old_scheme_end = self . scheme_end ;
@@ -1622,6 +1644,14 @@ impl Url {
1622
1644
Ok ( ( ) )
1623
1645
}
1624
1646
1647
+ fn can_use_scheme ( & self , scheme : & str ) -> bool {
1648
+ match SchemeType :: from ( scheme) {
1649
+ SchemeType :: File => !( self . has_host ( ) || self . has_port ( ) ) ,
1650
+ SchemeType :: SpecialNotFile => self . has_host ( ) ,
1651
+ SchemeType :: NotSpecial => true
1652
+ }
1653
+ }
1654
+
1625
1655
/// Convert a file name as `std::path::Path` into an URL in the `file` scheme.
1626
1656
///
1627
1657
/// This returns `Err` if the given path is not absolute or,
@@ -1634,7 +1664,7 @@ impl Url {
1634
1664
/// ```
1635
1665
/// # if cfg!(unix) {
1636
1666
/// use url::Url;
1637
- ///
1667
+ ///
1638
1668
/// # fn run() -> Result<(), ()> {
1639
1669
/// let url = Url::from_file_path("/tmp/foo.txt")?;
1640
1670
/// assert_eq!(url.as_str(), "file:///tmp/foo.txt");
0 commit comments