JSON Payload Inspection

Any suggestion on above ?

@saloni512 Do you intend to pass an empty request body?

Because the result “error”: “JSON parsing error: EOF” is the expected output.

For checking both string and json on the same path, the type has to be specified below:

"schema": {
	"type": ["string", "object"]
}

For more information on validating schemas, please visit the json-schema.org

Just to be clear, I have two use case:

  1. Either there will not be any body
  2. Or it will be JSON

SO my requirement is if no body then by pass If body is there then validate the JSON format.

I tried as per the above suggestion but no luck. Below is my API definition, Please suggest If I can achieve this:

{
“name”: “CGW-key-header”,
“slug”: “CGW-key-header”,
“listen_port”: 0,
“protocol”: “”,
“enable_proxy_protocol”: false,
“api_id”: “CGW-key-header”,
“org_id”: “3”,
“use_keyless”: false,
“use_oauth2”: false,
“use_openid”: false,
“openid_options”: {
“providers”: null,
“segregate_by_client”: false
},
“oauth_meta”: {
“allowed_access_types”: null,
“allowed_authorize_types”: null,
“auth_login_redirect”: “”
},
“auth”: {
“use_param”: false,
“param_name”: “”,
“use_cookie”: false,
“cookie_name”: “”,
“auth_header_name”: “Authorization”,
“use_certificate”: false,
“validate_signature”: false,
“signature”: {
“algorithm”: “”,
“header”: “”,
“secret”: “”,
“allowed_clock_skew”: 0,
“error_code”: 0,
“error_message”: “”
}
},
“auth_configs”: null,
“use_basic_auth”: false,
“basic_auth”: {
“disable_caching”: false,
“cache_ttl”: 0,
“extract_from_body”: false,
“body_user_regexp”: “”,
“body_password_regexp”: “”
},
“use_mutual_tls_auth”: false,
“client_certificates”: null,
“upstream_certificates”: null,
“pinned_public_keys”: null,
“enable_jwt”: false,
“use_standard_auth”: false,
“use_go_plugin_auth”: false,
“enable_coprocess_auth”: false,
“jwt_signing_method”: “”,
“jwt_source”: “”,
“jwt_identity_base_field”: “”,
“jwt_client_base_field”: “”,
“jwt_policy_field_name”: “”,
“jwt_default_policies”: null,
“jwt_issued_at_validation_skew”: 0,
“jwt_expires_at_validation_skew”: 0,
“jwt_not_before_validation_skew”: 0,
“jwt_skip_kid”: false,
“jwt_scope_to_policy_mapping”: null,
“jwt_scope_claim_name”: “”,
“notifications”: {
“shared_secret”: “”,
“oauth_on_keychange_url”: “”
},
“enable_signature_checking”: false,
“hmac_allowed_clock_skew”: 0,
“hmac_allowed_algorithms”: null,
“request_signing”: {
“is_enabled”: false,
“secret”: “”,
“key_id”: “”,
“algorithm”: “”,
“header_list”: null,
“certificate_id”: “”,
“signature_header”: “”
},
“base_identity_provided_by”: “”,
“definition”: {
“location”: “header”,
“key”: “x-api-version”,
“strip_path”: false
},
“version_data”: {
“not_versioned”: true,
“default_version”: “”,
“versions”: {
“Default”: {
“name”: “Default”,
“expires”: “”,
“paths”: {
“ignored”: null,
“white_list”: null,
“black_list”: null
},
“use_extended_paths”: true,
“extended_paths”: {
“validate_json”: [{
“method”: “GET”,
“path”: “/”,
“schema”: {
“type”: [“string”, “object”]

},

    "error_response_code": 422

}

]

},

    "global_headers": {

“Authorization”: “Basic Y2liYWRtaW46YWRtaW4=”
},
“global_headers_remove”: [“Authorization”],
“global_response_headers”: null,
“global_response_headers_remove”: null,
“ignore_endpoint_case”: false,
“global_size_limit”: 0,
“override_target”: “”
}
}
},
“uptime_tests”: {
“check_list”: null,
“config”: {
“expire_utime_after”: 0,
“service_discovery”: {
“use_discovery_service”: false,
“query_endpoint”: “”,
“use_nested_query”: false,
“parent_data_path”: “”,
“data_path”: “”,
“port_data_path”: “”,
“target_path”: “”,
“use_target_list”: false,
“cache_timeout”: 0,
“endpoint_returns_list”: false
},
“recheck_wait”: 0
}
},
“proxy”: {
“preserve_host_header”: false,
“listen_path”: “/CloudGateway/rest/”,
“target_url”: “https://54.254.102.140:9443”,
“disable_strip_slash”: false,
“strip_listen_path”: false,
“enable_load_balancing”: false,
“target_list”: null,
“check_host_against_uptime_tests”: false,
“service_discovery”: {
“use_discovery_service”: false,
“query_endpoint”: “”,
“use_nested_query”: false,
“parent_data_path”: “”,
“data_path”: “”,
“port_data_path”: “”,
“target_path”: “”,
“use_target_list”: false,
“cache_timeout”: 0,
“endpoint_returns_list”: false
},
“transport”: {
“ssl_insecure_skip_verify”: false,
“ssl_ciphers”: null,
“ssl_min_version”: 0,
“ssl_max_version”: 0,
“ssl_force_common_name_check”: false,
“proxy_url”: “”
}
},
“disable_rate_limit”: false,
“disable_quota”: false,
“custom_middleware”: {
“pre”: null,
“post”: null,
“post_key_auth”: null,
“auth_check”: {
“name”: “”,
“path”: “”,
“require_session”: false,
“raw_body_only”: false
},
“response”: null,
“driver”: “”,
“id_extractor”: {
“extract_from”: “”,
“extract_with”: “”,
“extractor_config”: null
}
},
“custom_middleware_bundle”: “”,
“cache_options”: {
“cache_timeout”: 0,
“enable_cache”: false,
“cache_all_safe_requests”: false,
“cache_response_codes”: null,
“enable_upstream_cache_control”: false,
“cache_control_ttl_header”: “”,
“cache_by_headers”: null
},
“session_lifetime”: 0,
“active”: true,
“internal”: false,
“auth_provider”: {
“name”: “”,
“storage_engine”: “”,
“meta”: null
},
“session_provider”: {
“name”: “”,
“storage_engine”: “”,
“meta”: null
},
“event_handlers”: {
“events”: null
},
“enable_batch_request_support”: false,
“enable_ip_whitelisting”: false,
“allowed_ips”: null,
“enable_ip_blacklisting”: false,
“blacklisted_ips”: null,
“dont_set_quota_on_create”: false,
“expire_analytics_after”: 0,
“response_processors”: null,
“CORS”: {
“enable”: false,
“allowed_origins”: null,
“allowed_methods”: null,
“allowed_headers”: null,
“exposed_headers”: null,
“allow_credentials”: false,
“max_age”: 0,
“options_passthrough”: false,
“debug”: false
},
“domain”: “”,
“certificates”: null,
“do_not_track”: false,
“tags”: null,
“enable_context_vars”: false,
“config_data”: null,
“tag_headers”: null,
“global_rate_limit”: {
“rate”: 0,
“per”: 0
},
“strip_auth_data”: false,
“enable_detailed_recording”: false,
“graphql”: {
“enabled”: false,
“execution_mode”: “”,
“version”: “”,
“schema”: “”,
“type_field_configurations”: null,
“playground”: {
“enabled”: false,
“path”: “”
},
“engine”: {
“field_configs”: null,
“data_sources”: null
}
}
}

