aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAlexey Rusakov <Kitsune-Ral@users.sf.net>2021-02-21 20:20:38 +0100
committerAlexey Rusakov <Kitsune-Ral@users.sf.net>2021-02-21 20:48:05 +0100
commit81664eaf5a983dbd326e4d24d21c2108ea4d6353 (patch)
tree6d5022087ff375d7f6ef9f6ff81aa0245d0feb8f /lib
parent48d2ecc4df4d1883326036e55949156cfb37acc6 (diff)
downloadlibquotient-81664eaf5a983dbd326e4d24d21c2108ea4d6353.tar.gz
libquotient-81664eaf5a983dbd326e4d24d21c2108ea4d6353.zip
Uri: support abbreviated types in Matrix URIs
As per the latest iteration of MSC2312, room/, user/ and event/ are only supported for parsing and replication but not for emitting from Matrix identifiers. (cherry picked from commit 86f24d1ecf300b82b3a7253b81a2c392669d2c2b)
Diffstat (limited to 'lib')
-rw-r--r--lib/uri.cpp15
1 files changed, 11 insertions, 4 deletions
diff --git a/lib/uri.cpp b/lib/uri.cpp
index 4b171e79..291bfcae 100644
--- a/lib/uri.cpp
+++ b/lib/uri.cpp
@@ -10,13 +10,19 @@
using namespace Quotient;
struct ReplacePair { QByteArray uriString; char sigil; };
-/// Defines bi-directional mapping of path prefixes and sigils
+/// \brief Defines bi-directional mapping of path prefixes and sigils
+///
+/// When there are two prefixes for the same sigil, the first matching
+/// entry for a given sigil is used.
static const auto replacePairs = {
- ReplacePair { "user/", '@' },
+ ReplacePair { "u/", '@' },
+ { "user/", '@' },
{ "roomid/", '!' },
+ { "r/", '#' },
{ "room/", '#' },
// The notation for bare event ids is not proposed in MSC2312 but there's
// https://github.com/matrix-org/matrix-doc/pull/2644
+ { "e/", '$' },
{ "event/", '$' }
};
@@ -97,7 +103,7 @@ Uri::Uri(QUrl url) : QUrl(std::move(url))
case 2:
break;
case 4:
- if (splitPath[2] == "event")
+ if (splitPath[2] == "event" || splitPath[2] == "e")
break;
[[fallthrough]];
default:
@@ -150,7 +156,8 @@ Uri::Type Uri::type() const { return primaryType_; }
Uri::SecondaryType Uri::secondaryType() const
{
- return pathSegment(*this, 2) == "event" ? EventId : NoSecondaryId;
+ const auto& type2 = pathSegment(*this, 2);
+ return type2 == "event" || type2 == "e" ? EventId : NoSecondaryId;
}
QUrl Uri::toUrl(UriForm form) const