Skip to content

Commit

Permalink
Merge branch 'master' into fix/AG-21901
Browse files Browse the repository at this point in the history
  • Loading branch information
slavaleleka committed May 22, 2023
2 parents 49af0b1 + b8caf11 commit 42734ab
Show file tree
Hide file tree
Showing 11 changed files with 840 additions and 90 deletions.
49 changes: 49 additions & 0 deletions packages/tsurlfilter/src/common/error.ts
@@ -0,0 +1,49 @@
type ErrorWithMessage = {
message: string
};

/**
* Checks if error has message.
*
* @param error Error object.
* @returns If param is error.
*/
function isErrorWithMessage(error: unknown): error is ErrorWithMessage {
return (
typeof error === 'object'
&& error !== null
&& 'message' in error
&& typeof (error as Record<string, unknown>).message === 'string'
);
}

/**
* Converts error to the error with message.
*
* @param maybeError Possible error.
* @returns Error with message.
*/
function toErrorWithMessage(maybeError: unknown): ErrorWithMessage {
if (isErrorWithMessage(maybeError)) {
return maybeError;
}

try {
return new Error(JSON.stringify(maybeError));
} catch {
// fallback in case there's an error stringifying the maybeError
// like with circular references for example.
return new Error(String(maybeError));
}
}

/**
* Converts error object to error with message. This method might be helpful to handle thrown errors.
*
* @param error Error object.
*
* @returns Message of the error.
*/
export function getErrorMessage(error: unknown): string {
return toErrorWithMessage(error).message;
}
4 changes: 0 additions & 4 deletions packages/tsurlfilter/src/modifiers/replace-modifier.ts
Expand Up @@ -42,10 +42,6 @@ export class ReplaceModifier implements IAdvancedModifier {

const parts = splitByDelimiterWithEscapeCharacter(option, '/', '\\', true);

if (parts.length < 2 || parts.length > 3) {
throw new Error(`Cannot parse ${option}`);
}

let modifiers = (parts[2] || '');
if (modifiers.indexOf('g') < 0) {
modifiers += 'g';
Expand Down
16 changes: 3 additions & 13 deletions packages/tsurlfilter/src/rules/cosmetic-rule-parser.ts
@@ -1,4 +1,4 @@
import { splitByDelimiterWithEscapeCharacter } from '../utils/string-utils';
import { parseOptionsString } from '../utils/parse-options-string';
import { COMMA_SEPARATOR, DomainModifier, PIPE_SEPARATOR } from '../modifiers/domain-modifier';
import { findCosmeticRuleMarker } from './cosmetic-rule-marker';
import { CosmeticRuleModifiers, CosmeticRuleModifiersSyntax } from './cosmetic-rule-modifiers';
Expand Down Expand Up @@ -130,19 +130,9 @@ export class CosmeticRuleParser {
return null;
}

const {
EscapeCharacter,
Delimiter,
Assigner,
} = CosmeticRuleModifiersSyntax;
const { Assigner } = CosmeticRuleModifiersSyntax;

const modifiersTextArray = splitByDelimiterWithEscapeCharacter(
modifiersText,
Delimiter,
EscapeCharacter,
false,
false,
);
const modifiersTextArray = parseOptionsString(modifiersText, false);

const modifiers = Object.create(null);

Expand Down
16 changes: 10 additions & 6 deletions packages/tsurlfilter/src/rules/network-rule.ts
Expand Up @@ -3,11 +3,8 @@ import * as rule from './rule';
import { SimpleRegex } from './simple-regex';
import { Request } from '../request';
import { DomainModifier, PIPE_SEPARATOR } from '../modifiers/domain-modifier';
import {
splitByDelimiterWithEscapeCharacter,
stringArraysEquals,
stringArraysHaveIntersection,
} from '../utils/string-utils';
import { parseOptionsString } from '../utils/parse-options-string';
import { stringArraysEquals, stringArraysHaveIntersection } from '../utils/string-utils';
import { IAdvancedModifier } from '../modifiers/advanced-modifier';
import { ReplaceModifier } from '../modifiers/replace-modifier';
import { CspModifier } from '../modifiers/csp-modifier';
Expand All @@ -24,6 +21,7 @@ import {
NOT_MARK,
OPTIONS_DELIMITER,
} from './network-rule-options';
import { getErrorMessage } from '../common/error';
import { RequestType } from '../request-type';
import { ClientModifier } from '../modifiers/dns/client-modifier';
import { DnsRewriteModifier } from '../modifiers/dns/dnsrewrite-modifier';
Expand Down Expand Up @@ -743,7 +741,13 @@ export class NetworkRule implements rule.IRule {
* @throws an error if there is an unsupported modifier
*/
private loadOptions(options: string): void {
const optionParts = splitByDelimiterWithEscapeCharacter(options, ',', '\\', false);
let optionParts;
try {
optionParts = parseOptionsString(options);
} catch (e) {
const errorMessage = getErrorMessage(e);
throw new Error(`Cannot parse ${options}: ${errorMessage}`);
}

for (let i = 0; i < optionParts.length; i += 1) {
const option = optionParts[i];
Expand Down
4 changes: 2 additions & 2 deletions packages/tsurlfilter/src/rules/rule-converter.ts
Expand Up @@ -5,7 +5,7 @@ import { EXT_CSS_PSEUDO_INDICATORS } from './cosmetic-rule';
import { findCosmeticRuleMarker } from './cosmetic-rule-marker';
import { SimpleRegex } from './simple-regex';
import { OPTIONS_DELIMITER } from './network-rule-options';
import { splitByDelimiterWithEscapeCharacter } from '../utils/string-utils';
import { parseOptionsString } from '../utils/parse-options-string';
import { RuleFactory } from './rule-factory';

interface ConversionOptions {
Expand Down Expand Up @@ -115,7 +115,7 @@ export class RuleConverter {

const domainPart = ruleText.slice(0, optionsDelimiterIdx);
const optionsPart = ruleText.slice(optionsDelimiterIdx + 1);
const optionsParts = splitByDelimiterWithEscapeCharacter(optionsPart, ',', '\\', false);
const optionsParts = parseOptionsString(optionsPart);

return [domainPart, optionsParts];
};
Expand Down

0 comments on commit 42734ab

Please sign in to comment.