blob: 9a20dd11747f22339131aeb18b656871884965cc [file] [log] [blame]
Sergei Datsenkobcd8e462018-04-20 15:44:56 +10001// Copyright 2018 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "cros-disks/uri.h"
6
7#include <base/logging.h>
8
9namespace cros_disks {
Sergei Datsenkobcd8e462018-04-20 15:44:56 +100010namespace {
11
François Degros15a44a82019-11-19 14:01:08 +110012const base::StringPiece kUriDelimiter = "://";
Sergei Datsenkobcd8e462018-04-20 15:44:56 +100013
14} // namespace
15
François Degros15a44a82019-11-19 14:01:08 +110016Uri::Uri(const base::StringPiece scheme, const base::StringPiece path)
Sergei Datsenkobcd8e462018-04-20 15:44:56 +100017 : scheme_(scheme), path_(path) {}
18
19std::string Uri::value() const {
François Degros15a44a82019-11-19 14:01:08 +110020 std::string s;
Sergei Datsenkobcd8e462018-04-20 15:44:56 +100021
François Degros15a44a82019-11-19 14:01:08 +110022 if (valid()) {
23 s.reserve(scheme_.size() + kUriDelimiter.size() + path_.size());
24 s += scheme_;
25 s.append(kUriDelimiter.data(), kUriDelimiter.size());
26 s += path_;
Sergei Datsenkobcd8e462018-04-20 15:44:56 +100027 }
François Degros15a44a82019-11-19 14:01:08 +110028
29 return s;
Sergei Datsenkobcd8e462018-04-20 15:44:56 +100030}
31
François Degros15a44a82019-11-19 14:01:08 +110032Uri Uri::Parse(const base::StringPiece s) {
33 // Look for URI scheme delimiter.
34 const size_t pos = s.find(kUriDelimiter);
35 if (pos == base::StringPiece::npos || pos == 0)
36 return {};
37
38 // Extract scheme part.
39 const base::StringPiece scheme = s.substr(0, pos);
40
41 // Check scheme validity (see RFC 3986, section 3.1).
42 if (!isalpha(scheme[0]))
43 return {};
44
45 for (const char c : scheme.substr(1)) {
46 if (!isalnum(c) && c != '-' && c != '+' && c != '.')
47 return {};
48 }
49
50 // Scheme is deemed valid.
51 return {scheme, s.substr(pos + kUriDelimiter.size())};
Sergei Datsenkobcd8e462018-04-20 15:44:56 +100052}
53
54} // namespace cros_disks