Skip to content

Commit

Permalink
Merge pull request #2859 from nvmkuruc/arutf
Browse files Browse the repository at this point in the history
Specify invalid UTF-8 characters in URI scheme registration errors

(Internal change: 2313563)
  • Loading branch information
pixar-oss committed Feb 3, 2024
2 parents 97b5aad + 699880f commit 32c1a99
Showing 1 changed file with 12 additions and 18 deletions.
30 changes: 12 additions & 18 deletions pxr/usd/ar/resolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
#include "pxr/base/tf/stl.h"
#include "pxr/base/tf/stringUtils.h"
#include "pxr/base/tf/type.h"
#include "pxr/base/tf/unicodeUtils.h"

#include <tbb/concurrent_hash_map.h>

Expand Down Expand Up @@ -139,36 +140,29 @@ class _ResolverInfo
// with an ASCII alpha character, followed by any number of ASCII alphanumeric
// or the hyphen, period, and plus characters.
std::pair<bool, std::string>
_ValidateResourceIdentifierScheme(const std::string& caseFoldedScheme) {
_ValidateResourceIdentifierScheme(const std::string_view& caseFoldedScheme) {
if (caseFoldedScheme.empty()) {
return std::make_pair(false, "Scheme cannot be empty");
}
if (caseFoldedScheme[0] > 'z' || caseFoldedScheme[0] < 'a') {
if (caseFoldedScheme.front() > 'z' || caseFoldedScheme.front() < 'a') {
return std::make_pair(false, "Scheme must start with ASCII 'a-z'");
}
const auto it = std::find_if(caseFoldedScheme.begin() + 1,
const auto it = std::find_if(std::next(caseFoldedScheme.begin()),
caseFoldedScheme.end(),
[](const char c) {
return !((c >= '0' && c <= '9') ||
(c >= 'a' && c <= 'z') ||
(c == '-') || (c== '.') || (c=='+'));
});
if (it != caseFoldedScheme.end()) {
if ((((*it) & (1<<7)) == 0)) {
// TODO: Once the UTF-8 character iterator lands, it would be
// helpful to include the invalid UTF-8 character in the error
// message output. As invalid UTF-8 characters may span multiple
// bytes, it can't be trivially identified by the character
// iterator.
return std::make_pair(
false, "Non-ASCII UTF-8 characters not allowed in scheme");
}
else {
return std::make_pair(
- false, TfStringPrintf("Character '%c' not allowed in scheme. "
"Must be ASCII 'a-z', '-', '+', or '.'",
*it));
}
TfUtf8CodePointIterator codePointIt(it, caseFoldedScheme.end());
return std::make_pair(
false,
TfStringPrintf(
"'%s' not allowed in scheme. "
"Characters must be ASCII 'a-z', '-', '+', or '.'",
TfStringify(TfUtf8CodePoint{*codePointIt}).c_str())
);
}
return std::make_pair(true, "");
}
Expand Down

0 comments on commit 32c1a99

Please sign in to comment.