blob: 802f3caaaa89946fd26e32bac8fa1b580a478067 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "extensions/browser/api/declarative_net_request/parse_info.h"
#include "base/containers/span.h"
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "extensions/common/error_utils.h"
namespace extensions {
namespace declarative_net_request {
namespace {
// Helper to ensure pointers to string literals can be used with
// base::JoinString.
std::string JoinString(base::span<const char* const> parts) {
std::vector<base::StringPiece> parts_piece;
for (const char* part : parts)
parts_piece.push_back(part);
return base::JoinString(parts_piece, ", ");
}
} // namespace
ParseInfo::ParseInfo(ParseResult result) : result_(result) {}
ParseInfo::ParseInfo(ParseResult result, int rule_id)
: result_(result), rule_id_(rule_id) {}
ParseInfo::ParseInfo(const ParseInfo&) = default;
ParseInfo& ParseInfo::operator=(const ParseInfo&) = default;
std::string ParseInfo::GetErrorDescription() const {
// Every error except ERROR_PERSISTING_RULESET requires |rule_id_|.
DCHECK_EQ(!rule_id_.has_value(),
result_ == ParseResult::ERROR_PERSISTING_RULESET);
std::string error;
switch (result_) {
case ParseResult::SUCCESS:
NOTREACHED();
break;
case ParseResult::ERROR_RESOURCE_TYPE_DUPLICATED:
error = ErrorUtils::FormatErrorMessage(kErrorResourceTypeDuplicated,
base::NumberToString(*rule_id_));
break;
case ParseResult::ERROR_EMPTY_REDIRECT_RULE_PRIORITY:
error = ErrorUtils::FormatErrorMessage(kErrorEmptyRedirectRuleKey,
base::NumberToString(*rule_id_),
kPriorityKey);
break;
case ParseResult::ERROR_EMPTY_UPGRADE_RULE_PRIORITY:
error = ErrorUtils::FormatErrorMessage(kErrorEmptyUpgradeRulePriority,
base::NumberToString(*rule_id_));
break;
case ParseResult::ERROR_INVALID_RULE_ID:
error = ErrorUtils::FormatErrorMessage(
kErrorInvalidRuleKey, base::NumberToString(*rule_id_), kIDKey,
base::NumberToString(kMinValidID));
break;
case ParseResult::ERROR_INVALID_REDIRECT_RULE_PRIORITY:
case ParseResult::ERROR_INVALID_UPGRADE_RULE_PRIORITY:
error = ErrorUtils::FormatErrorMessage(
kErrorInvalidRuleKey, base::NumberToString(*rule_id_), kPriorityKey,
base::NumberToString(kMinValidPriority));
break;
case ParseResult::ERROR_NO_APPLICABLE_RESOURCE_TYPES:
error = ErrorUtils::FormatErrorMessage(kErrorNoApplicableResourceTypes,
base::NumberToString(*rule_id_));
break;
case ParseResult::ERROR_EMPTY_DOMAINS_LIST:
error = ErrorUtils::FormatErrorMessage(
kErrorEmptyList, base::NumberToString(*rule_id_), kDomainsKey);
break;
case ParseResult::ERROR_EMPTY_RESOURCE_TYPES_LIST:
error = ErrorUtils::FormatErrorMessage(
kErrorEmptyList, base::NumberToString(*rule_id_), kResourceTypesKey);
break;
case ParseResult::ERROR_EMPTY_URL_FILTER:
error = ErrorUtils::FormatErrorMessage(
kErrorEmptyUrlFilter, base::NumberToString(*rule_id_), kUrlFilterKey);
break;
case ParseResult::ERROR_INVALID_REDIRECT_URL:
error = ErrorUtils::FormatErrorMessage(kErrorInvalidRedirectUrl,
base::NumberToString(*rule_id_),
kRedirectUrlPath);
break;
case ParseResult::ERROR_DUPLICATE_IDS:
error = ErrorUtils::FormatErrorMessage(kErrorDuplicateIDs,
base::NumberToString(*rule_id_));
break;
case ParseResult::ERROR_PERSISTING_RULESET:
error = kErrorPersisting;
break;
case ParseResult::ERROR_NON_ASCII_URL_FILTER:
error = ErrorUtils::FormatErrorMessage(
kErrorNonAscii, base::NumberToString(*rule_id_), kUrlFilterKey);
break;
case ParseResult::ERROR_NON_ASCII_DOMAIN:
error = ErrorUtils::FormatErrorMessage(
kErrorNonAscii, base::NumberToString(*rule_id_), kDomainsKey);
break;
case ParseResult::ERROR_NON_ASCII_EXCLUDED_DOMAIN:
error = ErrorUtils::FormatErrorMessage(
kErrorNonAscii, base::NumberToString(*rule_id_), kExcludedDomainsKey);
break;
case ParseResult::ERROR_INVALID_URL_FILTER:
error = ErrorUtils::FormatErrorMessage(
kErrorInvalidKey, base::NumberToString(*rule_id_), kUrlFilterKey);
break;
case ParseResult::ERROR_EMPTY_REMOVE_HEADERS_LIST:
error = ErrorUtils::FormatErrorMessage(kErrorEmptyRemoveHeadersList,
base::NumberToString(*rule_id_),
kRemoveHeadersListKey);
break;
case ParseResult::ERROR_INVALID_REDIRECT:
error = ErrorUtils::FormatErrorMessage(
kErrorInvalidKey, base::NumberToString(*rule_id_), kRedirectPath);
break;
case ParseResult::ERROR_INVALID_EXTENSION_PATH:
error = ErrorUtils::FormatErrorMessage(kErrorInvalidKey,
base::NumberToString(*rule_id_),
kExtensionPathPath);
break;
case ParseResult::ERROR_INVALID_TRANSFORM_SCHEME:
error = ErrorUtils::FormatErrorMessage(
kErrorInvalidTransformScheme, base::NumberToString(*rule_id_),
kTransformSchemePath,
JoinString(base::span<const char* const>(kAllowedTransformSchemes)));
break;
case ParseResult::ERROR_INVALID_TRANSFORM_PORT:
error = ErrorUtils::FormatErrorMessage(kErrorInvalidKey,
base::NumberToString(*rule_id_),
kTransformPortPath);
break;
case ParseResult::ERROR_INVALID_TRANSFORM_QUERY:
error = ErrorUtils::FormatErrorMessage(kErrorInvalidKey,
base::NumberToString(*rule_id_),
kTransformQueryPath);
break;
case ParseResult::ERROR_INVALID_TRANSFORM_FRAGMENT:
error = ErrorUtils::FormatErrorMessage(kErrorInvalidKey,
base::NumberToString(*rule_id_),
kTransformFragmentPath);
break;
case ParseResult::ERROR_QUERY_AND_TRANSFORM_BOTH_SPECIFIED:
error = ErrorUtils::FormatErrorMessage(
kErrorQueryAndTransformBothSpecified, base::NumberToString(*rule_id_),
kTransformQueryPath, kTransformQueryTransformPath);
break;
case ParseResult::ERROR_JAVASCRIPT_REDIRECT:
error = ErrorUtils::FormatErrorMessage(kErrorJavascriptRedirect,
base::NumberToString(*rule_id_),
kRedirectUrlPath);
break;
}
return error;
}
} // namespace declarative_net_request
} // namespace extensions