Skip to content

Commit fedfbc9

Browse files
fix(http-client-java): handle null LRO error response bodies (#11007)
downstream Azure/azure-sdk-for-java#49537 ## Summary - default generated management LRO error response bodies to an empty byte array when the service returns no body - add a management template test covering the generated HttpResponseImpl output - regenerate the affected management test clients and add a changelog entry --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent dffc2b0 commit fedfbc9

17 files changed

Lines changed: 57 additions & 15 deletions

File tree

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
changeKind: fix
3+
packages:
4+
- "@typespec/http-client-java"
5+
---
6+
7+
Fix null LRO error response body handling in generated management clients.

packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/template/FluentServiceClientTemplate.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,10 @@ protected void writeAdditionalClassBlock(JavaClass classBlock) {
133133
code.line("super(null);");
134134
code.line("this.statusCode = statusCode;");
135135
code.line("this.httpHeaders = httpHeaders;");
136+
// Use an empty array so body accessors still work when the poller surfaces an error without a
137+
// response body.
136138
code.line(
137-
"this.responseBody = responseBody == null ? null : responseBody.getBytes(StandardCharsets.UTF_8);");
139+
"this.responseBody = responseBody == null ? new byte[0] : responseBody.getBytes(StandardCharsets.UTF_8);");
138140
});
139141

140142
block.publicMethod("int getStatusCode()", code -> code.methodReturn("statusCode"));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
package com.microsoft.typespec.http.client.generator.mgmt.template;
5+
6+
import com.microsoft.typespec.http.client.generator.core.model.javamodel.JavaFile;
7+
import com.microsoft.typespec.http.client.generator.mgmt.TestUtils;
8+
import org.junit.jupiter.api.Assertions;
9+
import org.junit.jupiter.api.BeforeAll;
10+
import org.junit.jupiter.api.Test;
11+
12+
public class FluentServiceClientTemplateTests {
13+
14+
@BeforeAll
15+
public static void ensurePlugin() {
16+
new TestUtils.MockFluentGen();
17+
}
18+
19+
@Test
20+
public void writesEmptyByteArrayForNullLroErrorBody() {
21+
JavaFile javaFile = new JavaFile("ProgramEnrollmentManagementClientImpl.java");
22+
23+
javaFile.publicFinalClass("ProgramEnrollmentManagementClientImpl",
24+
classBlock -> FluentServiceClientTemplate.getInstance().writeAdditionalClassBlock(classBlock));
25+
26+
String output = javaFile.getContents().toString();
27+
28+
Assertions.assertTrue(output.contains(
29+
"this.responseBody = responseBody == null ? new byte[0] : responseBody.getBytes(StandardCharsets.UTF_8);"));
30+
Assertions.assertFalse(output.contains(
31+
"this.responseBody = responseBody == null ? null : responseBody.getBytes(StandardCharsets.UTF_8);"));
32+
}
33+
}

packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/resourcemanager/commonproperties/implementation/CommonPropertiesClientImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ private static final class HttpResponseImpl extends HttpResponse {
304304
super(null);
305305
this.statusCode = statusCode;
306306
this.httpHeaders = httpHeaders;
307-
this.responseBody = responseBody == null ? null : responseBody.getBytes(StandardCharsets.UTF_8);
307+
this.responseBody = responseBody == null ? new byte[0] : responseBody.getBytes(StandardCharsets.UTF_8);
308308
}
309309

310310
public int getStatusCode() {

packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/resourcemanager/largeheader/implementation/LargeHeaderClientImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ private static final class HttpResponseImpl extends HttpResponse {
272272
super(null);
273273
this.statusCode = statusCode;
274274
this.httpHeaders = httpHeaders;
275-
this.responseBody = responseBody == null ? null : responseBody.getBytes(StandardCharsets.UTF_8);
275+
this.responseBody = responseBody == null ? new byte[0] : responseBody.getBytes(StandardCharsets.UTF_8);
276276
}
277277

278278
public int getStatusCode() {

packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/resourcemanager/managementgroup/implementation/ManagementGroupClientImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ private static final class HttpResponseImpl extends HttpResponse {
256256
super(null);
257257
this.statusCode = statusCode;
258258
this.httpHeaders = httpHeaders;
259-
this.responseBody = responseBody == null ? null : responseBody.getBytes(StandardCharsets.UTF_8);
259+
this.responseBody = responseBody == null ? new byte[0] : responseBody.getBytes(StandardCharsets.UTF_8);
260260
}
261261

262262
public int getStatusCode() {

packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/resourcemanager/methodsubscriptionid/implementation/MethodSubscriptionIdClientImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ private static final class HttpResponseImpl extends HttpResponse {
346346
super(null);
347347
this.statusCode = statusCode;
348348
this.httpHeaders = httpHeaders;
349-
this.responseBody = responseBody == null ? null : responseBody.getBytes(StandardCharsets.UTF_8);
349+
this.responseBody = responseBody == null ? new byte[0] : responseBody.getBytes(StandardCharsets.UTF_8);
350350
}
351351

352352
public int getStatusCode() {

packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/resourcemanager/multiservice/combined/implementation/CombinedImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ private static final class HttpResponseImpl extends HttpResponse {
273273
super(null);
274274
this.statusCode = statusCode;
275275
this.httpHeaders = httpHeaders;
276-
this.responseBody = responseBody == null ? null : responseBody.getBytes(StandardCharsets.UTF_8);
276+
this.responseBody = responseBody == null ? new byte[0] : responseBody.getBytes(StandardCharsets.UTF_8);
277277
}
278278

279279
public int getStatusCode() {

packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/resourcemanager/multiservicesharedmodels/combined/implementation/CombinedImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ private static final class HttpResponseImpl extends HttpResponse {
273273
super(null);
274274
this.statusCode = statusCode;
275275
this.httpHeaders = httpHeaders;
276-
this.responseBody = responseBody == null ? null : responseBody.getBytes(StandardCharsets.UTF_8);
276+
this.responseBody = responseBody == null ? new byte[0] : responseBody.getBytes(StandardCharsets.UTF_8);
277277
}
278278

279279
public int getStatusCode() {

packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/resourcemanager/nonresource/implementation/NonResourceClientImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ private static final class HttpResponseImpl extends HttpResponse {
272272
super(null);
273273
this.statusCode = statusCode;
274274
this.httpHeaders = httpHeaders;
275-
this.responseBody = responseBody == null ? null : responseBody.getBytes(StandardCharsets.UTF_8);
275+
this.responseBody = responseBody == null ? new byte[0] : responseBody.getBytes(StandardCharsets.UTF_8);
276276
}
277277

278278
public int getStatusCode() {

0 commit comments

Comments
 (0)