diff options
Diffstat (limited to 'bpkg')
-rw-r--r-- | bpkg/manifest | 10 | ||||
-rw-r--r-- | bpkg/manifest.cxx | 24 |
2 files changed, 26 insertions, 8 deletions
diff --git a/bpkg/manifest b/bpkg/manifest index d4c34d6..d443c49 100644 --- a/bpkg/manifest +++ b/bpkg/manifest @@ -458,6 +458,15 @@ namespace bpkg return port_; } + bool + secure () const + { + if (local ()) + throw std::logic_error ("local location"); + + return secure_; + } + // Note that this is not necessarily syntactically the same string // as what was used to initialize this location. But it should be // semantically equivalent. String representation of an empty @@ -471,6 +480,7 @@ namespace bpkg std::string host_; std::uint16_t port_; butl::dir_path path_; + bool secure_; }; inline std::ostream& diff --git a/bpkg/manifest.cxx b/bpkg/manifest.cxx index 48e7a99..ac746e6 100644 --- a/bpkg/manifest.cxx +++ b/bpkg/manifest.cxx @@ -1221,12 +1221,16 @@ namespace bpkg if (!b.empty () && b.relative ()) throw invalid_argument ("base relative filesystem path"); - if (::strncasecmp (l.c_str (), "http://", 7) == 0) + secure_ = false; + + if (::strncasecmp (l.c_str (), "http://", 7) == 0 || + (secure_ = ::strncasecmp (l.c_str (), "https://", 8) == 0)) { // Split location into host, port and path components. Calculate // canonical name <host> part removing www. and pkg. prefixes. // - auto p (l.find ('/', 7)); + size_t host_offset (secure_ ? 8 : 7); + auto p (l.find ('/', host_offset)); // The remote repository location with no path specified is not a valid // one. Keep the path_ member empty so the later check for emptiness @@ -1241,7 +1245,7 @@ namespace bpkg // Put the lower-cased version of the host part into host_. // Chances are good it will stay unmodified. // - transform (l.cbegin () + 7, + transform (l.cbegin () + host_offset, p == string::npos ? l.cend () : l.cbegin () + p, back_inserter (host_), lowercase); @@ -1332,16 +1336,19 @@ namespace bpkg // speaking we can end up with comething bogus like "com" // if the host is "pkg.com". // + bool bpkg (false); if (host_.compare (0, 4, "www.") == 0 || - host_.compare (0, 4, "pkg.") == 0) - canonical_name_.assign (host_, 4, string::npos); + host_.compare (0, 4, "pkg.") == 0 || + (bpkg = host_.compare (0, 5, "bpkg.") == 0)) + canonical_name_.assign (host_, bpkg ? 5 : 4, string::npos); else canonical_name_ = host_; // For canonical name and for the HTTP protocol, treat a.com - // and a.com:80 as the same name. + // and a.com:80 as the same name. The same rule apply the HTTPS protocol + // and the port 443. // - if (port_ != 0 && port_ != 80) + if (port_ != 0 && port_ != (secure_ ? 443 : 80)) canonical_name_ += ':' + to_string (port_); } else @@ -1357,6 +1364,7 @@ namespace bpkg host_ = b.host_; port_ = b.port_; path_ = b.path_ / path_; + secure_ = b.secure_; // Set canonical name to the base location canonical name host // part. The path part of the canonical name is calculated below. @@ -1450,7 +1458,7 @@ namespace bpkg if (local ()) return path_.string (); - string p ("http://" + host_); + string p ((secure_ ? "https://" : "http://") + host_); if (port_ != 0) p += ":" + to_string (port_); |