Bugzilla – Attachment 122333 Details for
Bug 23653
Plack fails when http://swagger.io/v2/schema.json is unavailable and schema cache missing
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 23653: [19.11] use local copy of swagger v2 schema
Bug-23653-1911-use-local-copy-of-swagger-v2-schema.patch (text/plain), 45.70 KB, created by
Jonathan Druart
on 2021-06-23 13:26:28 UTC
(
hide
)
Description:
Bug 23653: [19.11] use local copy of swagger v2 schema
Filename:
MIME Type:
Creator:
Jonathan Druart
Created:
2021-06-23 13:26:28 UTC
Size:
45.70 KB
patch
obsolete
>From d1e14279a31c728491861bf109fdc9a333fdfae2 Mon Sep 17 00:00:00 2001 >From: David Cook <dcook@prosentient.com.au> >Date: Wed, 1 Jul 2020 02:26:01 +0000 >Subject: [PATCH] Bug 23653: [19.11] use local copy of swagger v2 schema > >By default, JSON::Validator::OpenAPI tries to fetch the >swagger v2 schema from http://swagger.io/v2/schema.json. > >If you've installed from CPAN, JSON::Validator::OpenAPI will >come with a cached copy, so it won't try to fetch it over HTTP. > >However, if you've installed from libjson-validator-perl >from Debian/Ubuntu, the Debian package excludes the cached copy, >so JSON::Validator::OpenAPI tries to fetch it over HTTP. > >Unfortunately, today and other days in the past, the file at >http://swagger.io/v2/schema.json has been unavailable, and this causes >Koha to crash in a perpetual loop. > >This patch includes a copy of the swagger v2 schema, and it loads >it locally rather than fetching over HTTP. > >The changes to Koha/REST/Plugin/PluginRoutes.pm are not required, >since the validator isn't currently called there, but I've added >a patch to future proof it. > >To Test: >0a) Remove /usr/share/perl5/JSON/Validator/cache/36d1bd12eeed51e86c8695bd8876a9df >if it exists >0b) Block external access to http://swagger.io/v2/schema.json or >test during an outage when it's unavailable >0c) Do not apply patch >1) koha-plack --restart kohadev >2) Note that it crashes in a loop and is unavailable in web browser >3) Apply patch >4) koha-plack --restart kohadev >5) Note that Koha comes up and there are no errors in the Plack logs > >Signed-off-by: Victor Grousset/tuxayo <victor@tuxayo.net> >Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> >--- > Koha/REST/Plugin/PluginRoutes.pm | 20 +- > Koha/REST/V1.pm | 3 + > api/swagger-v2-schema.json | 1607 ++++++++++++++++++++++++++++++ > 3 files changed, 1624 insertions(+), 6 deletions(-) > create mode 100644 api/swagger-v2-schema.json > >diff --git a/Koha/REST/Plugin/PluginRoutes.pm b/Koha/REST/Plugin/PluginRoutes.pm >index 273d5df7086..d32374d52ea 100644 >--- a/Koha/REST/Plugin/PluginRoutes.pm >+++ b/Koha/REST/Plugin/PluginRoutes.pm >@@ -48,16 +48,21 @@ sub register { > if ( C4::Context->preference('UseKohaPlugins') > && C4::Context->config("enable_plugins") ) > { >+ my $schema = $app->home->rel_file("api/swagger-v2-schema.json"); >+ if ($schema){ >+ $self->{'swagger-v2-schema'} = $schema; >+ } >+ > # plugin needs to define a namespace > @plugins = Koha::Plugins->new()->GetPlugins( > { > method => 'api_namespace', > } > ); >- } > >- foreach my $plugin ( @plugins ) { >- $spec = inject_routes( $spec, $plugin, $validator ); >+ foreach my $plugin ( @plugins ) { >+ $spec = $self->inject_routes( $spec, $plugin, $validator ); >+ } > } > > return $spec; >@@ -68,12 +73,12 @@ sub register { > =cut > > sub inject_routes { >- my ( $spec, $plugin, $validator ) = @_; >+ my ( $self, $spec, $plugin, $validator ) = @_; > > return try { > > my $backup_spec = merge_spec( clone($spec), $plugin ); >- if ( spec_ok( $backup_spec, $validator ) ) { >+ if ( $self->spec_ok( $backup_spec, $validator ) ) { > $spec = merge_spec( $spec, $plugin ); > } > else { >@@ -137,13 +142,16 @@ sub merge_spec { > =cut > > sub spec_ok { >- my ( $spec, $validator ) = @_; >+ my ( $self, $spec, $validator ) = @_; >+ >+ my $schema = $self->{'swagger-v2-schema'}; > > return try { > $validator->load_and_validate_schema( > $spec, > { > allow_invalid_ref => 1, >+ schema => ( $schema ) ? $schema : undef, > } > ); > return 1; >diff --git a/Koha/REST/V1.pm b/Koha/REST/V1.pm >index b1f4657d4ae..5d12cdf56f8 100644 >--- a/Koha/REST/V1.pm >+++ b/Koha/REST/V1.pm >@@ -58,10 +58,12 @@ sub startup { > } > > my $validator = JSON::Validator::OpenAPI::Mojolicious->new; >+ my $swagger_schema = $self->home->rel_file("api/swagger-v2-schema.json"); > $validator->load_and_validate_schema( > $self->home->rel_file("api/v1/swagger/swagger.json"), > { > allow_invalid_ref => 1, >+ schema => ( $swagger_schema ) ? $swagger_schema : undef, > } > ); > >@@ -79,6 +81,7 @@ sub startup { > OpenAPI => { > spec => $spec, > route => $self->routes->under('/api/v1')->to('Auth#under'), >+ schema => ( $swagger_schema ) ? $swagger_schema : undef, > allow_invalid_ref => > 1, # required by our spec because $ref directly under > # Paths-, Parameters-, Definitions- & Info-object >diff --git a/api/swagger-v2-schema.json b/api/swagger-v2-schema.json >new file mode 100644 >index 00000000000..a92e18f2a5a >--- /dev/null >+++ b/api/swagger-v2-schema.json >@@ -0,0 +1,1607 @@ >+{ >+ "title": "A JSON Schema for Swagger 2.0 API.", >+ "id": "http://swagger.io/v2/schema.json#", >+ "$schema": "http://json-schema.org/draft-04/schema#", >+ "type": "object", >+ "required": [ >+ "swagger", >+ "info", >+ "paths" >+ ], >+ "additionalProperties": false, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ }, >+ "properties": { >+ "swagger": { >+ "type": "string", >+ "enum": [ >+ "2.0" >+ ], >+ "description": "The Swagger version of this document." >+ }, >+ "info": { >+ "$ref": "#/definitions/info" >+ }, >+ "host": { >+ "type": "string", >+ "pattern": "^[^{}/ :\\\\]+(?::\\d+)?$", >+ "description": "The host (name or ip) of the API. Example: 'swagger.io'" >+ }, >+ "basePath": { >+ "type": "string", >+ "pattern": "^/", >+ "description": "The base path to the API. Example: '/api'." >+ }, >+ "schemes": { >+ "$ref": "#/definitions/schemesList" >+ }, >+ "consumes": { >+ "description": "A list of MIME types accepted by the API.", >+ "allOf": [ >+ { >+ "$ref": "#/definitions/mediaTypeList" >+ } >+ ] >+ }, >+ "produces": { >+ "description": "A list of MIME types the API can produce.", >+ "allOf": [ >+ { >+ "$ref": "#/definitions/mediaTypeList" >+ } >+ ] >+ }, >+ "paths": { >+ "$ref": "#/definitions/paths" >+ }, >+ "definitions": { >+ "$ref": "#/definitions/definitions" >+ }, >+ "parameters": { >+ "$ref": "#/definitions/parameterDefinitions" >+ }, >+ "responses": { >+ "$ref": "#/definitions/responseDefinitions" >+ }, >+ "security": { >+ "$ref": "#/definitions/security" >+ }, >+ "securityDefinitions": { >+ "$ref": "#/definitions/securityDefinitions" >+ }, >+ "tags": { >+ "type": "array", >+ "items": { >+ "$ref": "#/definitions/tag" >+ }, >+ "uniqueItems": true >+ }, >+ "externalDocs": { >+ "$ref": "#/definitions/externalDocs" >+ } >+ }, >+ "definitions": { >+ "info": { >+ "type": "object", >+ "description": "General information about the API.", >+ "required": [ >+ "version", >+ "title" >+ ], >+ "additionalProperties": false, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ }, >+ "properties": { >+ "title": { >+ "type": "string", >+ "description": "A unique and precise title of the API." >+ }, >+ "version": { >+ "type": "string", >+ "description": "A semantic version number of the API." >+ }, >+ "description": { >+ "type": "string", >+ "description": "A longer description of the API. Should be different from the title. GitHub Flavored Markdown is allowed." >+ }, >+ "termsOfService": { >+ "type": "string", >+ "description": "The terms of service for the API." >+ }, >+ "contact": { >+ "$ref": "#/definitions/contact" >+ }, >+ "license": { >+ "$ref": "#/definitions/license" >+ } >+ } >+ }, >+ "contact": { >+ "type": "object", >+ "description": "Contact information for the owners of the API.", >+ "additionalProperties": false, >+ "properties": { >+ "name": { >+ "type": "string", >+ "description": "The identifying name of the contact person/organization." >+ }, >+ "url": { >+ "type": "string", >+ "description": "The URL pointing to the contact information.", >+ "format": "uri" >+ }, >+ "email": { >+ "type": "string", >+ "description": "The email address of the contact person/organization.", >+ "format": "email" >+ } >+ }, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ } >+ }, >+ "license": { >+ "type": "object", >+ "required": [ >+ "name" >+ ], >+ "additionalProperties": false, >+ "properties": { >+ "name": { >+ "type": "string", >+ "description": "The name of the license type. It's encouraged to use an OSI compatible license." >+ }, >+ "url": { >+ "type": "string", >+ "description": "The URL pointing to the license.", >+ "format": "uri" >+ } >+ }, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ } >+ }, >+ "paths": { >+ "type": "object", >+ "description": "Relative paths to the individual endpoints. They must be relative to the 'basePath'.", >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ }, >+ "^/": { >+ "$ref": "#/definitions/pathItem" >+ } >+ }, >+ "additionalProperties": false >+ }, >+ "definitions": { >+ "type": "object", >+ "additionalProperties": { >+ "$ref": "#/definitions/schema" >+ }, >+ "description": "One or more JSON objects describing the schemas being consumed and produced by the API." >+ }, >+ "parameterDefinitions": { >+ "type": "object", >+ "additionalProperties": { >+ "$ref": "#/definitions/parameter" >+ }, >+ "description": "One or more JSON representations for parameters" >+ }, >+ "responseDefinitions": { >+ "type": "object", >+ "additionalProperties": { >+ "$ref": "#/definitions/response" >+ }, >+ "description": "One or more JSON representations for responses" >+ }, >+ "externalDocs": { >+ "type": "object", >+ "additionalProperties": false, >+ "description": "information about external documentation", >+ "required": [ >+ "url" >+ ], >+ "properties": { >+ "description": { >+ "type": "string" >+ }, >+ "url": { >+ "type": "string", >+ "format": "uri" >+ } >+ }, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ } >+ }, >+ "examples": { >+ "type": "object", >+ "additionalProperties": true >+ }, >+ "mimeType": { >+ "type": "string", >+ "description": "The MIME type of the HTTP message." >+ }, >+ "operation": { >+ "type": "object", >+ "required": [ >+ "responses" >+ ], >+ "additionalProperties": false, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ }, >+ "properties": { >+ "tags": { >+ "type": "array", >+ "items": { >+ "type": "string" >+ }, >+ "uniqueItems": true >+ }, >+ "summary": { >+ "type": "string", >+ "description": "A brief summary of the operation." >+ }, >+ "description": { >+ "type": "string", >+ "description": "A longer description of the operation, GitHub Flavored Markdown is allowed." >+ }, >+ "externalDocs": { >+ "$ref": "#/definitions/externalDocs" >+ }, >+ "operationId": { >+ "type": "string", >+ "description": "A unique identifier of the operation." >+ }, >+ "produces": { >+ "description": "A list of MIME types the API can produce.", >+ "allOf": [ >+ { >+ "$ref": "#/definitions/mediaTypeList" >+ } >+ ] >+ }, >+ "consumes": { >+ "description": "A list of MIME types the API can consume.", >+ "allOf": [ >+ { >+ "$ref": "#/definitions/mediaTypeList" >+ } >+ ] >+ }, >+ "parameters": { >+ "$ref": "#/definitions/parametersList" >+ }, >+ "responses": { >+ "$ref": "#/definitions/responses" >+ }, >+ "schemes": { >+ "$ref": "#/definitions/schemesList" >+ }, >+ "deprecated": { >+ "type": "boolean", >+ "default": false >+ }, >+ "security": { >+ "$ref": "#/definitions/security" >+ } >+ } >+ }, >+ "pathItem": { >+ "type": "object", >+ "additionalProperties": false, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ }, >+ "properties": { >+ "$ref": { >+ "type": "string" >+ }, >+ "get": { >+ "$ref": "#/definitions/operation" >+ }, >+ "put": { >+ "$ref": "#/definitions/operation" >+ }, >+ "post": { >+ "$ref": "#/definitions/operation" >+ }, >+ "delete": { >+ "$ref": "#/definitions/operation" >+ }, >+ "options": { >+ "$ref": "#/definitions/operation" >+ }, >+ "head": { >+ "$ref": "#/definitions/operation" >+ }, >+ "patch": { >+ "$ref": "#/definitions/operation" >+ }, >+ "parameters": { >+ "$ref": "#/definitions/parametersList" >+ } >+ } >+ }, >+ "responses": { >+ "type": "object", >+ "description": "Response objects names can either be any valid HTTP status code or 'default'.", >+ "minProperties": 1, >+ "additionalProperties": false, >+ "patternProperties": { >+ "^([0-9]{3})$|^(default)$": { >+ "$ref": "#/definitions/responseValue" >+ }, >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ }, >+ "not": { >+ "type": "object", >+ "additionalProperties": false, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ } >+ } >+ }, >+ "responseValue": { >+ "oneOf": [ >+ { >+ "$ref": "#/definitions/response" >+ }, >+ { >+ "$ref": "#/definitions/jsonReference" >+ } >+ ] >+ }, >+ "response": { >+ "type": "object", >+ "required": [ >+ "description" >+ ], >+ "properties": { >+ "description": { >+ "type": "string" >+ }, >+ "schema": { >+ "oneOf": [ >+ { >+ "$ref": "#/definitions/schema" >+ }, >+ { >+ "$ref": "#/definitions/fileSchema" >+ } >+ ] >+ }, >+ "headers": { >+ "$ref": "#/definitions/headers" >+ }, >+ "examples": { >+ "$ref": "#/definitions/examples" >+ } >+ }, >+ "additionalProperties": false, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ } >+ }, >+ "headers": { >+ "type": "object", >+ "additionalProperties": { >+ "$ref": "#/definitions/header" >+ } >+ }, >+ "header": { >+ "type": "object", >+ "additionalProperties": false, >+ "required": [ >+ "type" >+ ], >+ "properties": { >+ "type": { >+ "type": "string", >+ "enum": [ >+ "string", >+ "number", >+ "integer", >+ "boolean", >+ "array" >+ ] >+ }, >+ "format": { >+ "type": "string" >+ }, >+ "items": { >+ "$ref": "#/definitions/primitivesItems" >+ }, >+ "collectionFormat": { >+ "$ref": "#/definitions/collectionFormat" >+ }, >+ "default": { >+ "$ref": "#/definitions/default" >+ }, >+ "maximum": { >+ "$ref": "#/definitions/maximum" >+ }, >+ "exclusiveMaximum": { >+ "$ref": "#/definitions/exclusiveMaximum" >+ }, >+ "minimum": { >+ "$ref": "#/definitions/minimum" >+ }, >+ "exclusiveMinimum": { >+ "$ref": "#/definitions/exclusiveMinimum" >+ }, >+ "maxLength": { >+ "$ref": "#/definitions/maxLength" >+ }, >+ "minLength": { >+ "$ref": "#/definitions/minLength" >+ }, >+ "pattern": { >+ "$ref": "#/definitions/pattern" >+ }, >+ "maxItems": { >+ "$ref": "#/definitions/maxItems" >+ }, >+ "minItems": { >+ "$ref": "#/definitions/minItems" >+ }, >+ "uniqueItems": { >+ "$ref": "#/definitions/uniqueItems" >+ }, >+ "enum": { >+ "$ref": "#/definitions/enum" >+ }, >+ "multipleOf": { >+ "$ref": "#/definitions/multipleOf" >+ }, >+ "description": { >+ "type": "string" >+ } >+ }, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ } >+ }, >+ "vendorExtension": { >+ "description": "Any property starting with x- is valid.", >+ "additionalProperties": true, >+ "additionalItems": true >+ }, >+ "bodyParameter": { >+ "type": "object", >+ "required": [ >+ "name", >+ "in", >+ "schema" >+ ], >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ }, >+ "properties": { >+ "description": { >+ "type": "string", >+ "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." >+ }, >+ "name": { >+ "type": "string", >+ "description": "The name of the parameter." >+ }, >+ "in": { >+ "type": "string", >+ "description": "Determines the location of the parameter.", >+ "enum": [ >+ "body" >+ ] >+ }, >+ "required": { >+ "type": "boolean", >+ "description": "Determines whether or not this parameter is required or optional.", >+ "default": false >+ }, >+ "schema": { >+ "$ref": "#/definitions/schema" >+ } >+ }, >+ "additionalProperties": false >+ }, >+ "headerParameterSubSchema": { >+ "additionalProperties": false, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ }, >+ "properties": { >+ "required": { >+ "type": "boolean", >+ "description": "Determines whether or not this parameter is required or optional.", >+ "default": false >+ }, >+ "in": { >+ "type": "string", >+ "description": "Determines the location of the parameter.", >+ "enum": [ >+ "header" >+ ] >+ }, >+ "description": { >+ "type": "string", >+ "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." >+ }, >+ "name": { >+ "type": "string", >+ "description": "The name of the parameter." >+ }, >+ "type": { >+ "type": "string", >+ "enum": [ >+ "string", >+ "number", >+ "boolean", >+ "integer", >+ "array" >+ ] >+ }, >+ "format": { >+ "type": "string" >+ }, >+ "items": { >+ "$ref": "#/definitions/primitivesItems" >+ }, >+ "collectionFormat": { >+ "$ref": "#/definitions/collectionFormat" >+ }, >+ "default": { >+ "$ref": "#/definitions/default" >+ }, >+ "maximum": { >+ "$ref": "#/definitions/maximum" >+ }, >+ "exclusiveMaximum": { >+ "$ref": "#/definitions/exclusiveMaximum" >+ }, >+ "minimum": { >+ "$ref": "#/definitions/minimum" >+ }, >+ "exclusiveMinimum": { >+ "$ref": "#/definitions/exclusiveMinimum" >+ }, >+ "maxLength": { >+ "$ref": "#/definitions/maxLength" >+ }, >+ "minLength": { >+ "$ref": "#/definitions/minLength" >+ }, >+ "pattern": { >+ "$ref": "#/definitions/pattern" >+ }, >+ "maxItems": { >+ "$ref": "#/definitions/maxItems" >+ }, >+ "minItems": { >+ "$ref": "#/definitions/minItems" >+ }, >+ "uniqueItems": { >+ "$ref": "#/definitions/uniqueItems" >+ }, >+ "enum": { >+ "$ref": "#/definitions/enum" >+ }, >+ "multipleOf": { >+ "$ref": "#/definitions/multipleOf" >+ } >+ } >+ }, >+ "queryParameterSubSchema": { >+ "additionalProperties": false, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ }, >+ "properties": { >+ "required": { >+ "type": "boolean", >+ "description": "Determines whether or not this parameter is required or optional.", >+ "default": false >+ }, >+ "in": { >+ "type": "string", >+ "description": "Determines the location of the parameter.", >+ "enum": [ >+ "query" >+ ] >+ }, >+ "description": { >+ "type": "string", >+ "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." >+ }, >+ "name": { >+ "type": "string", >+ "description": "The name of the parameter." >+ }, >+ "allowEmptyValue": { >+ "type": "boolean", >+ "default": false, >+ "description": "allows sending a parameter by name only or with an empty value." >+ }, >+ "type": { >+ "type": "string", >+ "enum": [ >+ "string", >+ "number", >+ "boolean", >+ "integer", >+ "array" >+ ] >+ }, >+ "format": { >+ "type": "string" >+ }, >+ "items": { >+ "$ref": "#/definitions/primitivesItems" >+ }, >+ "collectionFormat": { >+ "$ref": "#/definitions/collectionFormatWithMulti" >+ }, >+ "default": { >+ "$ref": "#/definitions/default" >+ }, >+ "maximum": { >+ "$ref": "#/definitions/maximum" >+ }, >+ "exclusiveMaximum": { >+ "$ref": "#/definitions/exclusiveMaximum" >+ }, >+ "minimum": { >+ "$ref": "#/definitions/minimum" >+ }, >+ "exclusiveMinimum": { >+ "$ref": "#/definitions/exclusiveMinimum" >+ }, >+ "maxLength": { >+ "$ref": "#/definitions/maxLength" >+ }, >+ "minLength": { >+ "$ref": "#/definitions/minLength" >+ }, >+ "pattern": { >+ "$ref": "#/definitions/pattern" >+ }, >+ "maxItems": { >+ "$ref": "#/definitions/maxItems" >+ }, >+ "minItems": { >+ "$ref": "#/definitions/minItems" >+ }, >+ "uniqueItems": { >+ "$ref": "#/definitions/uniqueItems" >+ }, >+ "enum": { >+ "$ref": "#/definitions/enum" >+ }, >+ "multipleOf": { >+ "$ref": "#/definitions/multipleOf" >+ } >+ } >+ }, >+ "formDataParameterSubSchema": { >+ "additionalProperties": false, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ }, >+ "properties": { >+ "required": { >+ "type": "boolean", >+ "description": "Determines whether or not this parameter is required or optional.", >+ "default": false >+ }, >+ "in": { >+ "type": "string", >+ "description": "Determines the location of the parameter.", >+ "enum": [ >+ "formData" >+ ] >+ }, >+ "description": { >+ "type": "string", >+ "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." >+ }, >+ "name": { >+ "type": "string", >+ "description": "The name of the parameter." >+ }, >+ "allowEmptyValue": { >+ "type": "boolean", >+ "default": false, >+ "description": "allows sending a parameter by name only or with an empty value." >+ }, >+ "type": { >+ "type": "string", >+ "enum": [ >+ "string", >+ "number", >+ "boolean", >+ "integer", >+ "array", >+ "file" >+ ] >+ }, >+ "format": { >+ "type": "string" >+ }, >+ "items": { >+ "$ref": "#/definitions/primitivesItems" >+ }, >+ "collectionFormat": { >+ "$ref": "#/definitions/collectionFormatWithMulti" >+ }, >+ "default": { >+ "$ref": "#/definitions/default" >+ }, >+ "maximum": { >+ "$ref": "#/definitions/maximum" >+ }, >+ "exclusiveMaximum": { >+ "$ref": "#/definitions/exclusiveMaximum" >+ }, >+ "minimum": { >+ "$ref": "#/definitions/minimum" >+ }, >+ "exclusiveMinimum": { >+ "$ref": "#/definitions/exclusiveMinimum" >+ }, >+ "maxLength": { >+ "$ref": "#/definitions/maxLength" >+ }, >+ "minLength": { >+ "$ref": "#/definitions/minLength" >+ }, >+ "pattern": { >+ "$ref": "#/definitions/pattern" >+ }, >+ "maxItems": { >+ "$ref": "#/definitions/maxItems" >+ }, >+ "minItems": { >+ "$ref": "#/definitions/minItems" >+ }, >+ "uniqueItems": { >+ "$ref": "#/definitions/uniqueItems" >+ }, >+ "enum": { >+ "$ref": "#/definitions/enum" >+ }, >+ "multipleOf": { >+ "$ref": "#/definitions/multipleOf" >+ } >+ } >+ }, >+ "pathParameterSubSchema": { >+ "additionalProperties": false, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ }, >+ "required": [ >+ "required" >+ ], >+ "properties": { >+ "required": { >+ "type": "boolean", >+ "enum": [ >+ true >+ ], >+ "description": "Determines whether or not this parameter is required or optional." >+ }, >+ "in": { >+ "type": "string", >+ "description": "Determines the location of the parameter.", >+ "enum": [ >+ "path" >+ ] >+ }, >+ "description": { >+ "type": "string", >+ "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." >+ }, >+ "name": { >+ "type": "string", >+ "description": "The name of the parameter." >+ }, >+ "type": { >+ "type": "string", >+ "enum": [ >+ "string", >+ "number", >+ "boolean", >+ "integer", >+ "array" >+ ] >+ }, >+ "format": { >+ "type": "string" >+ }, >+ "items": { >+ "$ref": "#/definitions/primitivesItems" >+ }, >+ "collectionFormat": { >+ "$ref": "#/definitions/collectionFormat" >+ }, >+ "default": { >+ "$ref": "#/definitions/default" >+ }, >+ "maximum": { >+ "$ref": "#/definitions/maximum" >+ }, >+ "exclusiveMaximum": { >+ "$ref": "#/definitions/exclusiveMaximum" >+ }, >+ "minimum": { >+ "$ref": "#/definitions/minimum" >+ }, >+ "exclusiveMinimum": { >+ "$ref": "#/definitions/exclusiveMinimum" >+ }, >+ "maxLength": { >+ "$ref": "#/definitions/maxLength" >+ }, >+ "minLength": { >+ "$ref": "#/definitions/minLength" >+ }, >+ "pattern": { >+ "$ref": "#/definitions/pattern" >+ }, >+ "maxItems": { >+ "$ref": "#/definitions/maxItems" >+ }, >+ "minItems": { >+ "$ref": "#/definitions/minItems" >+ }, >+ "uniqueItems": { >+ "$ref": "#/definitions/uniqueItems" >+ }, >+ "enum": { >+ "$ref": "#/definitions/enum" >+ }, >+ "multipleOf": { >+ "$ref": "#/definitions/multipleOf" >+ } >+ } >+ }, >+ "nonBodyParameter": { >+ "type": "object", >+ "required": [ >+ "name", >+ "in", >+ "type" >+ ], >+ "oneOf": [ >+ { >+ "$ref": "#/definitions/headerParameterSubSchema" >+ }, >+ { >+ "$ref": "#/definitions/formDataParameterSubSchema" >+ }, >+ { >+ "$ref": "#/definitions/queryParameterSubSchema" >+ }, >+ { >+ "$ref": "#/definitions/pathParameterSubSchema" >+ } >+ ] >+ }, >+ "parameter": { >+ "oneOf": [ >+ { >+ "$ref": "#/definitions/bodyParameter" >+ }, >+ { >+ "$ref": "#/definitions/nonBodyParameter" >+ } >+ ] >+ }, >+ "schema": { >+ "type": "object", >+ "description": "A deterministic version of a JSON Schema object.", >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ }, >+ "properties": { >+ "$ref": { >+ "type": "string" >+ }, >+ "format": { >+ "type": "string" >+ }, >+ "title": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/title" >+ }, >+ "description": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/description" >+ }, >+ "default": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/default" >+ }, >+ "multipleOf": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" >+ }, >+ "maximum": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" >+ }, >+ "exclusiveMaximum": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" >+ }, >+ "minimum": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" >+ }, >+ "exclusiveMinimum": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" >+ }, >+ "maxLength": { >+ "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" >+ }, >+ "minLength": { >+ "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" >+ }, >+ "pattern": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" >+ }, >+ "maxItems": { >+ "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" >+ }, >+ "minItems": { >+ "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" >+ }, >+ "uniqueItems": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" >+ }, >+ "maxProperties": { >+ "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" >+ }, >+ "minProperties": { >+ "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" >+ }, >+ "required": { >+ "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" >+ }, >+ "enum": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" >+ }, >+ "additionalProperties": { >+ "anyOf": [ >+ { >+ "$ref": "#/definitions/schema" >+ }, >+ { >+ "type": "boolean" >+ } >+ ], >+ "default": {} >+ }, >+ "type": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/type" >+ }, >+ "items": { >+ "anyOf": [ >+ { >+ "$ref": "#/definitions/schema" >+ }, >+ { >+ "type": "array", >+ "minItems": 1, >+ "items": { >+ "$ref": "#/definitions/schema" >+ } >+ } >+ ], >+ "default": {} >+ }, >+ "allOf": { >+ "type": "array", >+ "minItems": 1, >+ "items": { >+ "$ref": "#/definitions/schema" >+ } >+ }, >+ "properties": { >+ "type": "object", >+ "additionalProperties": { >+ "$ref": "#/definitions/schema" >+ }, >+ "default": {} >+ }, >+ "discriminator": { >+ "type": "string" >+ }, >+ "readOnly": { >+ "type": "boolean", >+ "default": false >+ }, >+ "xml": { >+ "$ref": "#/definitions/xml" >+ }, >+ "externalDocs": { >+ "$ref": "#/definitions/externalDocs" >+ }, >+ "example": {} >+ }, >+ "additionalProperties": false >+ }, >+ "fileSchema": { >+ "type": "object", >+ "description": "A deterministic version of a JSON Schema object.", >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ }, >+ "required": [ >+ "type" >+ ], >+ "properties": { >+ "format": { >+ "type": "string" >+ }, >+ "title": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/title" >+ }, >+ "description": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/description" >+ }, >+ "default": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/default" >+ }, >+ "required": { >+ "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" >+ }, >+ "type": { >+ "type": "string", >+ "enum": [ >+ "file" >+ ] >+ }, >+ "readOnly": { >+ "type": "boolean", >+ "default": false >+ }, >+ "externalDocs": { >+ "$ref": "#/definitions/externalDocs" >+ }, >+ "example": {} >+ }, >+ "additionalProperties": false >+ }, >+ "primitivesItems": { >+ "type": "object", >+ "additionalProperties": false, >+ "properties": { >+ "type": { >+ "type": "string", >+ "enum": [ >+ "string", >+ "number", >+ "integer", >+ "boolean", >+ "array" >+ ] >+ }, >+ "format": { >+ "type": "string" >+ }, >+ "items": { >+ "$ref": "#/definitions/primitivesItems" >+ }, >+ "collectionFormat": { >+ "$ref": "#/definitions/collectionFormat" >+ }, >+ "default": { >+ "$ref": "#/definitions/default" >+ }, >+ "maximum": { >+ "$ref": "#/definitions/maximum" >+ }, >+ "exclusiveMaximum": { >+ "$ref": "#/definitions/exclusiveMaximum" >+ }, >+ "minimum": { >+ "$ref": "#/definitions/minimum" >+ }, >+ "exclusiveMinimum": { >+ "$ref": "#/definitions/exclusiveMinimum" >+ }, >+ "maxLength": { >+ "$ref": "#/definitions/maxLength" >+ }, >+ "minLength": { >+ "$ref": "#/definitions/minLength" >+ }, >+ "pattern": { >+ "$ref": "#/definitions/pattern" >+ }, >+ "maxItems": { >+ "$ref": "#/definitions/maxItems" >+ }, >+ "minItems": { >+ "$ref": "#/definitions/minItems" >+ }, >+ "uniqueItems": { >+ "$ref": "#/definitions/uniqueItems" >+ }, >+ "enum": { >+ "$ref": "#/definitions/enum" >+ }, >+ "multipleOf": { >+ "$ref": "#/definitions/multipleOf" >+ } >+ }, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ } >+ }, >+ "security": { >+ "type": "array", >+ "items": { >+ "$ref": "#/definitions/securityRequirement" >+ }, >+ "uniqueItems": true >+ }, >+ "securityRequirement": { >+ "type": "object", >+ "additionalProperties": { >+ "type": "array", >+ "items": { >+ "type": "string" >+ }, >+ "uniqueItems": true >+ } >+ }, >+ "xml": { >+ "type": "object", >+ "additionalProperties": false, >+ "properties": { >+ "name": { >+ "type": "string" >+ }, >+ "namespace": { >+ "type": "string" >+ }, >+ "prefix": { >+ "type": "string" >+ }, >+ "attribute": { >+ "type": "boolean", >+ "default": false >+ }, >+ "wrapped": { >+ "type": "boolean", >+ "default": false >+ } >+ }, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ } >+ }, >+ "tag": { >+ "type": "object", >+ "additionalProperties": false, >+ "required": [ >+ "name" >+ ], >+ "properties": { >+ "name": { >+ "type": "string" >+ }, >+ "description": { >+ "type": "string" >+ }, >+ "externalDocs": { >+ "$ref": "#/definitions/externalDocs" >+ } >+ }, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ } >+ }, >+ "securityDefinitions": { >+ "type": "object", >+ "additionalProperties": { >+ "oneOf": [ >+ { >+ "$ref": "#/definitions/basicAuthenticationSecurity" >+ }, >+ { >+ "$ref": "#/definitions/apiKeySecurity" >+ }, >+ { >+ "$ref": "#/definitions/oauth2ImplicitSecurity" >+ }, >+ { >+ "$ref": "#/definitions/oauth2PasswordSecurity" >+ }, >+ { >+ "$ref": "#/definitions/oauth2ApplicationSecurity" >+ }, >+ { >+ "$ref": "#/definitions/oauth2AccessCodeSecurity" >+ } >+ ] >+ } >+ }, >+ "basicAuthenticationSecurity": { >+ "type": "object", >+ "additionalProperties": false, >+ "required": [ >+ "type" >+ ], >+ "properties": { >+ "type": { >+ "type": "string", >+ "enum": [ >+ "basic" >+ ] >+ }, >+ "description": { >+ "type": "string" >+ } >+ }, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ } >+ }, >+ "apiKeySecurity": { >+ "type": "object", >+ "additionalProperties": false, >+ "required": [ >+ "type", >+ "name", >+ "in" >+ ], >+ "properties": { >+ "type": { >+ "type": "string", >+ "enum": [ >+ "apiKey" >+ ] >+ }, >+ "name": { >+ "type": "string" >+ }, >+ "in": { >+ "type": "string", >+ "enum": [ >+ "header", >+ "query" >+ ] >+ }, >+ "description": { >+ "type": "string" >+ } >+ }, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ } >+ }, >+ "oauth2ImplicitSecurity": { >+ "type": "object", >+ "additionalProperties": false, >+ "required": [ >+ "type", >+ "flow", >+ "authorizationUrl" >+ ], >+ "properties": { >+ "type": { >+ "type": "string", >+ "enum": [ >+ "oauth2" >+ ] >+ }, >+ "flow": { >+ "type": "string", >+ "enum": [ >+ "implicit" >+ ] >+ }, >+ "scopes": { >+ "$ref": "#/definitions/oauth2Scopes" >+ }, >+ "authorizationUrl": { >+ "type": "string", >+ "format": "uri" >+ }, >+ "description": { >+ "type": "string" >+ } >+ }, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ } >+ }, >+ "oauth2PasswordSecurity": { >+ "type": "object", >+ "additionalProperties": false, >+ "required": [ >+ "type", >+ "flow", >+ "tokenUrl" >+ ], >+ "properties": { >+ "type": { >+ "type": "string", >+ "enum": [ >+ "oauth2" >+ ] >+ }, >+ "flow": { >+ "type": "string", >+ "enum": [ >+ "password" >+ ] >+ }, >+ "scopes": { >+ "$ref": "#/definitions/oauth2Scopes" >+ }, >+ "tokenUrl": { >+ "type": "string", >+ "format": "uri" >+ }, >+ "description": { >+ "type": "string" >+ } >+ }, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ } >+ }, >+ "oauth2ApplicationSecurity": { >+ "type": "object", >+ "additionalProperties": false, >+ "required": [ >+ "type", >+ "flow", >+ "tokenUrl" >+ ], >+ "properties": { >+ "type": { >+ "type": "string", >+ "enum": [ >+ "oauth2" >+ ] >+ }, >+ "flow": { >+ "type": "string", >+ "enum": [ >+ "application" >+ ] >+ }, >+ "scopes": { >+ "$ref": "#/definitions/oauth2Scopes" >+ }, >+ "tokenUrl": { >+ "type": "string", >+ "format": "uri" >+ }, >+ "description": { >+ "type": "string" >+ } >+ }, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ } >+ }, >+ "oauth2AccessCodeSecurity": { >+ "type": "object", >+ "additionalProperties": false, >+ "required": [ >+ "type", >+ "flow", >+ "authorizationUrl", >+ "tokenUrl" >+ ], >+ "properties": { >+ "type": { >+ "type": "string", >+ "enum": [ >+ "oauth2" >+ ] >+ }, >+ "flow": { >+ "type": "string", >+ "enum": [ >+ "accessCode" >+ ] >+ }, >+ "scopes": { >+ "$ref": "#/definitions/oauth2Scopes" >+ }, >+ "authorizationUrl": { >+ "type": "string", >+ "format": "uri" >+ }, >+ "tokenUrl": { >+ "type": "string", >+ "format": "uri" >+ }, >+ "description": { >+ "type": "string" >+ } >+ }, >+ "patternProperties": { >+ "^x-": { >+ "$ref": "#/definitions/vendorExtension" >+ } >+ } >+ }, >+ "oauth2Scopes": { >+ "type": "object", >+ "additionalProperties": { >+ "type": "string" >+ } >+ }, >+ "mediaTypeList": { >+ "type": "array", >+ "items": { >+ "$ref": "#/definitions/mimeType" >+ }, >+ "uniqueItems": true >+ }, >+ "parametersList": { >+ "type": "array", >+ "description": "The parameters needed to send a valid API call.", >+ "additionalItems": false, >+ "items": { >+ "oneOf": [ >+ { >+ "$ref": "#/definitions/parameter" >+ }, >+ { >+ "$ref": "#/definitions/jsonReference" >+ } >+ ] >+ }, >+ "uniqueItems": true >+ }, >+ "schemesList": { >+ "type": "array", >+ "description": "The transfer protocol of the API.", >+ "items": { >+ "type": "string", >+ "enum": [ >+ "http", >+ "https", >+ "ws", >+ "wss" >+ ] >+ }, >+ "uniqueItems": true >+ }, >+ "collectionFormat": { >+ "type": "string", >+ "enum": [ >+ "csv", >+ "ssv", >+ "tsv", >+ "pipes" >+ ], >+ "default": "csv" >+ }, >+ "collectionFormatWithMulti": { >+ "type": "string", >+ "enum": [ >+ "csv", >+ "ssv", >+ "tsv", >+ "pipes", >+ "multi" >+ ], >+ "default": "csv" >+ }, >+ "title": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/title" >+ }, >+ "description": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/description" >+ }, >+ "default": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/default" >+ }, >+ "multipleOf": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" >+ }, >+ "maximum": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" >+ }, >+ "exclusiveMaximum": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" >+ }, >+ "minimum": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" >+ }, >+ "exclusiveMinimum": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" >+ }, >+ "maxLength": { >+ "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" >+ }, >+ "minLength": { >+ "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" >+ }, >+ "pattern": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" >+ }, >+ "maxItems": { >+ "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" >+ }, >+ "minItems": { >+ "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" >+ }, >+ "uniqueItems": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" >+ }, >+ "enum": { >+ "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" >+ }, >+ "jsonReference": { >+ "type": "object", >+ "required": [ >+ "$ref" >+ ], >+ "additionalProperties": false, >+ "properties": { >+ "$ref": { >+ "type": "string" >+ } >+ } >+ } >+ } >+} >\ No newline at end of file >-- >2.20.1
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 23653
:
106444
|
106445
|
107984
|
109095
|
109096
|
109113
|
109180
|
122333
|
122334
|
122335
|
122650
|
122651
|
122652
|
122662
|
122663
|
122664