From 7f1b14a2925ce3b9a7bd1d09734b0d65af1faf60 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Sun, 20 Jan 2019 13:05:08 +0100 Subject: [PATCH] Escaping new lines for json; fixes gh-802 --- .../verifier/builder/JUnitMethodBodyBuilder.groovy | 3 ++- .../verifier/builder/MethodBodyBuilder.groovy | 7 +++++-- .../builder/RequestProcessingMethodBodyBuilder.groovy | 8 ++++++++ .../SpockMethodRequestProcessingBodyBuilder.groovy | 3 ++- .../verifier/builder/MethodBodyBuilderSpec.groovy | 11 ++++++----- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMethodBodyBuilder.groovy index 0d1dbd64fb..ad4566b409 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMethodBodyBuilder.groovy @@ -159,7 +159,8 @@ abstract class JUnitMethodBodyBuilder extends RequestProcessingMethodBodyBuilder if (body instanceof ExecutionProperty) { value = body.toString() } else { - value = "\"$body\"" + String escaped = escapeRequestSpecialChars(body.toString()) + value = "\"$escaped\"" } return ".body($value)" } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy index f58c555c66..af8f41d7a1 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy @@ -16,8 +16,6 @@ package org.springframework.cloud.contract.verifier.builder -import org.springframework.cloud.contract.spec.internal.Cookie - import java.util.regex.Pattern import com.jayway.jsonpath.DocumentContext @@ -33,6 +31,7 @@ import org.springframework.cloud.contract.spec.Contract import org.springframework.cloud.contract.spec.ContractTemplate import org.springframework.cloud.contract.spec.internal.BodyMatcher import org.springframework.cloud.contract.spec.internal.BodyMatchers +import org.springframework.cloud.contract.spec.internal.Cookie import org.springframework.cloud.contract.spec.internal.DslProperty import org.springframework.cloud.contract.spec.internal.ExecutionProperty import org.springframework.cloud.contract.spec.internal.Header @@ -92,6 +91,10 @@ abstract class MethodBodyBuilder { return new HandlebarsTemplateProcessor() } + protected ContentType getRequestContentType() { + return ContentType.UNKNOWN + } + /** * Builds the response body validation code block */ diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/RequestProcessingMethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/RequestProcessingMethodBodyBuilder.groovy index 1fc64deb51..99284ac63b 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/RequestProcessingMethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/RequestProcessingMethodBodyBuilder.groovy @@ -63,6 +63,14 @@ abstract class RequestProcessingMethodBodyBuilder extends MethodBodyBuilder { this.response = stubDefinition.response } + protected String escapeRequestSpecialChars(String string) { + if (getRequestContentType() == ContentType.JSON) { + return string + .replaceAll('\\\\n', '\\\\\\\\n') + } + return string + } + /** * Returns code used to retrieve a response for the given {@link Request} */ diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMethodRequestProcessingBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMethodRequestProcessingBodyBuilder.groovy index 0e4f0022e6..e9d4cc6b1d 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMethodRequestProcessingBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMethodRequestProcessingBodyBuilder.groovy @@ -134,7 +134,8 @@ abstract class SpockMethodRequestProcessingBodyBuilder extends RequestProcessing if (body instanceof ExecutionProperty) { value = body.toString() } else { - value = "'''$body'''" + String escaped = escapeRequestSpecialChars(body.toString()) + value = "'''$escaped'''" } return ".body($value)" } diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy index b0ad01f6cd..81a292e711 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy @@ -16,17 +16,18 @@ package org.springframework.cloud.contract.verifier.builder +import java.lang.reflect.InvocationTargetException + import org.junit.Rule +import spock.lang.Issue +import spock.lang.Shared +import spock.lang.Specification + import org.springframework.boot.test.rule.OutputCapture import org.springframework.cloud.contract.spec.Contract import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties import org.springframework.cloud.contract.verifier.dsl.WireMockStubVerifier import org.springframework.cloud.contract.verifier.util.SyntaxChecker -import spock.lang.Issue -import spock.lang.Shared -import spock.lang.Specification - -import java.lang.reflect.InvocationTargetException class MethodBodyBuilderSpec extends Specification implements WireMockStubVerifier {