azure-sdk-for-java: [BUG] ConsumptionManager.usageDetails fails with 400 Bad Request

Simple request to get all usage details within a specified time range fails with 400 Bad Request.

Code snippet that reproduces the problem:

<dependency>
  <groupId>com.azure.resourcemanager</groupId>
  <artifactId>azure-resourcemanager-consumption</artifactId>
  <version>1.0.0-beta.1</version>
</dependency>
ClientSecretCredential cred = new ClientSecretCredentialBuilder()
  .tenantId("[tenantId]")
  .clientId("[clientId]")
  .clientSecret("[clientSecret]")
  .build();

ConsumptionManager consumptionManager = ConsumptionManager.authenticate(cred, new AzureProfile(AzureEnvironment.AZURE));

String scope = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
String filter = "properties/usageStart ge '2021-07-01T00:00:00Z' and properties/usageEnd le '2021-07-01T23:59:59Z'";

List<UsageDetail> usageDetails = consumptionManager.usageDetails().list(
  scope, 
  null, // expand
  filter, 
  null, // skiptoken
  null, // top
  null, // metric
  null // context
).stream().collect(Collectors.toList());

This issue can be reproduced only when the server returns 2 or more pages. My investigation shows that filter parameter is not properly url_encoded for second page request. I can also reproduce this issue for other methods that accept filter parameter: consumptionManager.marketplaces(), etc.

About this issue

  • Original URL
  • State: open
  • Created 3 years ago
  • Reactions: 1
  • Comments: 16 (9 by maintainers)

Most upvoted comments

@XiaofeiCao Seems they still have space in nextLink URL and it is malformed. Please add “service attention” label.

Also ping their release owner https://github.com/Azure/sdk-release-request/issues/2291

@XiaofeiCao Here you go

[ForkJoinPool.commonPool-worker-9] INFO com.azure.resourcemanager.consumption.implementation.UsageDetailsClientImpl$UsageDetailsService.list - {"az.sdk.message":"HTTP request","method":"GET","url":"https://management.azure.com//subscriptions/xxx-xxx/providers/Microsoft.Consumption/usageDetails?$expand=properties/usageStart%20ge%20%272021-11-01%27%20and%20properties/usageEnd%20lt%20%272021-12-01%27&api-version=2021-10-01&metric=REDACTED","tryCount":"1","contentLength":0}
[reactor-http-kqueue-20] INFO com.azure.resourcemanager.consumption.implementation.UsageDetailsClientImpl$UsageDetailsService.list - {"az.sdk.message":"HTTP response","contentLength":"2624310","statusCode":200,"url":"https://management.azure.com//subscriptions/xxx-xxx/providers/Microsoft.Consumption/usageDetails?$expand=properties/usageStart%20ge%20%272021-11-01%27%20and%20properties/usageEnd%20lt%20%272021-12-01%27&api-version=2021-10-01&metric=REDACTED","durationMs":11523}
[Thread-0] INFO com.azure.resourcemanager.consumption.implementation.UsageDetailsClientImpl$UsageDetailsService.listNext - {"az.sdk.message":"HTTP request","method":"GET","url":"https://management.azure.com/subscriptions/xxx-xxx/providers/Microsoft.Consumption/usageDetails?$expand=properties/usageStart ge '2021-11-01' and properties/usageEnd lt '2021-12-01'&api-version=2021-10-01&metric=REDACTED&sessiontoken=REDACTED&$skiptoken=317C313030307C313030307C46616C73657C547275657C30&skiptokenver=v1&id=REDACTED","tryCount":"1","contentLength":0}
[reactor-http-kqueue-20] WARN com.azure.core.implementation.serializer.HttpResponseBodyDecoder - Failed to deserialize the error entity.
Unexpected character ('<' (code 60)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
 at [Source: (byte[])"<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request</h2>
<hr><p>HTTP Error 400. The request is badly formed.</p>
</BODY></HTML>
"; line: 1, column: 2]
[reactor-http-kqueue-20] INFO com.azure.resourcemanager.consumption.implementation.UsageDetailsClientImpl$UsageDetailsService.listNext - {"az.sdk.message":"HTTP response","contentLength":"311","statusCode":400,"url":"https://management.azure.com/subscriptions/xxx-xxx/providers/Microsoft.Consumption/usageDetails?$expand=properties/usageStart ge '2021-11-01' and properties/usageEnd lt '2021-12-01'&api-version=2021-10-01&metric=REDACTED&sessiontoken=REDACTED&$skiptoken=317C313030307C313030307C46616C73657C547275657C30&skiptokenver=v1&id=REDACTED","durationMs":13,"body":"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\"http://www.w3.org/TR/html4/strict.dtd\">\r\n<HTML><HEAD><TITLE>Bad Request</TITLE>\r\n<META HTTP-EQUIV=\"Content-Type\" Content=\"text/html; charset=us-ascii\"></HEAD>\r\n<BODY><h2>Bad Request</h2>\r\n<hr><p>HTTP Error 400. The request is badly formed.</p>\r\n</BODY></HTML>\r\n"}