Sergei Datsenko | bcd8e46 | 2018-04-20 15:44:56 +1000 | [diff] [blame] | 1 | // 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 | |
| 9 | namespace cros_disks { |
Sergei Datsenko | bcd8e46 | 2018-04-20 15:44:56 +1000 | [diff] [blame] | 10 | namespace { |
| 11 | |
François Degros | 15a44a8 | 2019-11-19 14:01:08 +1100 | [diff] [blame] | 12 | const base::StringPiece kUriDelimiter = "://"; |
Sergei Datsenko | bcd8e46 | 2018-04-20 15:44:56 +1000 | [diff] [blame] | 13 | |
| 14 | } // namespace |
| 15 | |
François Degros | 15a44a8 | 2019-11-19 14:01:08 +1100 | [diff] [blame] | 16 | Uri::Uri(const base::StringPiece scheme, const base::StringPiece path) |
Sergei Datsenko | bcd8e46 | 2018-04-20 15:44:56 +1000 | [diff] [blame] | 17 | : scheme_(scheme), path_(path) {} |
| 18 | |
| 19 | std::string Uri::value() const { |
François Degros | 15a44a8 | 2019-11-19 14:01:08 +1100 | [diff] [blame] | 20 | std::string s; |
Sergei Datsenko | bcd8e46 | 2018-04-20 15:44:56 +1000 | [diff] [blame] | 21 | |
François Degros | 15a44a8 | 2019-11-19 14:01:08 +1100 | [diff] [blame] | 22 | 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 Datsenko | bcd8e46 | 2018-04-20 15:44:56 +1000 | [diff] [blame] | 27 | } |
François Degros | 15a44a8 | 2019-11-19 14:01:08 +1100 | [diff] [blame] | 28 | |
| 29 | return s; |
Sergei Datsenko | bcd8e46 | 2018-04-20 15:44:56 +1000 | [diff] [blame] | 30 | } |
| 31 | |
François Degros | 15a44a8 | 2019-11-19 14:01:08 +1100 | [diff] [blame] | 32 | Uri 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 Datsenko | bcd8e46 | 2018-04-20 15:44:56 +1000 | [diff] [blame] | 52 | } |
| 53 | |
| 54 | } // namespace cros_disks |