blob: 9a20dd11747f22339131aeb18b656871884965cc [file] [log] [blame]
// Copyright 2018 The Chromium OS 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 "cros-disks/uri.h"
#include <base/logging.h>
namespace cros_disks {
namespace {
const base::StringPiece kUriDelimiter = "://";
} // namespace
Uri::Uri(const base::StringPiece scheme, const base::StringPiece path)
: scheme_(scheme), path_(path) {}
std::string Uri::value() const {
std::string s;
if (valid()) {
s.reserve(scheme_.size() + kUriDelimiter.size() + path_.size());
s += scheme_;
s.append(kUriDelimiter.data(), kUriDelimiter.size());
s += path_;
}
return s;
}
Uri Uri::Parse(const base::StringPiece s) {
// Look for URI scheme delimiter.
const size_t pos = s.find(kUriDelimiter);
if (pos == base::StringPiece::npos || pos == 0)
return {};
// Extract scheme part.
const base::StringPiece scheme = s.substr(0, pos);
// Check scheme validity (see RFC 3986, section 3.1).
if (!isalpha(scheme[0]))
return {};
for (const char c : scheme.substr(1)) {
if (!isalnum(c) && c != '-' && c != '+' && c != '.')
return {};
}
// Scheme is deemed valid.
return {scheme, s.substr(pos + kUriDelimiter.size())};
}
} // namespace cros_disks