Skip to content

Commit bcb7e88

Browse files
authored
Tsp - Merge headers from different content types (#1420)
1 parent 3ca9480 commit bcb7e88

File tree

5 files changed

+83
-11
lines changed

5 files changed

+83
-11
lines changed

packages/typespec-powershell/src/convertor/convertor.ts

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -260,18 +260,28 @@ function addResponses(psContext: SdkContext, op: HttpOperation, newOperation: Op
260260
(<any>newResponse).schema = schema;
261261
}
262262
// Add headers
263+
// we merge headers here, if the same header is defined in multiple responses, we only add it once.
264+
// This is aligned with the behavior of typescript emitter and typespec-autorest emitter.
263265
newResponse.protocol.http = newResponse.protocol.http ?? new Protocol();
264-
if (response.responses[0].headers) {
265-
for (const key in response.responses[0].headers) {
266-
newResponse.protocol.http.headers = newResponse.protocol.http.headers || [];
267-
const header = response.responses[0].headers[key];
268-
const headerSchema = getSchemaForType(psContext, header.type);
269-
const headerResponse = new HttpHeader(key, headerSchema);
270-
headerResponse.language = new Languages();
271-
headerResponse.language.default = new Language();
272-
headerResponse.language.default.description = getDoc(psContext.program, header) || "";
273-
headerResponse.language.default.name = pascalCase(deconstruct(key));
274-
newResponse.protocol.http.headers.push(headerResponse);
266+
const addedKeys: string[] = [];
267+
for (const innerResponse of response.responses) {
268+
if (innerResponse.headers) {
269+
for (const key in innerResponse.headers) {
270+
if (addedKeys.includes(key)) {
271+
continue;
272+
} else {
273+
addedKeys.push(key);
274+
}
275+
newResponse.protocol.http.headers = newResponse.protocol.http.headers || [];
276+
const header = innerResponse.headers[key];
277+
const headerSchema = getSchemaForType(psContext, header.type);
278+
const headerResponse = new HttpHeader(key, headerSchema);
279+
headerResponse.language = new Languages();
280+
headerResponse.language.default = new Language();
281+
headerResponse.language.default.description = getDoc(psContext.program, header) || "";
282+
headerResponse.language.default.name = pascalCase(deconstruct(key));
283+
newResponse.protocol.http.headers.push(headerResponse);
284+
}
275285
}
276286
}
277287
newResponse.protocol.http.statusCodes = statusCode === "*" ? ["default"] : [statusCode];

tests-upgrade/tests-emitter/AppComplianceAutomation.Management/target/generated/api/Models/ProviderActionsOnboardAcceptedResponseHeaders.PowerShell.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ internal ProviderActionsOnboardAcceptedResponseHeaders(global::System.Collection
115115
{
116116
((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsOnboardAcceptedResponseHeadersInternal)this).Location = (string) content.GetValueForProperty("Location",((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsOnboardAcceptedResponseHeadersInternal)this).Location, global::System.Convert.ToString);
117117
}
118+
if (content.Contains("RetryAfter"))
119+
{
120+
((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsOnboardAcceptedResponseHeadersInternal)this).RetryAfter = (int?) content.GetValueForProperty("RetryAfter",((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsOnboardAcceptedResponseHeadersInternal)this).RetryAfter, (__y)=> (int) global::System.Convert.ChangeType(__y, typeof(int)));
121+
}
118122
AfterDeserializeDictionary(content);
119123
}
120124

@@ -136,6 +140,10 @@ internal ProviderActionsOnboardAcceptedResponseHeaders(global::System.Management
136140
{
137141
((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsOnboardAcceptedResponseHeadersInternal)this).Location = (string) content.GetValueForProperty("Location",((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsOnboardAcceptedResponseHeadersInternal)this).Location, global::System.Convert.ToString);
138142
}
143+
if (content.Contains("RetryAfter"))
144+
{
145+
((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsOnboardAcceptedResponseHeadersInternal)this).RetryAfter = (int?) content.GetValueForProperty("RetryAfter",((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsOnboardAcceptedResponseHeadersInternal)this).RetryAfter, (__y)=> (int) global::System.Convert.ChangeType(__y, typeof(int)));
146+
}
139147
AfterDeserializePSObject(content);
140148
}
141149

tests-upgrade/tests-emitter/AppComplianceAutomation.Management/target/generated/api/Models/ProviderActionsOnboardAcceptedResponseHeaders.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,23 @@ public partial class ProviderActionsOnboardAcceptedResponseHeaders :
1717
[Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Origin(Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.PropertyOrigin.Owned)]
1818
public string Location { get => this._location; set => this._location = value; }
1919

20+
/// <summary>Backing field for <see cref="RetryAfter" /> property.</summary>
21+
private int? _retryAfter;
22+
23+
[Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Origin(Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.PropertyOrigin.Owned)]
24+
public int? RetryAfter { get => this._retryAfter; set => this._retryAfter = value; }
25+
2026
/// <param name="headers"></param>
2127
void Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Runtime.IHeaderSerializable.ReadHeaders(global::System.Net.Http.Headers.HttpResponseHeaders headers)
2228
{
2329
if (headers.TryGetValues("Location", out var __locationHeader0))
2430
{
2531
((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsOnboardAcceptedResponseHeadersInternal)this).Location = System.Linq.Enumerable.FirstOrDefault(__locationHeader0) is string __headerLocationHeader0 ? __headerLocationHeader0 : (string)null;
2632
}
33+
if (headers.TryGetValues("Retry-After", out var __retryAfterHeader1))
34+
{
35+
((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsOnboardAcceptedResponseHeadersInternal)this).RetryAfter = System.Linq.Enumerable.FirstOrDefault(__retryAfterHeader1) is string __headerRetryAfterHeader1 ? int.TryParse( __headerRetryAfterHeader1, out int __headerRetryAfterHeader1Value ) ? __headerRetryAfterHeader1Value : default(int?) : default(int?);
36+
}
2737
}
2838

2939
/// <summary>
@@ -48,11 +58,24 @@ public partial interface IProviderActionsOnboardAcceptedResponseHeaders
4858
PossibleTypes = new [] { typeof(string) })]
4959
string Location { get; set; }
5060

61+
[Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Runtime.Info(
62+
Required = false,
63+
ReadOnly = false,
64+
Read = true,
65+
Create = true,
66+
Update = true,
67+
Description = @"",
68+
SerializedName = @"Retry-After",
69+
PossibleTypes = new [] { typeof(int) })]
70+
int? RetryAfter { get; set; }
71+
5172
}
5273
internal partial interface IProviderActionsOnboardAcceptedResponseHeadersInternal
5374

