From 344e1b12e4ad4a78b6b543c38247bda538bbf9b2 Mon Sep 17 00:00:00 2001 From: Cliffano Subagio Date: Wed, 29 Jun 2016 01:57:08 +1000 Subject: [PATCH] Disable template data HTML-escaping on generated code files. --- .../io/swagger/codegen/DefaultGenerator.java | 15 ++++++----- .../swagger/codegen/DefaultGeneratorTest.java | 26 +++++++++++++++++++ .../resources/2_0/pathWithHtmlEntity.yaml | 10 +++++++ 3 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 modules/swagger-codegen/src/test/resources/2_0/pathWithHtmlEntity.yaml diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java index 970084accd35..fa05deb0939a 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java @@ -176,7 +176,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { config.additionalProperties().put("termsOfService", config.escapeText(info.getTermsOfService())); } } - + if(swagger.getVendorExtensions() != null) { config.vendorExtensions().putAll(swagger.getVendorExtensions()); } @@ -279,21 +279,21 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { Map models = processModels(config, modelMap, definitions); models.put("classname", config.toModelName(name)); models.putAll(config.additionalProperties()); - + allProcessedModels.put(name, models); } catch (Exception e) { throw new RuntimeException("Could not process model '" + name + "'", e); } } - + // post process all processed models allProcessedModels = config.postProcessAllModels(allProcessedModels); - + // generate files based on processed models for (String name: allProcessedModels.keySet()) { Map models = (Map)allProcessedModels.get(name); - + try { //don't generate models that have an import mapping if(config.importMapping().containsKey(name)) { @@ -393,7 +393,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { operation.put("classname", config.toApiName(tag)); operation.put("classVarName", config.toApiVarName(tag)); operation.put("importPath", config.toApiImport(tag)); - + if(!config.vendorExtensions().isEmpty()) { operation.put("vendorExtensions", config.vendorExtensions()); } @@ -631,6 +631,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { String templateFile = getFullTemplateFile(config, templateName); String template = readTemplate(templateFile); Template tmpl = Mustache.compiler() + .escapeHTML(false) .withLoader(new Mustache.TemplateLoader() { @Override public Reader getTemplate(String name) { @@ -704,7 +705,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { tags = new ArrayList(); tags.add("default"); } - + /* build up a set of parameter "ids" defined at the operation level per the swagger 2.0 spec "A unique parameter is defined by a combination of a name and location" diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/DefaultGeneratorTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/DefaultGeneratorTest.java index bfc25b8f5cc3..701cbd6e2b13 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/DefaultGeneratorTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/DefaultGeneratorTest.java @@ -1,6 +1,7 @@ package io.swagger.codegen; import io.swagger.codegen.languages.JavaClientCodegen; +import io.swagger.codegen.languages.RubyClientCodegen; import io.swagger.models.Swagger; import io.swagger.parser.SwaggerParser; import org.apache.commons.io.FileUtils; @@ -221,6 +222,31 @@ public class DefaultGeneratorTest { } } + @Test + public void testGenerateWithHtmlEntity() throws Exception { + final File output = folder.getRoot(); + + final Swagger swagger = new SwaggerParser().read("src/test/resources/2_0/pathWithHtmlEntity.yaml"); + CodegenConfig codegenConfig = new RubyClientCodegen(); + codegenConfig.setOutputDir(output.getAbsolutePath()); + + ClientOptInput clientOptInput = new ClientOptInput().opts(new ClientOpts()).swagger(swagger).config(codegenConfig); + + DefaultGenerator generator = new DefaultGenerator(); + generator.opts(clientOptInput); + List files = generator.generate(); + boolean apiFileGenerated = false; + for (File file : files) { + if (file.getName().equals("default_api.rb")) { + apiFileGenerated = true; + assertTrue(FileUtils.readFileToString(file, StandardCharsets.UTF_8).contains("local_var_path = \"/foo=bar\"")); + } + } + if (!apiFileGenerated) { + fail("Default api file is not generated!"); + } + } + private static void changeContent(File file) throws IOException { Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), UTF_8)); out.write(TEST_SKIP_OVERWRITE); diff --git a/modules/swagger-codegen/src/test/resources/2_0/pathWithHtmlEntity.yaml b/modules/swagger-codegen/src/test/resources/2_0/pathWithHtmlEntity.yaml new file mode 100644 index 000000000000..929a5cd8f9b5 --- /dev/null +++ b/modules/swagger-codegen/src/test/resources/2_0/pathWithHtmlEntity.yaml @@ -0,0 +1,10 @@ +--- +swagger: "2.0" +basePath: "/" +paths: + /foo=bar: + get: + parameters: [] + responses: + 200: + description: "success"