Fix the authorizeSecurityGroup[In|E]gress responses (#69)

diff --git a/cloudstack/FirewallService.go b/cloudstack/FirewallService.go
index 2a7ddbe..566643a 100644
--- a/cloudstack/FirewallService.go
+++ b/cloudstack/FirewallService.go
@@ -287,11 +287,6 @@
 		return nil, err
 	}
 
-	resp, err = convertFirewallServiceResponse(resp)
-	if err != nil {
-		return nil, err
-	}
-
 	var r ListPortForwardingRulesResponse
 	if err := json.Unmarshal(resp, &r); err != nil {
 		return nil, err
@@ -506,11 +501,6 @@
 		return nil, err
 	}
 
-	resp, err = convertFirewallServiceResponse(resp)
-	if err != nil {
-		return nil, err
-	}
-
 	var r CreatePortForwardingRuleResponse
 	if err := json.Unmarshal(resp, &r); err != nil {
 		return nil, err
@@ -614,11 +604,6 @@
 		return nil, err
 	}
 
-	resp, err = convertFirewallServiceResponse(resp)
-	if err != nil {
-		return nil, err
-	}
-
 	var r DeletePortForwardingRuleResponse
 	if err := json.Unmarshal(resp, &r); err != nil {
 		return nil, err
@@ -748,11 +733,6 @@
 		return nil, err
 	}
 
-	resp, err = convertFirewallServiceResponse(resp)
-	if err != nil {
-		return nil, err
-	}
-
 	var r UpdatePortForwardingRuleResponse
 	if err := json.Unmarshal(resp, &r); err != nil {
 		return nil, err
@@ -951,11 +931,6 @@
 		return nil, err
 	}
 
-	resp, err = convertFirewallServiceResponse(resp)
-	if err != nil {
-		return nil, err
-	}
-
 	var r CreateFirewallRuleResponse
 	if err := json.Unmarshal(resp, &r); err != nil {
 		return nil, err
@@ -1055,11 +1030,6 @@
 		return nil, err
 	}
 
-	resp, err = convertFirewallServiceResponse(resp)
-	if err != nil {
-		return nil, err
-	}
-
 	var r DeleteFirewallRuleResponse
 	if err := json.Unmarshal(resp, &r); err != nil {
 		return nil, err
@@ -1306,11 +1276,6 @@
 		return nil, err
 	}
 
-	resp, err = convertFirewallServiceResponse(resp)
-	if err != nil {
-		return nil, err
-	}
-
 	var r ListFirewallRulesResponse
 	if err := json.Unmarshal(resp, &r); err != nil {
 		return nil, err
@@ -1412,11 +1377,6 @@
 		return nil, err
 	}
 
-	resp, err = convertFirewallServiceResponse(resp)
-	if err != nil {
-		return nil, err
-	}
-
 	var r UpdateFirewallRuleResponse
 	if err := json.Unmarshal(resp, &r); err != nil {
 		return nil, err
@@ -1611,11 +1571,6 @@
 		return nil, err
 	}
 
-	resp, err = convertFirewallServiceResponse(resp)
-	if err != nil {
-		return nil, err
-	}
-
 	var r CreateEgressFirewallRuleResponse
 	if err := json.Unmarshal(resp, &r); err != nil {
 		return nil, err
@@ -1715,11 +1670,6 @@
 		return nil, err
 	}
 
-	resp, err = convertFirewallServiceResponse(resp)
-	if err != nil {
-		return nil, err
-	}
-
 	var r DeleteEgressFirewallRuleResponse
 	if err := json.Unmarshal(resp, &r); err != nil {
 		return nil, err
@@ -1966,11 +1916,6 @@
 		return nil, err
 	}
 
-	resp, err = convertFirewallServiceResponse(resp)
-	if err != nil {
-		return nil, err
-	}
-
 	var r ListEgressFirewallRulesResponse
 	if err := json.Unmarshal(resp, &r); err != nil {
 		return nil, err
@@ -2072,11 +2017,6 @@
 		return nil, err
 	}
 
-	resp, err = convertFirewallServiceResponse(resp)
-	if err != nil {
-		return nil, err
-	}
-
 	var r UpdateEgressFirewallRuleResponse
 	if err := json.Unmarshal(resp, &r); err != nil {
 		return nil, err
@@ -2224,11 +2164,6 @@
 		return nil, err
 	}
 
-	resp, err = convertFirewallServiceResponse(resp)
-	if err != nil {
-		return nil, err
-	}
-
 	var r AddPaloAltoFirewallResponse
 	if err := json.Unmarshal(resp, &r); err != nil {
 		return nil, err
@@ -2320,11 +2255,6 @@
 		return nil, err
 	}
 
-	resp, err = convertFirewallServiceResponse(resp)
-	if err != nil {
-		return nil, err
-	}
-
 	var r DeletePaloAltoFirewallResponse
 	if err := json.Unmarshal(resp, &r); err != nil {
 		return nil, err
@@ -2409,11 +2339,6 @@
 		return nil, err
 	}
 
-	resp, err = convertFirewallServiceResponse(resp)
-	if err != nil {
-		return nil, err
-	}
-
 	var r ConfigurePaloAltoFirewallResponse
 	if err := json.Unmarshal(resp, &r); err != nil {
 		return nil, err
@@ -2550,11 +2475,6 @@
 		return nil, err
 	}
 
