Skip to content

Commit a1c23e5

Browse files
committed
[Gateway POP]fix: resolve canonicalized headers and response headers
1 parent 09df5d9 commit a1c23e5

File tree

15 files changed

+238
-40
lines changed

15 files changed

+238
-40
lines changed

alibabacloud-gateway-pop/Teafile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
"SignatureUtil": "darabonba:SignatureUtil:*",
2020
"String": "darabonba:String:*",
2121
"Map": "darabonba:Map:*",
22-
"Array": "darabonba:Array:*"
22+
"Array": "darabonba:Array:*",
23+
"XML": "darabonba:XML:*"
2324
},
2425
"releases": {
2526
"ts": "@alicloud/gateway-pop:^0.0.9",

alibabacloud-gateway-pop/csharp/core/Client.cs

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,18 @@ public void ModifyResponse(AlibabaCloud.GatewaySpi.Models.InterceptorContext con
298298
AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextResponse response = context.Response;
299299
if (AlibabaCloud.TeaUtil.Common.Is4xx(response.StatusCode) || AlibabaCloud.TeaUtil.Common.Is5xx(response.StatusCode))
300300
{
301-
object _res = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response.Body);
302-
Dictionary<string, object> err = AlibabaCloud.TeaUtil.Common.AssertAsMap(_res);
301+
Dictionary<string, object> err = new Dictionary<string, object>(){};
302+
if (!AlibabaCloud.TeaUtil.Common.IsUnset(response.Headers.Get("content-type")) && AlibabaCloud.DarabonbaString.StringUtil.Contains(response.Headers.Get("content-type"), "text/xml"))
303+
{
304+
string _str = AlibabaCloud.TeaUtil.Common.ReadAsString(response.Body);
305+
Dictionary<string, object> respMap = AlibabaCloud.TeaXML.Client.ParseXml(_str, null);
306+
err = AlibabaCloud.TeaUtil.Common.AssertAsMap(respMap.Get("Error"));
307+
}
308+
else
309+
{
310+
object _res = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response.Body);
311+
err = AlibabaCloud.TeaUtil.Common.AssertAsMap(_res);
312+
}
303313
object requestId = DefaultAny(err.Get("RequestId"), err.Get("requestId"));
304314
if (!AlibabaCloud.TeaUtil.Common.IsUnset(response.Headers.Get("x-acs-request-id")))
305315
{
@@ -356,8 +366,18 @@ public async Task ModifyResponseAsync(AlibabaCloud.GatewaySpi.Models.Interceptor
356366
AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextResponse response = context.Response;
357367
if (AlibabaCloud.TeaUtil.Common.Is4xx(response.StatusCode) || AlibabaCloud.TeaUtil.Common.Is5xx(response.StatusCode))
358368
{
359-
object _res = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response.Body);
360-
Dictionary<string, object> err = AlibabaCloud.TeaUtil.Common.AssertAsMap(_res);
369+
Dictionary<string, object> err = new Dictionary<string, object>(){};
370+
if (!AlibabaCloud.TeaUtil.Common.IsUnset(response.Headers.Get("content-type")) && AlibabaCloud.DarabonbaString.StringUtil.Contains(response.Headers.Get("content-type"), "text/xml"))
371+
{
372+
string _str = AlibabaCloud.TeaUtil.Common.ReadAsString(response.Body);
373+
Dictionary<string, object> respMap = AlibabaCloud.TeaXML.Client.ParseXml(_str, null);
374+
err = AlibabaCloud.TeaUtil.Common.AssertAsMap(respMap.Get("Error"));
375+
}
376+
else
377+
{
378+
object _res = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response.Body);
379+
err = AlibabaCloud.TeaUtil.Common.AssertAsMap(_res);
380+
}
361381
object requestId = DefaultAny(err.Get("RequestId"), err.Get("requestId"));
362382
if (!AlibabaCloud.TeaUtil.Common.IsUnset(response.Headers.Get("x-acs-request-id")))
363383
{
@@ -552,11 +572,28 @@ public string BuildCanonicalizedResource(Dictionary<string, string> query)
552572

553573
public string BuildCanonicalizedHeaders(Dictionary<string, string> headers)
554574
{
575+
// lower header key
576+
List<string> headersArray = AlibabaCloud.DarabonbaMap.MapUtil.KeySet(headers);
577+
Dictionary<string, string> newHeaders = new Dictionary<string, string>(){};
578+
string tmp = "";
579+
580+
foreach (var key in headersArray) {
581+
string lowerKey = AlibabaCloud.DarabonbaString.StringUtil.ToLower(key);
582+
if (!AlibabaCloud.DarabonbaString.StringUtil.Contains(tmp, lowerKey))
583+
{
584+
tmp = "" + tmp + "," + lowerKey;
585+
newHeaders[lowerKey] = AlibabaCloud.DarabonbaString.StringUtil.Trim(headers.Get(key));
586+
}
587+
else
588+
{
589+
newHeaders[lowerKey] = "" + newHeaders.Get(lowerKey) + "," + AlibabaCloud.DarabonbaString.StringUtil.Trim(headers.Get(key));
590+
}
591+
}
555592
string canonicalizedHeaders = "";
556593
List<string> sortedHeaders = GetSignedHeaders(headers);
557594

558595
foreach (var header in sortedHeaders) {
559-
canonicalizedHeaders = "" + canonicalizedHeaders + header + ":" + AlibabaCloud.DarabonbaString.StringUtil.Trim(headers.Get(header)) + "\n";
596+
canonicalizedHeaders = "" + canonicalizedHeaders + header + ":" + newHeaders.Get(header) + "\n";
560597
}
561598
return canonicalizedHeaders;
562599
}

alibabacloud-gateway-pop/csharp/core/client.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,6 @@
5151
<PackageReference Include="AlibabaCloud.DarabonbaMap" Version="0.0.2"/>
5252
<PackageReference Include="AlibabaCloud.DarabonbaArray" Version="0.1.0"/>
5353
<PackageReference Include="Tea" Version="1.1.3"/>
54+
<PackageReference Include="AlibabaCloud.TeaXML" Version="0.0.5"/>
5455
</ItemGroup>
5556
</Project>

alibabacloud-gateway-pop/golang/client/client.go

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
endpointutil "github.com/alibabacloud-go/endpoint-util/service"
1212
openapiutil "github.com/alibabacloud-go/openapi-util/service"
1313
util "github.com/alibabacloud-go/tea-utils/v2/service"
14+
xml "github.com/alibabacloud-go/tea-xml/service"
1415
"github.com/alibabacloud-go/tea/tea"
1516
)
1617

@@ -181,14 +182,30 @@ func (client *Client) ModifyResponse(context *spi.InterceptorContext, attributeM
181182
request := context.Request
182183
response := context.Response
183184
if tea.BoolValue(util.Is4xx(response.StatusCode)) || tea.BoolValue(util.Is5xx(response.StatusCode)) {
184-
_res, _err := util.ReadAsJSON(response.Body)
185-
if _err != nil {
186-
return _err
187-
}
185+
err := map[string]interface{}{}
186+
if !tea.BoolValue(util.IsUnset(response.Headers["content-type"])) && tea.BoolValue(string_.Contains(response.Headers["content-type"], tea.String("text/xml"))) {
187+
_str, _err := util.ReadAsString(response.Body)
188+
if _err != nil {
189+
return _err
190+
}
191+
192+
respMap := xml.ParseXml(_str, nil)
193+
err, _err = util.AssertAsMap(respMap["Error"])
194+
if _err != nil {
195+
return _err
196+
}
197+
198+
} else {
199+
_res, _err := util.ReadAsJSON(response.Body)
200+
if _err != nil {
201+
return _err
202+
}
203+
204+
err, _err = util.AssertAsMap(_res)
205+
if _err != nil {
206+
return _err
207+
}
188208

189-
err, _err := util.AssertAsMap(_res)
190-
if _err != nil {
191-
return _err
192209
}
193210

194211
requestId := client.DefaultAny(err["RequestId"], err["requestId"])
@@ -400,10 +417,24 @@ func (client *Client) BuildCanonicalizedResource(query map[string]*string) (_res
400417
}
401418

402419
func (client *Client) BuildCanonicalizedHeaders(headers map[string]*string) (_result *string) {
420+
// lower header key
421+
headersArray := map_.KeySet(headers)
422+
newHeaders := make(map[string]*string)
423+
tmp := tea.String("")
424+
for _, key := range headersArray {
425+
lowerKey := string_.ToLower(key)
426+
if !tea.BoolValue(string_.Contains(tmp, lowerKey)) {
427+
tmp = tea.String(tea.StringValue(tmp) + "," + tea.StringValue(lowerKey))
428+
newHeaders[tea.StringValue(lowerKey)] = string_.Trim(headers[tea.StringValue(key)])
429+
} else {
430+
newHeaders[tea.StringValue(lowerKey)] = tea.String(tea.StringValue(newHeaders[tea.StringValue(lowerKey)]) + "," + tea.StringValue(string_.Trim(headers[tea.StringValue(key)])))
431+
}
432+
433+
}
403434
canonicalizedHeaders := tea.String("")
404435
sortedHeaders := client.GetSignedHeaders(headers)
405436
for _, header := range sortedHeaders {
406-
canonicalizedHeaders = tea.String(tea.StringValue(canonicalizedHeaders) + tea.StringValue(header) + ":" + tea.StringValue(string_.Trim(headers[tea.StringValue(header)])) + "\n")
437+
canonicalizedHeaders = tea.String(tea.StringValue(canonicalizedHeaders) + tea.StringValue(header) + ":" + tea.StringValue(newHeaders[tea.StringValue(header)]) + "\n")
407438
}
408439
_result = canonicalizedHeaders
409440
return _result

alibabacloud-gateway-pop/golang/go.mod

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ require (
1313
github.com/alibabacloud-go/openapi-util v0.1.1
1414
github.com/alibabacloud-go/tea v1.2.2
1515
github.com/alibabacloud-go/tea-utils/v2 v2.0.6
16-
github.com/aliyun/credentials-go v1.4.5 // indirect
16+
github.com/alibabacloud-go/tea-xml v1.1.3
17+
github.com/aliyun/credentials-go v1.4.5
18+
github.com/clbanning/mxj/v2 v2.7.0 // indirect
1719
github.com/json-iterator/go v1.1.12 // indirect
1820
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
1921
golang.org/x/net v0.23.0 // indirect

alibabacloud-gateway-pop/golang/go.sum

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,18 @@ github.com/alibabacloud-go/tea-utils/v2 v2.0.5 h1:EUakYEUAwr6L3wLT0vejIw2rc0IA1R
4040
github.com/alibabacloud-go/tea-utils/v2 v2.0.5/go.mod h1:dL6vbUT35E4F4bFTHL845eUloqaerYBYPsdWR2/jhe4=
4141
github.com/alibabacloud-go/tea-utils/v2 v2.0.6 h1:ZkmUlhlQbaDC+Eba/GARMPy6hKdCLiSke5RsN5LcyQ0=
4242
github.com/alibabacloud-go/tea-utils/v2 v2.0.6/go.mod h1:qxn986l+q33J5VkialKMqT/TTs3E+U9MJpd001iWQ9I=
43+
github.com/alibabacloud-go/tea-xml v1.1.3 h1:7LYnm+JbOq2B+T/B0fHC4Ies4/FofC4zHzYtqw7dgt0=
44+
github.com/alibabacloud-go/tea-xml v1.1.3/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8=
4345
github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw=
4446
github.com/aliyun/credentials-go v1.3.1 h1:uq/0v7kWrxmoLGpqjx7vtQ/s03f0zR//0br/xWDTE28=
4547
github.com/aliyun/credentials-go v1.3.1/go.mod h1:8jKYhQuDawt8x2+fusqa1Y6mPxemTsBEN04dgcAcYz0=
4648
github.com/aliyun/credentials-go v1.3.6/go.mod h1:1LxUuX7L5YrZUWzBrRyk0SwSdH4OmPrib8NVePL3fxM=
4749
github.com/aliyun/credentials-go v1.4.5 h1:O76WYKgdy1oQYYiJkERjlA2dxGuvLRrzuO2ScrtGWSk=
4850
github.com/aliyun/credentials-go v1.4.5/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U=
4951
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
52+
github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I=
53+
github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
54+
github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
5055
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
5156
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
5257
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=

alibabacloud-gateway-pop/java/pom.xml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@
4242
</distributionManagement>
4343
<scm>
4444
<connection>scm:git:git://github.com/aliyun/alibabacloud-gateway.git</connection>
45-
<developerConnection>scm:git:[email protected]:aliyun/alibabacloud-gateway.git</developerConnection>
46-
<url>https://github.com/aliyun/alibabacloud-gateway</url>
45+
<developerConnection>scm:git:[email protected]:aliyun/alibabacloud-gateway.git</developerConnection>
46+
<url>https://github.com/aliyun/alibabacloud-gateway</url>
4747
</scm>
4848
<dependencies>
4949
<dependency>
@@ -108,6 +108,11 @@
108108
<version>4.13.1</version>
109109
<scope>test</scope>
110110
</dependency>
111+
<dependency>
112+
<groupId>com.aliyun</groupId>
113+
<artifactId>tea-xml</artifactId>
114+
<version>0.1.6</version>
115+
</dependency>
111116
</dependencies>
112117
<build>
113118
<plugins>

alibabacloud-gateway-pop/java/src/main/java/com/aliyun/gateway/pop/Client.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,16 @@ public void modifyResponse(com.aliyun.gateway.spi.models.InterceptorContext cont
139139
com.aliyun.gateway.spi.models.InterceptorContext.InterceptorContextRequest request = context.request;
140140
com.aliyun.gateway.spi.models.InterceptorContext.InterceptorContextResponse response = context.response;
141141
if (com.aliyun.teautil.Common.is4xx(response.statusCode) || com.aliyun.teautil.Common.is5xx(response.statusCode)) {
142-
Object _res = com.aliyun.teautil.Common.readAsJSON(response.body);
143-
java.util.Map<String, Object> err = com.aliyun.teautil.Common.assertAsMap(_res);
142+
java.util.Map<String, Object> err = new java.util.HashMap<>();
143+
if (!com.aliyun.teautil.Common.isUnset(response.headers.get("content-type")) && com.aliyun.darabonbastring.Client.contains(response.headers.get("content-type"), "text/xml")) {
144+
String _str = com.aliyun.teautil.Common.readAsString(response.body);
145+
java.util.Map<String, Object> respMap = com.aliyun.teaxml.Client.parseXml(_str, null);
146+
err = com.aliyun.teautil.Common.assertAsMap(respMap.get("Error"));
147+
} else {
148+
Object _res = com.aliyun.teautil.Common.readAsJSON(response.body);
149+
err = com.aliyun.teautil.Common.assertAsMap(_res);
150+
}
151+
144152
Object requestId = this.defaultAny(err.get("RequestId"), err.get("requestId"));
145153
if (!com.aliyun.teautil.Common.isUnset(response.headers.get("x-acs-request-id"))) {
146154
requestId = response.headers.get("x-acs-request-id");
@@ -304,10 +312,24 @@ public String buildCanonicalizedResource(java.util.Map<String, String> query) th
304312
}
305313

306314
public String buildCanonicalizedHeaders(java.util.Map<String, String> headers) throws Exception {
315+
// lower header key
316+
java.util.List<String> headersArray = com.aliyun.darabonba.map.Client.keySet(headers);
317+
java.util.Map<String, String> newHeaders = new java.util.HashMap<>();
318+
String tmp = "";
319+
for (String key : headersArray) {
320+
String lowerKey = com.aliyun.darabonbastring.Client.toLower(key);
321+
if (!com.aliyun.darabonbastring.Client.contains(tmp, lowerKey)) {
322+
tmp = "" + tmp + "," + lowerKey + "";
323+
newHeaders.put(lowerKey, com.aliyun.darabonbastring.Client.trim(headers.get(key)));
324+
} else {
325+
newHeaders.put(lowerKey, "" + newHeaders.get(lowerKey) + "," + com.aliyun.darabonbastring.Client.trim(headers.get(key)) + "");
326+
}
327+
328+
}
307329
String canonicalizedHeaders = "";
308330
java.util.List<String> sortedHeaders = this.getSignedHeaders(headers);
309331
for (String header : sortedHeaders) {
310-
canonicalizedHeaders = "" + canonicalizedHeaders + "" + header + ":" + com.aliyun.darabonbastring.Client.trim(headers.get(header)) + "\n";
332+
canonicalizedHeaders = "" + canonicalizedHeaders + "" + header + ":" + newHeaders.get(header) + "\n";
311333
}
312334
return canonicalizedHeaders;
313335
}

alibabacloud-gateway-pop/main.tea

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import SignatureUtil;
88
import String;
99
import Map;
1010
import Array;
11+
import XML;
1112

1213
extends SPI;
1314

@@ -140,8 +141,15 @@ async function modifyResponse(context: SPI.InterceptorContext, attributeMap: SPI
140141
var request = context.request;
141142
var response = context.response;
142143
if (Util.is4xx(response.statusCode) || Util.is5xx(response.statusCode)) {
143-
var _res = Util.readAsJSON(response.body);
144-
var err = Util.assertAsMap(_res);
144+
var err : map[string]any = {};
145+
if (!Util.isUnset(response.headers.content-type) && String.contains(response.headers.content-type, 'text/xml')) {
146+
var _str = Util.readAsString(response.body);
147+
var respMap = XML.parseXml(_str, null);
148+
err = Util.assertAsMap(respMap.Error);
149+
} else {
150+
var _res = Util.readAsJSON(response.body);
151+
err = Util.assertAsMap(_res);
152+
}
145153
var requestId = defaultAny(err.RequestId, err.requestId);
146154
if (!Util.isUnset(response.headers.x-acs-request-id)) {
147155
requestId = response.headers.x-acs-request-id;
@@ -289,10 +297,24 @@ function buildCanonicalizedResource(query: map[string]string): string {
289297
}
290298

291299
function buildCanonicalizedHeaders(headers: map[string]string): string {
300+
// lower header key
301+
var headersArray : [string] = Map.keySet(headers);
302+
var newHeaders : map[string]string = {};
303+
var tmp : string = '';
304+
for(var key : headersArray) {
305+
var lowerKey = String.toLower(key);
306+
if (!String.contains(tmp, lowerKey)) {
307+
tmp = `${tmp},${lowerKey}`;
308+
newHeaders[lowerKey] = String.trim(headers[key]);
309+
} else {
310+
newHeaders[lowerKey] = `${newHeaders[lowerKey]},${String.trim(headers[key])}`;
311+
}
312+
}
313+
292314
var canonicalizedHeaders : string = '';
293315
var sortedHeaders : [string] = getSignedHeaders(headers);
294316
for(var header : sortedHeaders) {
295-
canonicalizedHeaders = `${canonicalizedHeaders}${header}:${String.trim(headers[header])}\n`;
317+
canonicalizedHeaders = `${canonicalizedHeaders}${header}:${newHeaders[header]}\n`;
296318
}
297319
return canonicalizedHeaders;
298320
}

alibabacloud-gateway-pop/php/composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
"alibabacloud/darabonba-signature-util": "^0.0.4",
2121
"alibabacloud/darabonba-string": "^0.1.16",
2222
"alibabacloud/darabonba-map": "^0.0.1",
23-
"alibabacloud/darabonba-array": "^0.1.0"
23+
"alibabacloud/darabonba-array": "^0.1.0",
24+
"alibabacloud/tea-xml": "^0.2"
2425
},
2526
"autoload": {
2627
"psr-4": {

0 commit comments

Comments
 (0)