From dd971f19e7c536800632a7e318e0ab51b3a105a1 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Sun, 15 Feb 2015 17:15:40 -0800 Subject: [PATCH] added support for headers when generating per #102 --- .../swagger/codegen/ClientOptInput.java | 44 +++++++++++++++++++ .../com/wordnik/swagger/codegen/Codegen.java | 6 ++- .../swagger/codegen/DefaultCodegen.java | 1 - .../src/test/scala/ClientAuthInputTest.scala | 44 +++++++++++++++++++ 4 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 modules/swagger-codegen/src/test/scala/ClientAuthInputTest.scala diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOptInput.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOptInput.java index 9e8466824a3..34d6000e303 100644 --- a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOptInput.java +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOptInput.java @@ -19,10 +19,16 @@ package com.wordnik.swagger.codegen; import com.wordnik.swagger.codegen.ClientOpts; import com.wordnik.swagger.annotations.*; import com.wordnik.swagger.models.Swagger; +import com.wordnik.swagger.models.auth.AuthorizationValue; + +import java.util.*; +import java.net.URLEncoder; +import java.net.URLDecoder; public class ClientOptInput { private ClientOpts opts; private Swagger swagger; + private List auths; protected CodegenConfig config; public ClientOptInput swagger(Swagger swagger) { @@ -34,6 +40,44 @@ public class ClientOptInput { return this; } + public void setAuth(String urlEncodedAuthString) { + List auths = new ArrayList(); + if(urlEncodedAuthString != null && !"".equals(urlEncodedAuthString)) { + String[] parts = urlEncodedAuthString.split(","); + for(String part : parts) { + String[] kvPair = part.split(":"); + if(kvPair.length == 2) { + auths.add(new AuthorizationValue(URLDecoder.decode(kvPair[0]), URLDecoder.decode(kvPair[1]), "header")); + } + } + } + this.auths = auths; + } + public String getAuth() { + if(auths != null) { + StringBuilder b = new StringBuilder(); + for(AuthorizationValue v : auths) { + try { + if(b.toString().length() > 0) + b.append(","); + b.append(URLEncoder.encode(v.getKeyName(), "UTF-8")) + .append(":") + .append(URLEncoder.encode(v.getValue(), "UTF-8")); + } + catch (Exception e) { + // continue + e.printStackTrace(); + } + } + return b.toString(); + } + else + return null; + } + public List getAuthorizationValues() { + return auths; + } + public CodegenConfig getConfig() { return config; } diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Codegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Codegen.java index 7ffb1ba1547..6648288ca4f 100644 --- a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Codegen.java +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Codegen.java @@ -2,6 +2,7 @@ package com.wordnik.swagger.codegen; import com.wordnik.swagger.codegen.languages.*; import com.wordnik.swagger.models.Swagger; +import com.wordnik.swagger.models.auth.AuthorizationValue; import com.wordnik.swagger.util.*; import io.swagger.parser.SwaggerParser; @@ -43,6 +44,7 @@ public class Codegen extends DefaultGenerator { options.addOption("i", "input-spec", true, "location of the swagger spec, as URL or file"); options.addOption("t", "template-dir", true, "folder containing the template files"); options.addOption("d", "debug-info", false, "prints additional info for debugging"); + options.addOption("a", "auth", false, "addes authorization headers when fetching the swagger definitions remotely. Pass in a URL-encoded string of name:header with a comma separating multiple values"); ClientOptInput clientOptInput = new ClientOptInput(); ClientOpts clientOpts = new ClientOpts(); @@ -59,6 +61,8 @@ public class Codegen extends DefaultGenerator { System.out.println(debugInfoOptions); return; } + if (cmd.hasOption("a")) + clientOptInput.setAuth(cmd.getOptionValue("a")); if (cmd.hasOption("l")) clientOptInput.setConfig(getConfig(cmd.getOptionValue("l"))); if (cmd.hasOption("o")) @@ -76,7 +80,7 @@ public class Codegen extends DefaultGenerator { return; } if (cmd.hasOption("i")) - swagger = new SwaggerParser().read(cmd.getOptionValue("i")); + swagger = new SwaggerParser().read(cmd.getOptionValue("i"), clientOptInput.getAuthorizationValues()); if (cmd.hasOption("t")) clientOpts.getProperties().put("templateDir", String.valueOf(cmd.getOptionValue("t"))); } diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java index 74a51279a04..3d53c17f54e 100644 --- a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java @@ -333,7 +333,6 @@ public class DefaultCodegen { public CodegenModel fromModel(String name, Model model) { CodegenModel m = CodegenModelFactory.newInstance(CodegenModelType.MODEL); - System.out.println("created " + m.getClass()); if(reservedWords.contains(name)) m.name = escapeReservedWord(name); else diff --git a/modules/swagger-codegen/src/test/scala/ClientAuthInputTest.scala b/modules/swagger-codegen/src/test/scala/ClientAuthInputTest.scala new file mode 100644 index 00000000000..83c3be06f93 --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/ClientAuthInputTest.scala @@ -0,0 +1,44 @@ +import com.wordnik.swagger.codegen._ + +import com.wordnik.swagger.models.auth.AuthorizationValue + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.FlatSpec +import org.scalatest.Matchers + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class ClientAuthInputTest extends FlatSpec with Matchers { + behavior of "ClientAuthInput" + + it should "read a file upload param from a 2.0 spec" in { + val input = new ClientOptInput() + + val header = "api_key:special-key,api_key:hello,X-AUTHORIZATION:0e6c11d79a,Authorization:Basic 1jz0" + input.setAuth(header) + val authValues = input.getAuthorizationValues() + authValues.size() should be (4) + + val a1 = authValues.get(0) + a1.getKeyName should be ("api_key") + a1.getValue should be ("special-key") + a1.getType should be ("header") + + val a2 = authValues.get(1) + a2.getKeyName should be ("api_key") + a2.getValue should be ("hello") + a2.getType should be ("header") + + val a3 = authValues.get(2) + a3.getKeyName should be ("X-AUTHORIZATION") + a3.getValue should be ("0e6c11d79a") + a3.getType should be ("header") + + val a4 = authValues.get(3) + a4.getKeyName should be ("Authorization") + a4.getValue should be ("Basic 1jz0") + a4.getType should be ("header") + } +} \ No newline at end of file