[ 
https://issues.apache.org/jira/browse/SOLR-10413?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Steve Rowe updated SOLR-10413:
------------------------------
    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:

{noformat}
<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>
{noformat}

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}}: 

{noformat}
{
  "documentation": [...],
  "description": [...],
  "methods": [ "POST" ],
  "url": { "paths": [ "/cluster" ] },
  "commands": {
[...]
    "set-property": {
      "type": "object",
      "documentation": [...],
      "description": [...],
      "properties": {
        "name": { "type": "string",  "description": [...] },
        "val": { "type": "string", "description": [...] }
[...]
{noformat}

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.

  was:
v2 API requests 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:

{noformat}
<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>
{noformat}

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}}: 

{noformat}
{
  "documentation": [...],
  "description": [...],
  "methods": [ "POST" ],
  "url": { "paths": [ "/cluster" ] },
  "commands": {
[...]
    "set-property": {
      "type": "object",
      "documentation": [...],
      "description": [...],
      "properties": {
        "name": { "type": "string",  "description": [...] },
        "val": { "type": "string", "description": [...] }
[...]
{noformat}

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.


> v2 API: parsed JSON type should be coerced to expected type
> -----------------------------------------------------------
>
>                 Key: SOLR-10413
>                 URL: https://issues.apache.org/jira/browse/SOLR-10413
>             Project: Solr
>          Issue Type: Bug
>      Security Level: Public(Default Security Level. Issues are Public) 
>          Components: v2 API
>            Reporter: Steve Rowe
>            Priority: Minor
>
> 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:
> {noformat}
> <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>
> {noformat}
> 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}}: 
> {noformat}
> {
>   "documentation": [...],
>   "description": [...],
>   "methods": [ "POST" ],
>   "url": { "paths": [ "/cluster" ] },
>   "commands": {
> [...]
>     "set-property": {
>       "type": "object",
>       "documentation": [...],
>       "description": [...],
>       "properties": {
>         "name": { "type": "string",  "description": [...] },
>         "val": { "type": "string", "description": [...] }
> [...]
> {noformat}
> 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.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to