| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "quic/tools/quic_url.h" | |
| #include "absl/strings/str_cat.h" | |
| #include "absl/strings/string_view.h" | |
| namespace quic { | |
| static constexpr size_t kMaxHostNameLength = 256; | |
| QuicUrl::QuicUrl(absl::string_view url) : url_(static_cast<std::string>(url)) {} | |
| QuicUrl::QuicUrl(absl::string_view url, absl::string_view default_scheme) | |
| : QuicUrl(url) { | |
| if (url_.has_scheme()) { | |
| return; | |
| } | |
| url_ = GURL(absl::StrCat(default_scheme, "://", url)); | |
| } | |
| std::string QuicUrl::ToString() const { | |
| if (IsValid()) { | |
| return url_.spec(); | |
| } | |
| return ""; | |
| } | |
| bool QuicUrl::IsValid() const { | |
| if (!url_.is_valid() || !url_.has_scheme()) { | |
| return false; | |
| } | |
| if (url_.has_host() && url_.host().length() > kMaxHostNameLength) { | |
| return false; | |
| } | |
| return true; | |
| } | |
| std::string QuicUrl::HostPort() const { | |
| if (!IsValid() || !url_.has_host()) { | |
| return ""; | |
| } | |
| std::string host = url_.host(); | |
| int port = url_.IntPort(); | |
| if (port == url::PORT_UNSPECIFIED) { | |
| return host; | |
| } | |
| return absl::StrCat(host, ":", port); | |
| } | |
| std::string QuicUrl::PathParamsQuery() const { | |
| if (!IsValid() || !url_.has_path()) { | |
| return "/"; | |
| } | |
| return url_.PathForRequest(); | |
| } | |
| std::string QuicUrl::scheme() const { | |
| if (!IsValid()) { | |
| return ""; | |
| } | |
| return url_.scheme(); | |
| } | |
| std::string QuicUrl::host() const { | |
| if (!IsValid()) { | |
| return ""; | |
| } | |
| return url_.HostNoBrackets(); | |
| } | |
| std::string QuicUrl::path() const { | |
| if (!IsValid()) { | |
| return ""; | |
| } | |
| return url_.path(); | |
| } | |
| uint16_t QuicUrl::port() const { | |
| if (!IsValid()) { | |
| return 0; | |
| } | |
| int port = url_.EffectiveIntPort(); | |
| if (port == url::PORT_UNSPECIFIED) { | |
| return 0; | |
| } | |
| return port; | |
| } | |
| } // namespace quic |