From df9e447aa3cb45dd61a728401bc89c269a3598f4 Mon Sep 17 00:00:00 2001 From: Raman Savitski Date: Fri, 27 Nov 2020 19:20:32 +0300 Subject: [PATCH 1/2] Backquote/backtick symbol (`) is not escaped correctly --- src/openApi/v2/parser/escapeDescription.spec.ts | 9 +++++++++ src/openApi/v2/parser/escapeDescription.ts | 3 +++ src/openApi/v2/parser/getOperationErrors.ts | 3 ++- src/openApi/v3/parser/escapeDescription.spec.ts | 9 +++++++++ src/openApi/v3/parser/escapeDescription.ts | 3 +++ src/openApi/v3/parser/getOperationErrors.ts | 3 ++- 6 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 src/openApi/v2/parser/escapeDescription.spec.ts create mode 100644 src/openApi/v2/parser/escapeDescription.ts create mode 100644 src/openApi/v3/parser/escapeDescription.spec.ts create mode 100644 src/openApi/v3/parser/escapeDescription.ts diff --git a/src/openApi/v2/parser/escapeDescription.spec.ts b/src/openApi/v2/parser/escapeDescription.spec.ts new file mode 100644 index 00000000..1196a813 --- /dev/null +++ b/src/openApi/v2/parser/escapeDescription.spec.ts @@ -0,0 +1,9 @@ +import { escapeDescription } from './escapeDescription'; + +describe('escapeDescription', () => { + it('should escape', () => { + expect(escapeDescription('')).toEqual(''); + expect(escapeDescription('fooBar')).toEqual('fooBar'); + expect(escapeDescription('foo `test` bar')).toEqual('foo \\`test\\` bar'); + }); +}); diff --git a/src/openApi/v2/parser/escapeDescription.ts b/src/openApi/v2/parser/escapeDescription.ts new file mode 100644 index 00000000..fc87533a --- /dev/null +++ b/src/openApi/v2/parser/escapeDescription.ts @@ -0,0 +1,3 @@ +export function escapeDescription(value: string): string { + return value.replace(/`/g, '\\`'); +} diff --git a/src/openApi/v2/parser/getOperationErrors.ts b/src/openApi/v2/parser/getOperationErrors.ts index 9703f91b..31a742c8 100644 --- a/src/openApi/v2/parser/getOperationErrors.ts +++ b/src/openApi/v2/parser/getOperationErrors.ts @@ -1,5 +1,6 @@ import type { OperationError } from '../../../client/interfaces/OperationError'; import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; +import { escapeDescription } from './escapeDescription'; export function getOperationErrors(operationResponses: OperationResponse[]): OperationError[] { return operationResponses @@ -8,6 +9,6 @@ export function getOperationErrors(operationResponses: OperationResponse[]): Ope }) .map(response => ({ code: response.code, - description: response.description!, + description: escapeDescription(response.description!), })); } diff --git a/src/openApi/v3/parser/escapeDescription.spec.ts b/src/openApi/v3/parser/escapeDescription.spec.ts new file mode 100644 index 00000000..1196a813 --- /dev/null +++ b/src/openApi/v3/parser/escapeDescription.spec.ts @@ -0,0 +1,9 @@ +import { escapeDescription } from './escapeDescription'; + +describe('escapeDescription', () => { + it('should escape', () => { + expect(escapeDescription('')).toEqual(''); + expect(escapeDescription('fooBar')).toEqual('fooBar'); + expect(escapeDescription('foo `test` bar')).toEqual('foo \\`test\\` bar'); + }); +}); diff --git a/src/openApi/v3/parser/escapeDescription.ts b/src/openApi/v3/parser/escapeDescription.ts new file mode 100644 index 00000000..fc87533a --- /dev/null +++ b/src/openApi/v3/parser/escapeDescription.ts @@ -0,0 +1,3 @@ +export function escapeDescription(value: string): string { + return value.replace(/`/g, '\\`'); +} diff --git a/src/openApi/v3/parser/getOperationErrors.ts b/src/openApi/v3/parser/getOperationErrors.ts index 9703f91b..31a742c8 100644 --- a/src/openApi/v3/parser/getOperationErrors.ts +++ b/src/openApi/v3/parser/getOperationErrors.ts @@ -1,5 +1,6 @@ import type { OperationError } from '../../../client/interfaces/OperationError'; import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; +import { escapeDescription } from './escapeDescription'; export function getOperationErrors(operationResponses: OperationResponse[]): OperationError[] { return operationResponses @@ -8,6 +9,6 @@ export function getOperationErrors(operationResponses: OperationResponse[]): Ope }) .map(response => ({ code: response.code, - description: response.description!, + description: escapeDescription(response.description!), })); } From 2fcd655b7d1a13e5bb30987ddadcc0202617217a Mon Sep 17 00:00:00 2001 From: Raman Savitski Date: Fri, 27 Nov 2020 19:43:37 +0300 Subject: [PATCH 2/2] Backquote/backtick symbol (`) is not escaped correctly --- src/openApi/v2/parser/escapeDescription.spec.ts | 8 ++++++-- src/openApi/v2/parser/escapeDescription.ts | 2 +- src/openApi/v3/parser/escapeDescription.spec.ts | 8 ++++++-- src/openApi/v3/parser/escapeDescription.ts | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/openApi/v2/parser/escapeDescription.spec.ts b/src/openApi/v2/parser/escapeDescription.spec.ts index 1196a813..d4aae6d7 100644 --- a/src/openApi/v2/parser/escapeDescription.spec.ts +++ b/src/openApi/v2/parser/escapeDescription.spec.ts @@ -2,8 +2,12 @@ import { escapeDescription } from './escapeDescription'; describe('escapeDescription', () => { it('should escape', () => { - expect(escapeDescription('')).toEqual(''); - expect(escapeDescription('fooBar')).toEqual('fooBar'); expect(escapeDescription('foo `test` bar')).toEqual('foo \\`test\\` bar'); }); + + it('should not escape', () => { + expect(escapeDescription('')).toEqual(''); + expect(escapeDescription('fooBar')).toEqual('fooBar'); + expect(escapeDescription('foo \\`test\\` bar')).toEqual('foo \\`test\\` bar'); + }); }); diff --git a/src/openApi/v2/parser/escapeDescription.ts b/src/openApi/v2/parser/escapeDescription.ts index fc87533a..087abf8a 100644 --- a/src/openApi/v2/parser/escapeDescription.ts +++ b/src/openApi/v2/parser/escapeDescription.ts @@ -1,3 +1,3 @@ export function escapeDescription(value: string): string { - return value.replace(/`/g, '\\`'); + return value.replace(/([^\\])`/g, '$1\\`'); } diff --git a/src/openApi/v3/parser/escapeDescription.spec.ts b/src/openApi/v3/parser/escapeDescription.spec.ts index 1196a813..d4aae6d7 100644 --- a/src/openApi/v3/parser/escapeDescription.spec.ts +++ b/src/openApi/v3/parser/escapeDescription.spec.ts @@ -2,8 +2,12 @@ import { escapeDescription } from './escapeDescription'; describe('escapeDescription', () => { it('should escape', () => { - expect(escapeDescription('')).toEqual(''); - expect(escapeDescription('fooBar')).toEqual('fooBar'); expect(escapeDescription('foo `test` bar')).toEqual('foo \\`test\\` bar'); }); + + it('should not escape', () => { + expect(escapeDescription('')).toEqual(''); + expect(escapeDescription('fooBar')).toEqual('fooBar'); + expect(escapeDescription('foo \\`test\\` bar')).toEqual('foo \\`test\\` bar'); + }); }); diff --git a/src/openApi/v3/parser/escapeDescription.ts b/src/openApi/v3/parser/escapeDescription.ts index fc87533a..087abf8a 100644 --- a/src/openApi/v3/parser/escapeDescription.ts +++ b/src/openApi/v3/parser/escapeDescription.ts @@ -1,3 +1,3 @@ export function escapeDescription(value: string): string { - return value.replace(/`/g, '\\`'); + return value.replace(/([^\\])`/g, '$1\\`'); }