5475
{
5576
string Location { get; set; }
5677

78+
int? RetryAfter { get; set; }
79+
5780
}
5881
}

tests-upgrade/tests-emitter/AppComplianceAutomation.Management/target/generated/api/Models/ProviderActionsTriggerEvaluationAcceptedResponseHeaders.PowerShell.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ internal ProviderActionsTriggerEvaluationAcceptedResponseHeaders(global::System.
115115
{
116116
((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsTriggerEvaluationAcceptedResponseHeadersInternal)this).Location = (string) content.GetValueForProperty("Location",((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsTriggerEvaluationAcceptedResponseHeadersInternal)this).Location, global::System.Convert.ToString);
117117
}
118+
if (content.Contains("RetryAfter"))
119+
{
120+
((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsTriggerEvaluationAcceptedResponseHeadersInternal)this).RetryAfter = (int?) content.GetValueForProperty("RetryAfter",((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsTriggerEvaluationAcceptedResponseHeadersInternal)this).RetryAfter, (__y)=> (int) global::System.Convert.ChangeType(__y, typeof(int)));
121+
}
118122
AfterDeserializeDictionary(content);
119123
}
120124

@@ -136,6 +140,10 @@ internal ProviderActionsTriggerEvaluationAcceptedResponseHeaders(global::System.
136140
{
137141
((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsTriggerEvaluationAcceptedResponseHeadersInternal)this).Location = (string) content.GetValueForProperty("Location",((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsTriggerEvaluationAcceptedResponseHeadersInternal)this).Location, global::System.Convert.ToString);
138142
}
143+
if (content.Contains("RetryAfter"))
144+
{
145+
((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsTriggerEvaluationAcceptedResponseHeadersInternal)this).RetryAfter = (int?) content.GetValueForProperty("RetryAfter",((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsTriggerEvaluationAcceptedResponseHeadersInternal)this).RetryAfter, (__y)=> (int) global::System.Convert.ChangeType(__y, typeof(int)));
146+
}
139147
AfterDeserializePSObject(content);
140148
}
141149

tests-upgrade/tests-emitter/AppComplianceAutomation.Management/target/generated/api/Models/ProviderActionsTriggerEvaluationAcceptedResponseHeaders.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,23 @@ public partial class ProviderActionsTriggerEvaluationAcceptedResponseHeaders :
1717
[Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Origin(Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.PropertyOrigin.Owned)]
1818
public string Location { get => this._location; set => this._location = value; }
1919

20+
/// <summary>Backing field for <see cref="RetryAfter" /> property.</summary>
21+
private int? _retryAfter;
22+
23+
[Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Origin(Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.PropertyOrigin.Owned)]
24+
public int? RetryAfter { get => this._retryAfter; set => this._retryAfter = value; }
25+
2026
/// <param name="headers"></param>
2127
void Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Runtime.IHeaderSerializable.ReadHeaders(global::System.Net.Http.Headers.HttpResponseHeaders headers)
2228
{
2329
if (headers.TryGetValues("Location", out var __locationHeader0))
2430
{
2531
((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsTriggerEvaluationAcceptedResponseHeadersInternal)this).Location = System.Linq.Enumerable.FirstOrDefault(__locationHeader0) is string __headerLocationHeader0 ? __headerLocationHeader0 : (string)null;
2632
}
33+
if (headers.TryGetValues("Retry-After", out var __retryAfterHeader1))
34+
{
35+
((Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Models.IProviderActionsTriggerEvaluationAcceptedResponseHeadersInternal)this).RetryAfter = System.Linq.Enumerable.FirstOrDefault(__retryAfterHeader1) is string __headerRetryAfterHeader1 ? int.TryParse( __headerRetryAfterHeader1, out int __headerRetryAfterHeader1Value ) ? __headerRetryAfterHeader1Value : default(int?) : default(int?);
36+
}
2737
}
2838

2939
/// <summary>
@@ -48,11 +58,24 @@ public partial interface IProviderActionsTriggerEvaluationAcceptedResponseHeader
4858
PossibleTypes = new [] { typeof(string) })]
4959
string Location { get; set; }
5060

61+
[Microsoft.Azure.PowerShell.Cmdlets.AppComplianceAutomation.Runtime.Info(
62+
Required = false,
63+
ReadOnly = false,
64+
Read = true,
65+
Create = true,
66+
Update = true,
67+
Description = @"",
68+
SerializedName = @"Retry-After",
69+
PossibleTypes = new [] { typeof(int) })]
70+
int? RetryAfter { get; set; }
71+
5172
}
5273
internal partial interface IProviderActionsTriggerEvaluationAcceptedResponseHeadersInternal
5374

5475
{
5576
string Location { get; set; }
5677

78+
int? RetryAfter { get; set; }
79+
5780
}
5881
}

0 commit comments

Comments
 (0)