I don’t know too much of JSON schema validation, but from what I can tell, I do not think it is possible to achieve that with just the schema alone (since there is no empty datatype). Maybe someone else from the community can contribute to this.

That being said, a possible solution could be the use of URL Rewrite. You could have a URL Rewrite check the payload if it matches empty or a certain data type and then forward the request to the appropriate endpoint that can handle the schema validation.

I have orchestrated a sample below that uses the URL rewrite feature to forward a request to an endpoint with the following requirements:

  1. If empty body/payload, then forward the request to “…/empty-request”
  2. If JSON body/payload (or if body starts with “{”), then forward the request to “…/json-request”
  3. If any other type of payload, then forward request (or fallback) to “…/any-other-request”
"versions": {
        "Default": {
          "name": "Default",
          "expires": "",
          "paths": {
            "ignored": [],
            "white_list": [],
            "black_list": []
          },
          "use_extended_paths": true,
          "global_headers": {},
          "global_headers_remove": [],
          "global_response_headers": {},
          "global_response_headers_remove": [],
          "ignore_endpoint_case": false,
          "global_size_limit": 0,
          "override_target": "",
          "extended_paths": {
            "track_endpoints": [
              {
                "path": "/empty-request",
                "method": "GET"
              }
            ],
            "url_rewrites": [
              {
                "path": "",
                "method": "GET",
                "match_pattern": "",
                "rewrite_to": "http://httpbin.org/anything/any-other-request",
                "triggers": [
                  {
                    "on": "all",
                    "options": {
                      "payload_matches": {
                        "match_rx": "^{",
                        "reverse": false
                      },
                      "query_val_matches": {},
                      "header_matches": {},
                      "path_part_matches": {},
                      "session_meta_matches": {},
                      "request_context_matches": {}
                    },
                    "rewrite_to": "json-request/"
                  },
                  {
                    "on": "all",
                    "options": {
                      "payload_matches": {
                        "match_rx": ".",
                        "reverse": true
                      },
                      "query_val_matches": {},
                      "header_matches": {},
                      "path_part_matches": {},
                      "session_meta_matches": {},
                      "request_context_matches": {}
                    },
                    "rewrite_to": "empty-request/"
                  }
                ]
              }
            ]
          }
        }
      }

Please do not just copy and paste this sample section of API definition into yours. This is just a starter sample of how you can achieve your end goal. You need to understand how URL rewrite can be fully integrated in your requirements.