mirror of
https://github.com/valitydev/openapi-generator.git
synced 2024-11-08 03:18:53 +00:00
Improve checking of JSON MIME
This commit is contained in:
parent
b896c9169a
commit
4fdaeb7371
@ -86,6 +86,15 @@ module {{moduleName}}
|
|||||||
Typhoeus::Request.new(url, req_opts)
|
Typhoeus::Request.new(url, req_opts)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Check if the given MIME is a JSON MIME.
|
||||||
|
# JSON MIME examples:
|
||||||
|
# application/json
|
||||||
|
# application/json; charset=UTF8
|
||||||
|
# APPLICATION/JSON
|
||||||
|
def json_mime?(mime)
|
||||||
|
!!(mime =~ /\Aapplication\/json(;.*)?\z/i)
|
||||||
|
end
|
||||||
|
|
||||||
# Deserialize the response to the given return type.
|
# Deserialize the response to the given return type.
|
||||||
#
|
#
|
||||||
# @param [String] return_type some examples: "User", "Array[User]", "Hash[String,Integer]"
|
# @param [String] return_type some examples: "User", "Array[User]", "Hash[String,Integer]"
|
||||||
@ -99,9 +108,7 @@ module {{moduleName}}
|
|||||||
# ensuring a default content type
|
# ensuring a default content type
|
||||||
content_type = response.headers['Content-Type'] || 'application/json'
|
content_type = response.headers['Content-Type'] || 'application/json'
|
||||||
|
|
||||||
unless content_type.start_with?('application/json')
|
fail "Content-Type is not supported: #{content_type}" unless json_mime?(content_type)
|
||||||
fail "Content-Type is not supported: #{content_type}"
|
|
||||||
end
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
data = JSON.parse("[#{body}]", :symbolize_names => true)[0]
|
data = JSON.parse("[#{body}]", :symbolize_names => true)[0]
|
||||||
@ -228,26 +235,21 @@ module {{moduleName}}
|
|||||||
# @param [Array] accepts array for Accept
|
# @param [Array] accepts array for Accept
|
||||||
# @return [String] the Accept header (e.g. application/json)
|
# @return [String] the Accept header (e.g. application/json)
|
||||||
def select_header_accept(accepts)
|
def select_header_accept(accepts)
|
||||||
if accepts.empty?
|
return nil if accepts.nil? || accepts.empty?
|
||||||
return
|
# use JSON when present, otherwise use all of the provided
|
||||||
elsif accepts.any?{ |s| s.casecmp('application/json') == 0 }
|
json_accept = accepts.find { |s| json_mime?(s) }
|
||||||
'application/json' # look for json data by default
|
return json_accept || accepts.join(',')
|
||||||
else
|
|
||||||
accepts.join(',')
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Return Content-Type header based on an array of content types provided.
|
# Return Content-Type header based on an array of content types provided.
|
||||||
# @param [Array] content_types array for Content-Type
|
# @param [Array] content_types array for Content-Type
|
||||||
# @return [String] the Content-Type header (e.g. application/json)
|
# @return [String] the Content-Type header (e.g. application/json)
|
||||||
def select_header_content_type(content_types)
|
def select_header_content_type(content_types)
|
||||||
if content_types.empty?
|
# use application/json by default
|
||||||
'application/json' # use application/json by default
|
return 'application/json' if content_types.nil? || content_types.empty?
|
||||||
elsif content_types.any?{ |s| s.casecmp('application/json')==0 }
|
# use JSON when present, otherwise use the first one
|
||||||
'application/json' # use application/json if it's included
|
json_content_type = content_types.find { |s| json_mime?(s) }
|
||||||
else
|
return json_content_type || content_types.first
|
||||||
content_types[0] # otherwise, use the first one
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Convert object (array, hash, object, etc) to JSON string.
|
# Convert object (array, hash, object, etc) to JSON string.
|
||||||
|
@ -86,6 +86,15 @@ module Petstore
|
|||||||
Typhoeus::Request.new(url, req_opts)
|
Typhoeus::Request.new(url, req_opts)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Check if the given MIME is a JSON MIME.
|
||||||
|
# JSON MIME examples:
|
||||||
|
# application/json
|
||||||
|
# application/json; charset=UTF8
|
||||||
|
# APPLICATION/JSON
|
||||||
|
def json_mime?(mime)
|
||||||
|
!!(mime =~ /\Aapplication\/json(;.*)?\z/i)
|
||||||
|
end
|
||||||
|
|
||||||
# Deserialize the response to the given return type.
|
# Deserialize the response to the given return type.
|
||||||
#
|
#
|
||||||
# @param [String] return_type some examples: "User", "Array[User]", "Hash[String,Integer]"
|
# @param [String] return_type some examples: "User", "Array[User]", "Hash[String,Integer]"
|
||||||
@ -99,9 +108,7 @@ module Petstore
|
|||||||
# ensuring a default content type
|
# ensuring a default content type
|
||||||
content_type = response.headers['Content-Type'] || 'application/json'
|
content_type = response.headers['Content-Type'] || 'application/json'
|
||||||
|
|
||||||
unless content_type.start_with?('application/json')
|
fail "Content-Type is not supported: #{content_type}" unless json_mime?(content_type)
|
||||||
fail "Content-Type is not supported: #{content_type}"
|
|
||||||
end
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
data = JSON.parse("[#{body}]", :symbolize_names => true)[0]
|
data = JSON.parse("[#{body}]", :symbolize_names => true)[0]
|
||||||
@ -228,26 +235,21 @@ module Petstore
|
|||||||
# @param [Array] accepts array for Accept
|
# @param [Array] accepts array for Accept
|
||||||
# @return [String] the Accept header (e.g. application/json)
|
# @return [String] the Accept header (e.g. application/json)
|
||||||
def select_header_accept(accepts)
|
def select_header_accept(accepts)
|
||||||
if accepts.empty?
|
return nil if accepts.nil? || accepts.empty?
|
||||||
return
|
# use JSON when present, otherwise use all of the provided
|
||||||
elsif accepts.any?{ |s| s.casecmp('application/json') == 0 }
|
json_accept = accepts.find { |s| json_mime?(s) }
|
||||||
'application/json' # look for json data by default
|
return json_accept || accepts.join(',')
|
||||||
else
|
|
||||||
accepts.join(',')
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Return Content-Type header based on an array of content types provided.
|
# Return Content-Type header based on an array of content types provided.
|
||||||
# @param [Array] content_types array for Content-Type
|
# @param [Array] content_types array for Content-Type
|
||||||
# @return [String] the Content-Type header (e.g. application/json)
|
# @return [String] the Content-Type header (e.g. application/json)
|
||||||
def select_header_content_type(content_types)
|
def select_header_content_type(content_types)
|
||||||
if content_types.empty?
|
# use application/json by default
|
||||||
'application/json' # use application/json by default
|
return 'application/json' if content_types.nil? || content_types.empty?
|
||||||
elsif content_types.any?{ |s| s.casecmp('application/json')==0 }
|
# use JSON when present, otherwise use the first one
|
||||||
'application/json' # use application/json if it's included
|
json_content_type = content_types.find { |s| json_mime?(s) }
|
||||||
else
|
return json_content_type || content_types.first
|
||||||
content_types[0] # otherwise, use the first one
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Convert object (array, hash, object, etc) to JSON string.
|
# Convert object (array, hash, object, etc) to JSON string.
|
||||||
|
@ -145,4 +145,51 @@ describe Petstore::ApiClient do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#json_mime?" do
|
||||||
|
let(:api_client) { Petstore::ApiClient.new }
|
||||||
|
|
||||||
|
it "works" do
|
||||||
|
api_client.json_mime?(nil).should == false
|
||||||
|
api_client.json_mime?('').should == false
|
||||||
|
|
||||||
|
api_client.json_mime?('application/json').should == true
|
||||||
|
api_client.json_mime?('application/json; charset=UTF8').should == true
|
||||||
|
api_client.json_mime?('APPLICATION/JSON').should == true
|
||||||
|
|
||||||
|
api_client.json_mime?('application/xml').should == false
|
||||||
|
api_client.json_mime?('text/plain').should == false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#select_header_accept" do
|
||||||
|
let(:api_client) { Petstore::ApiClient.new }
|
||||||
|
|
||||||
|
it "works" do
|
||||||
|
api_client.select_header_accept(nil).should == nil
|
||||||
|
api_client.select_header_accept([]).should == nil
|
||||||
|
|
||||||
|
api_client.select_header_accept(['application/json']).should == 'application/json'
|
||||||
|
api_client.select_header_accept(['application/xml', 'application/json; charset=UTF8']).should == 'application/json; charset=UTF8'
|
||||||
|
api_client.select_header_accept(['APPLICATION/JSON', 'text/html']).should == 'APPLICATION/JSON'
|
||||||
|
|
||||||
|
api_client.select_header_accept(['application/xml']).should == 'application/xml'
|
||||||
|
api_client.select_header_accept(['text/html', 'application/xml']).should == 'text/html,application/xml'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#select_header_content_type" do
|
||||||
|
let(:api_client) { Petstore::ApiClient.new }
|
||||||
|
|
||||||
|
it "works" do
|
||||||
|
api_client.select_header_content_type(nil).should == 'application/json'
|
||||||
|
api_client.select_header_content_type([]).should == 'application/json'
|
||||||
|
|
||||||
|
api_client.select_header_content_type(['application/json']).should == 'application/json'
|
||||||
|
api_client.select_header_content_type(['application/xml', 'application/json; charset=UTF8']).should == 'application/json; charset=UTF8'
|
||||||
|
api_client.select_header_content_type(['APPLICATION/JSON', 'text/html']).should == 'APPLICATION/JSON'
|
||||||
|
api_client.select_header_content_type(['application/xml']).should == 'application/xml'
|
||||||
|
api_client.select_header_content_type(['text/plain', 'application/xml']).should == 'text/plain'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user