// This file is part of Desktop App Toolkit, // a set of libraries for developing nice desktop applications. // // For license and copyright information please follow this link: // https://github.com/desktop-app/legal/blob/master/LEGAL // #include "base/qthelp_url.h" namespace qthelp { namespace { QRegularExpression CreateRegExp(const QString &expression) { auto result = QRegularExpression( expression, QRegularExpression::UseUnicodePropertiesOption); result.optimize(); return result; } QString ExpressionDomain() { // Matches any domain name, containing at least one '.', including "file.txt". return QString::fromUtf8("(? url_parse_params( const QString ¶ms, UrlParamNameTransform transform) { auto result = QMap(); const auto transformParamName = [transform](const QString &name) { if (transform == UrlParamNameTransform::ToLower) { return name.toLower(); } return name; }; for (const auto ¶m : params.split('&')) { // Skip params without a name (starting with '='). if (auto separatorPosition = param.indexOf('=')) { const auto paramName = transformParamName( (separatorPosition > 0) ? param.mid(0, separatorPosition) : param); const auto paramValue = (separatorPosition > 0) ? url_decode(param.mid(separatorPosition + 1)) : QString(); if (!result.contains(paramName)) { result.insert(paramName, paramValue); } } } return result; } bool is_ipv6(const QString &ip) { //static const auto regexp = QRegularExpression("^[a-fA-F0-9:]+$"); //return regexp.match(ip).hasMatch(); return ip.indexOf('.') < 0 && ip.indexOf(':') >= 0; } QString url_append_query_or_hash(const QString &url, const QString &add) { const auto query = url.lastIndexOf('?'); if (query < 0) { return url + '?' + add; } const auto hash = url.lastIndexOf('#'); return url + (query >= 0 && query > hash ? '&' : '?') + add; } QString validate_url(const QString &value) { const auto trimmed = value.trimmed(); if (trimmed.isEmpty()) { return QString(); } const auto domainMatch = RegExpDomainExplicit().match(trimmed); const auto ipMatch = RegExpIpExplicit().match(trimmed); if (!domainMatch.hasMatch() && !ipMatch.hasMatch()) { const auto domain = RegExpDomain().match(trimmed); if (!domain.hasMatch() || domain.capturedStart() != 0) { return QString(); } return qstr("http://") + trimmed; } else if (domainMatch.capturedStart() != 0 && ipMatch.capturedStart() != 0) { return QString(); } const auto protocolMatch = RegExpProtocol().match(trimmed); Assert(protocolMatch.hasMatch()); return IsGoodProtocol(protocolMatch.captured(1)) ? trimmed : QString(); } } // namespace qthelp