-	resp, err = convertFirewallServiceResponse(resp)
-	if err != nil {
-		return nil, err
-	}
-
 	var r ListPaloAltoFirewallsResponse
 	if err := json.Unmarshal(resp, &r); err != nil {
 		return nil, err
diff --git a/cloudstack/SecurityGroupService.go b/cloudstack/SecurityGroupService.go
index 8034424..7a56c1c 100644
--- a/cloudstack/SecurityGroupService.go
+++ b/cloudstack/SecurityGroupService.go
@@ -24,6 +24,38 @@
 	"strings"
 )
 
+// Helper function for maintaining backwards compatibility
+func convertAuthorizeSecurityGroupIngressResponse(b []byte) ([]byte, error) {
+	var raw struct {
+		Ingressrule []interface{} `json:"ingressrule"`
+	}
+	if err := json.Unmarshal(b, &raw); err != nil {
+		return nil, err
+	}
+
+	if len(raw.Ingressrule) != 1 {
+		return b, nil
+	}
+
+	return json.Marshal(raw.Ingressrule[0])
+}
+
+// Helper function for maintaining backwards compatibility
+func convertAuthorizeSecurityGroupEgressResponse(b []byte) ([]byte, error) {
+	var raw struct {
+		Egressrule []interface{} `json:"egressrule"`
+	}
+	if err := json.Unmarshal(b, &raw); err != nil {
+		return nil, err
+	}
+
+	if len(raw.Egressrule) != 1 {
+		return b, nil
+	}
+
+	return json.Marshal(raw.Egressrule[0])
+}
+
 type CreateSecurityGroupParams struct {
 	p map[string]interface{}
 }
@@ -472,6 +504,11 @@
 			return nil, err
 		}
 
+		b, err = convertAuthorizeSecurityGroupIngressResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
 		if err := json.Unmarshal(b, &r); err != nil {
 			return nil, err
 		}
@@ -760,6 +797,11 @@
 			return nil, err
 		}
 
+		b, err = convertAuthorizeSecurityGroupEgressResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
 		if err := json.Unmarshal(b, &r); err != nil {
 			return nil, err
 		}
diff --git a/generate/generate.go b/generate/generate.go
index 46ec022..5a6d020 100644
--- a/generate/generate.go
+++ b/generate/generate.go
@@ -617,6 +617,40 @@
 		pn("}")
 		pn("")
 	}
+	if s.name == "SecurityGroupService" {
+		pn("// Helper function for maintaining backwards compatibility")
+		pn("func convertAuthorizeSecurityGroupIngressResponse(b []byte) ([]byte, error) {")
+		pn("	var raw struct {")
+		pn("		Ingressrule []interface{} `json:\"ingressrule\"`")
+		pn("	}")
+		pn("	if err := json.Unmarshal(b, &raw); err != nil {")
+		pn("		return nil, err")
+		pn("	}")
+		pn("")
+		pn("	if len(raw.Ingressrule) != 1 {")
+		pn("		return b, nil")
+		pn("	}")
+		pn("")
+		pn("	return json.Marshal(raw.Ingressrule[0])")
+		pn("}")
+		pn("")
+		pn("// Helper function for maintaining backwards compatibility")
+		pn("func convertAuthorizeSecurityGroupEgressResponse(b []byte) ([]byte, error) {")
+		pn("	var raw struct {")
+		pn("		Egressrule []interface{} `json:\"egressrule\"`")
+		pn("	}")
+		pn("	if err := json.Unmarshal(b, &raw); err != nil {")
+		pn("		return nil, err")
+		pn("	}")
+		pn("")
+		pn("	if len(raw.Egressrule) != 1 {")
+		pn("		return b, nil")
+		pn("	}")
+		pn("")
+		pn("	return json.Marshal(raw.Egressrule[0])")
+		pn("}")
+		pn("")
+	}
 
 	for _, a := range s.apis {
 		s.generateParamType(a)
@@ -1032,13 +1066,6 @@
 		pn("	}")
 		pn("")
 	}
-	if s.name == "FirewallService" {
-		pn("	resp, err = convertFirewallServiceResponse(resp)")
-		pn("	if err != nil {")
-		pn("		return nil, err")
-		pn("	}")
-		pn("")
-	}
 	pn("	var r %s", n+"Response")
 	pn("	if err := json.Unmarshal(resp, &r); err != nil {")
 	pn("		return nil, err")
@@ -1069,6 +1096,20 @@
 			pn("		}")
 			pn("")
 		}
+		if n == "AuthorizeSecurityGroupIngress" {
+			pn("		b, err = convertAuthorizeSecurityGroupIngressResponse(b)")
+			pn("		if err != nil {")
+			pn("			return nil, err")
+			pn("		}")
+			pn("")
+		}
+		if n == "AuthorizeSecurityGroupEgress" {
+			pn("		b, err = convertAuthorizeSecurityGroupEgressResponse(b)")
+			pn("		if err != nil {")
+			pn("			return nil, err")
+			pn("		}")
+			pn("")
+		}
 		pn("		if err := json.Unmarshal(b, &r); err != nil {")
 		pn("			return nil, err")
 		pn("		}")