void url:: rebuild(const boost::string_ref &scheme, const boost::optional<boost::string_ref> &host, const boost::optional<uint16_t> &port, const boost::optional<boost::string_ref> &path, const boost::optional<boost::string_ref> &query, const boost::optional<boost::string_ref> &fragment, const boost::optional<boost::string_ref> &user_info) { std::string str; str.append(scheme.data(), scheme.size()); if (has_authority()) { str.append("://"); if (user_info) { str.append(user_info->data(), user_info->size()); str.append("@"); } str.append(host->data(), host->size()); if (port) { str.append(":"); str.append(std::to_string(*port)); } } else { str.append(":"); } if (path) { str.append(path->data(), path->size()); } if (query) { str.append("?"); str.append(query->data(), query->size()); } if (fragment) { str.append("#"); str.append(fragment->data(), fragment->size()); } url new_url { std::move(str) }; swap(new_url); }