Skip to content

Commit eca2fc5

Browse files
committed
fix(clients): valid JSON on empty body, assert empty body on DELETE requests
1 parent 1d2669a commit eca2fc5

File tree

7 files changed

+21
-20
lines changed

7 files changed

+21
-20
lines changed

clients/algoliasearch-client-java-2/algoliasearch-core/src/main/java/com/algolia/ApiClient.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,8 @@ public RequestBody serialize(Object obj) throws AlgoliaRuntimeException {
244244
throw new AlgoliaRuntimeException(e);
245245
}
246246
} else {
247-
content = null;
247+
// An empty body is defaulted to "{}" to match an empty JSON object
248+
content = "{}";
248249
}
249250

250251
return RequestBody.create(content, MediaType.parse(this.contentType));
@@ -343,16 +344,10 @@ public Request buildRequest(
343344
processHeaderParams(headerParams, hasRequestOptions ? requestOptions.getExtraHeaders() : null, reqBuilder);
344345

345346
RequestBody reqBody;
346-
if (!HttpMethod.permitsRequestBody(method)) {
347+
// We rely on `permitsRequestBody` to tell us if we should provide a body, but
348+
// we also set is for DELETE methods
349+
if (!HttpMethod.permitsRequestBody(method) || (method.equals("DELETE") && body == null)) {
347350
reqBody = null;
348-
} else if (body == null) {
349-
if ("DELETE".equals(method)) {
350-
// allow calling DELETE without sending a request body
351-
reqBody = null;
352-
} else {
353-
// use an empty request body (for POST, PUT and PATCH)
354-
reqBody = RequestBody.create("", MediaType.parse(this.contentType));
355-
}
356351
} else {
357352
reqBody = serialize(body);
358353
}

clients/algoliasearch-client-php/lib/RetryStrategy/ApiWrapper.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -277,10 +277,10 @@ private function createRequest(
277277
$protocolVersion = '1.1'
278278
) {
279279
if (is_array($body)) {
280-
// Send an empty body instead of "[]" in case there are
281-
// no content/params to send
282-
if (empty($body)) {
283-
$body = '';
280+
// `DELETE` methods does not have a body, but for other methods it needs
281+
// to be a valid JSON object
282+
if ($method != 'DELETE' && empty($body)) {
283+
$body = '{}';
284284
} else {
285285
$body = \json_encode($body, $this->jsonOptions);
286286
if (JSON_ERROR_NONE !== json_last_error()) {

config/generation.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ module.exports = {
2727
'!clients/algoliasearch-client-javascript/packages/algoliasearch/jest.config.ts',
2828

2929
// PHP
30-
'!clients/algoliasearch-client-php/*',
30+
'!clients/algoliasearch-client-php/**',
3131
'clients/algoliasearch-client-php/lib/Api/*',
3232
'clients/algoliasearch-client-php/lib/Model/**',
3333
'clients/algoliasearch-client-php/lib/Configuration/*',

generators/src/main/java/com/algolia/codegen/cts/tests/Request.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class RequestProp {
5252
public String method;
5353

5454
@JsonDeserialize(using = RawDeserializer.class)
55-
public String body;
55+
public String body = "{}";
5656

5757
@JsonDeserialize(using = RawDeserializer.class)
5858
public String queryParameters;

generators/src/main/java/com/algolia/codegen/cts/tests/TestsRequest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ public void run(Map<String, CodegenModel> models, Map<String, CodegenOperation>
6060
test.put("method", operationId);
6161
test.put("testName", req.testName == null ? operationId : req.testName);
6262
test.put("testIndex", i);
63+
64+
// `GET` and `DELETE` methods don't have a body
65+
if (req.request.method.equals("GET") || req.request.method.equals("DELETE")) {
66+
req.request.body = null;
67+
}
68+
6369
test.put("request", req.request);
6470
test.put("hasParameters", req.parameters.size() != 0);
6571

templates/java/tests/requests/requests.mustache

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,14 @@ class {{client}}RequestsTests {
6666

6767
assertEquals(req.path, "{{{request.path}}}");
6868
assertEquals(req.method, "{{{request.method}}}");
69-
7069
{{#request.body}}
7170
assertDoesNotThrow(() -> {
7271
JSONAssert.assertEquals("{{#lambda.escapeQuotes}}{{{request.body}}}{{/lambda.escapeQuotes}}", req.body, JSONCompareMode.STRICT);
7372
});
7473
{{/request.body}}
74+
{{^request.body}}
75+
assertEquals(req.body, null);
76+
{{/request.body}}
7577

7678
{{#request.queryParameters}}
7779
try {

templates/php/tests/requests/requests.mustache

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,7 @@ class {{clientPrefix}}Test extends TestCase implements HttpClientInterface
114114
[
115115
"path" => "{{{request.path}}}",
116116
"method" => "{{{request.method}}}",
117-
{{#request.body}}
118-
"body" => json_decode("{{#lambda.escapeQuotes}}{{{request.body}}}{{/lambda.escapeQuotes}}"),
119-
{{/request.body}}
117+
"body" => {{#request.body}}json_decode("{{#lambda.escapeQuotes}}{{{request.body}}}{{/lambda.escapeQuotes}}"){{/request.body}}{{^request.body}}null{{/request.body}},
120118
{{#request.queryParameters}}
121119
"queryParameters" => json_decode("{{#lambda.escapeQuotes}}{{{request.queryParameters}}}{{/lambda.escapeQuotes}}", true),
122120
{{/request.queryParameters}}

0 commit comments

Comments
 (0)