Description
v2 API request bodies are parsed as JSON and are checked via JSON schema for the correct types. But since the JSON parser used (noggit) accepts a relaxed form of JSON, it is weirdly necessary to quote some things but not others.
For example, after bin/solr start -e cloud -noprompt, curl http://localhost:8983/v2/cluster -H 'Content-type: application/json' -d '{ set-property: { name: autoAddReplicas, val: false } }' returns:
<html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> <title>Error 400 {metadata={error-class=org.apache.solr.api.ApiBag$ExceptionWithErrObject,root-error-class=org.apache.solr.api.ApiBag$ExceptionWithErrObject},errorMessages=[{set-property={name=autoAddReplicas, val=false}, errorMessages=[Expected type : string but found : falsein object : false]}],msg=Error in command payload,code=400}</title> </head> <body><h2>HTTP ERROR 400</h2> <p>Problem accessing /solr/____v2/cluster. Reason: <pre> {metadata={error-class=org.apache.solr.api.ApiBag$ExceptionWithErrObject,root-error-class=org.apache.solr.api.ApiBag$ExceptionWithErrObject},errorMessages=[{set-property={name=autoAddReplicas, val=false}, errorMessages=[Expected type : string but found : falsein object : false]}],msg=Error in command payload,code=400}</pre></p> </body> </html>
By contrast, if I quote the propery value, the request succeeds: curl http://localhost:8983/v2/cluster -H 'Content-type: application/json' -d '{ set-property: { name: autoAddReplicas, val: "false" } }'
This is annoying because the property is semantically boolean, even though cluster properties' keys and values are always typed String.
This error occurs because the API spec for the v2 Cluster API's set-property command requires string typed values - from solr/core/src/resources/apispec/cluster.Commands.json:
{ "documentation": [...], "description": [...], "methods": [ "POST" ], "url": { "paths": [ "/cluster" ] }, "commands": { [...] "set-property": { "type": "object", "documentation": [...], "description": [...], "properties": { "name": { "type": "string", "description": [...] }, "val": { "type": "string", "description": [...] } [...]
I'm not sure how wide-spread the problem is, but at a minimum for this particular API (setting a cluster property), Solr should accept both keys and values of any (JSON) type and just toString() their values.