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

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

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Minor
    • Resolution: Fixed
    • None
    • 7.0
    • v2 API
    • 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

            caomanhdat Cao Manh Dat
            sarowe Steven Rowe
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: