@@ -1544,59 +1544,59 @@ void URL::Parse(const char* input, |
1544 | 1544 | } // NOLINT(readability/fn_size) |
1545 | 1545 |
|
1546 | 1546 | // https://url.spec.whatwg.org/#url-serializing |
1547 | | -std::string URL::SerializeURL(const struct url_data* url, |
| 1547 | +std::string URL::SerializeURL(const url_data& url, |
1548 | 1548 | bool exclude = false) { |
1549 | 1549 | std::string output; |
1550 | 1550 | output.reserve( |
1551 | | - 10 + |
1552 | | - url->scheme.size() + |
1553 | | - url->username.size() + |
1554 | | - url->password.size() + |
1555 | | - url->host.size() + |
1556 | | - url->query.size() + |
1557 | | - url->fragment.size() + |
1558 | | - url->href.size() + |
| 1551 | + 10 + // We generally insert < 10 separator characters between URL parts |
| 1552 | + url.scheme.size() + |
| 1553 | + url.username.size() + |
| 1554 | + url.password.size() + |
| 1555 | + url.host.size() + |
| 1556 | + url.query.size() + |
| 1557 | + url.fragment.size() + |
| 1558 | + url.href.size() + |
1559 | 1559 | std::accumulate( |
1560 | | - url->path.begin(), |
1561 | | - url->path.end(), |
| 1560 | + url.path.begin(), |
| 1561 | + url.path.end(), |
1562 | 1562 | 0, |
1563 | 1563 | [](size_t sum, const auto& str) { return sum + str.size(); })); |
1564 | 1564 |
|
1565 | | - output += url->scheme; |
1566 | | - if (url->flags & URL_FLAGS_HAS_HOST) { |
| 1565 | + output += url.scheme; |
| 1566 | + if (url.flags & URL_FLAGS_HAS_HOST) { |
1567 | 1567 | output += "//"; |
1568 | | - if (url->flags & URL_FLAGS_HAS_USERNAME || |
1569 | | - url->flags & URL_FLAGS_HAS_PASSWORD) { |
1570 | | - if (url->flags & URL_FLAGS_HAS_USERNAME) { |
1571 | | - output += url->username; |
| 1568 | + if (url.flags & URL_FLAGS_HAS_USERNAME || |
| 1569 | + url.flags & URL_FLAGS_HAS_PASSWORD) { |
| 1570 | + if (url.flags & URL_FLAGS_HAS_USERNAME) { |
| 1571 | + output += url.username; |
1572 | 1572 | } |
1573 | | - if (url->flags & URL_FLAGS_HAS_PASSWORD) { |
1574 | | - output += ":" + url->password; |
| 1573 | + if (url.flags & URL_FLAGS_HAS_PASSWORD) { |
| 1574 | + output += ":" + url.password; |
1575 | 1575 | } |
1576 | 1576 | output += "@"; |
1577 | 1577 | } |
1578 | | - output += url->host; |
1579 | | - if (url->port != -1) { |
1580 | | - output += ":" + std::to_string(url->port); |
| 1578 | + output += url.host; |
| 1579 | + if (url.port != -1) { |
| 1580 | + output += ":" + std::to_string(url.port); |
1581 | 1581 | } |
1582 | 1582 | } |
1583 | | - if (url->flags & URL_FLAGS_CANNOT_BE_BASE) { |
1584 | | - output += url->path[0]; |
| 1583 | + if (url.flags & URL_FLAGS_CANNOT_BE_BASE) { |
| 1584 | + output += url.path[0]; |
1585 | 1585 | } else { |
1586 | | - if (!(url->flags & URL_FLAGS_HAS_HOST) && |
1587 | | - url->path.size() > 1 && |
1588 | | - url->path[0].empty()) { |
| 1586 | + if (!(url.flags & URL_FLAGS_HAS_HOST) && |
| 1587 | + url.path.size() > 1 && |
| 1588 | + url.path[0].empty()) { |
1589 | 1589 | output += "/."; |
1590 | 1590 | } |
1591 | | - for (size_t i = 1; i < url->path.size(); i++) { |
1592 | | - output += "/" + url->path[i]; |
| 1591 | + for (size_t i = 1; i < url.path.size(); i++) { |
| 1592 | + output += "/" + url.path[i]; |
1593 | 1593 | } |
1594 | 1594 | } |
1595 | | - if (url->flags & URL_FLAGS_HAS_QUERY) { |
1596 | | - output += "?" + url->query; |
| 1595 | + if (url.flags & URL_FLAGS_HAS_QUERY) { |
| 1596 | + output += "?" + url.query; |
1597 | 1597 | } |
1598 | | - if (!exclude && url->flags & URL_FLAGS_HAS_FRAGMENT) { |
1599 | | - output += "#" + url->fragment; |
| 1598 | + if (!exclude && (url.flags & URL_FLAGS_HAS_FRAGMENT)) { |
| 1599 | + output += "#" + url.fragment; |
1600 | 1600 | } |
1601 | 1601 | output.shrink_to_fit(); |
1602 | 1602 | return output; |
|