+1 Penghui
On Wed, Jun 22, 2022 at 10:53 AM Yubiao Feng <yubiao.f...@streamnative.io.invalid> wrote: > Hi, Pulsar community: > > I open a pip to discuss "Support the admin API to check unknown request > parameters" > > Proposal Link: https://github.com/apache/pulsar/issues/16135 > > ### Motivation > > The design of the Admin API is now such that if an incorrect parameter name > is submitted, this property (if not required) will be ignored, then > execution continues, and the response is “204 Success”. This will trick the > user into thinking the setup succeeded when it didn't correctly as expected > in some cases, as shown below: > > User POST request to /{tenant}/{namespace}/{topic}/retention" with > incorrect parameter: > ```json > {"retention_size_in_mb":-1,"retention_time_in_minutes":40320} > ``` > > Which should have been this: > > ```json > {"retentionSizeInMB":-1,"retentionTimeInMinutes":40320} > ``` > > Response: > > ```http > HTTP/1.1 204 No Content > Date: Mon, 20 Jun 2022 02:54:25 GMT > broker-address: 127.0.0.1 > Server: Jetty(9.4.44.v20210927) > ``` > > We can provide an optional mechanism: "fail (HTTP status 400 bad requests) > on unknown request parameters". > > ## Goal > > - scope: > - ~~Path variables~~(no need for change): This represents the domain. > The current API has been validated, so no additional modifications are > required. > - ~~Query params~~(no support on this proposal): I haven't found an > elegant way to do it yet, so this proposal does not include Query Param > validation. > - *Entity properties*: This proposal only handles requests whose > Content-type is "application/json" (in fact, this is the only type in our > project). > - Configurable(Support dynamic switching). > > > ## Approach > > When parsing the request body, any unknown property is considered a bad > request. The [Jackson unknown property rule]( > > https://github.com/FasterXML/jackson-databind/blob/de3d0ecbc1fd0a1a6b061e62a198b3ba0d0d163e/src/main/java/com/fasterxml/jackson/databind/DeserializationFeature.java#L121 > ) > is adopted: > > - Case sensitive. > - Special characters are not ignored. > - Do not trim Spaces. > > If the check fails, return a text/plain response with 400 code. Like this: > > ```http > HTTP/1.1 400 Bad Request > Date: Mon, 20 Jun 2022 03:52:10 GMT > broker-address: 127.0.0.1 > Content-Type: text/plain > Content-Length: 432 > Server: Jetty(9.4.44.v20210927) > > Unrecognized field "retention_size_in_mb" (class > org.apache.pulsar.common.policies.data.RetentionPolicies known properties: > "retentionSizeInMB", "retentionTimeInMinutes"]) > ``` > > ## Configuration Changes > > broker.conf > > ```properties > # Admin API fail on unknown request parameter in request-body. see PIP-178. > Setting this to blank means that this feature is turned off. > httpRequestsFailOnUnknownPropertiesEnabled=false > ``` > > ## Dynamic switching > Enabling this feature affects all of the broker's HTTP services, including > the following: > > - /status.html (no post-entity request) > - /admin [v2,v3] > - /lookup (no post-entity request) > - /topics (http client) > - /metrics (no post-entity request) > > Because of the number of apis involved, we provide dynamic configuration. > When a user discovers any problem, it can be turned on and off dynamically > using the Admin API(without restarting Broker), which can reduce impact. > > Note: Since admin api v1 is no longer maintained, this feature does not > affect this part of the functionality. > > ```shell > pulsar-admin brokers update-dynamic-config --config > httpRequestsFailOnUnknownPropertiesEnabled --value [boolean] > ``` > > Thanks > Yubiao Feng >