Uploaded image for project: 'Solr'
  1. Solr
  2. SOLR-10413

v2 API: parsed JSON type should be coerced to expected type

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Minor
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 7.0
    • Component/s: v2 API
    • Security Level: Public (Default Security Level. Issues are Public)
    • Labels:
      None

      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.

        Attachments

        1. SOLR-10413.patch
          24 kB
          Cao Manh Dat
        2. SOLR-10413.patch
          23 kB
          Noble Paul
        3. SOLR-10413.patch
          23 kB
          Cao Manh Dat

          Activity

            People

            • Assignee:
              caomanhdat Cao Manh Dat
              Reporter:
              steve_rowe Steve Rowe
            • Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: