faraday_middleware_safeyaml 0.12.pre.safeyaml
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE.md +20 -0
- data/README.md +58 -0
- data/lib/faraday_middleware.rb +48 -0
- data/lib/faraday_middleware/addressable_patch.rb +20 -0
- data/lib/faraday_middleware/backwards_compatibility.rb +15 -0
- data/lib/faraday_middleware/gzip.rb +64 -0
- data/lib/faraday_middleware/instrumentation.rb +30 -0
- data/lib/faraday_middleware/rack_compatible.rb +86 -0
- data/lib/faraday_middleware/request/encode_json.rb +53 -0
- data/lib/faraday_middleware/request/method_override.rb +51 -0
- data/lib/faraday_middleware/request/oauth.rb +87 -0
- data/lib/faraday_middleware/request/oauth2.rb +85 -0
- data/lib/faraday_middleware/response/caching.rb +102 -0
- data/lib/faraday_middleware/response/chunked.rb +29 -0
- data/lib/faraday_middleware/response/follow_redirects.rb +134 -0
- data/lib/faraday_middleware/response/mashify.rb +37 -0
- data/lib/faraday_middleware/response/parse_dates.rb +39 -0
- data/lib/faraday_middleware/response/parse_json.rb +50 -0
- data/lib/faraday_middleware/response/parse_marshal.rb +13 -0
- data/lib/faraday_middleware/response/parse_xml.rb +15 -0
- data/lib/faraday_middleware/response/parse_yaml.rb +38 -0
- data/lib/faraday_middleware/response/rashify.rb +15 -0
- data/lib/faraday_middleware/response_middleware.rb +112 -0
- data/lib/faraday_middleware/version.rb +3 -0
- metadata +105 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
require "time"
|
2
|
+
require "faraday"
|
3
|
+
|
4
|
+
module FaradayMiddleware
|
5
|
+
# Parse dates from response body
|
6
|
+
class ParseDates < ::Faraday::Response::Middleware
|
7
|
+
ISO_DATE_FORMAT = /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|((\+|-)\d{2}:?\d{2}))\Z/m
|
8
|
+
|
9
|
+
def initialize(app, options = {})
|
10
|
+
@regexp = options[:match] || ISO_DATE_FORMAT
|
11
|
+
super(app)
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
response = @app.call(env)
|
16
|
+
parse_dates! response.env[:body]
|
17
|
+
response
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def parse_dates!(value)
|
23
|
+
case value
|
24
|
+
when Hash
|
25
|
+
value.each do |key, element|
|
26
|
+
value[key] = parse_dates!(element)
|
27
|
+
end
|
28
|
+
when Array
|
29
|
+
value.each_with_index do |element, index|
|
30
|
+
value[index] = parse_dates!(element)
|
31
|
+
end
|
32
|
+
when @regexp
|
33
|
+
Time.parse(value)
|
34
|
+
else
|
35
|
+
value
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'faraday_middleware/response_middleware'
|
2
|
+
|
3
|
+
module FaradayMiddleware
|
4
|
+
# Public: Parse response bodies as JSON.
|
5
|
+
class ParseJson < ResponseMiddleware
|
6
|
+
dependency do
|
7
|
+
require 'json' unless defined?(::JSON)
|
8
|
+
end
|
9
|
+
|
10
|
+
define_parser do |body|
|
11
|
+
::JSON.parse body unless body.strip.empty?
|
12
|
+
end
|
13
|
+
|
14
|
+
# Public: Override the content-type of the response with "application/json"
|
15
|
+
# if the response body looks like it might be JSON, i.e. starts with an
|
16
|
+
# open bracket.
|
17
|
+
#
|
18
|
+
# This is to fix responses from certain API providers that insist on serving
|
19
|
+
# JSON with wrong MIME-types such as "text/javascript".
|
20
|
+
class MimeTypeFix < ResponseMiddleware
|
21
|
+
MIME_TYPE = 'application/json'.freeze
|
22
|
+
|
23
|
+
def process_response(env)
|
24
|
+
old_type = env[:response_headers][CONTENT_TYPE].to_s
|
25
|
+
new_type = MIME_TYPE.dup
|
26
|
+
new_type << ';' << old_type.split(';', 2).last if old_type.index(';')
|
27
|
+
env[:response_headers][CONTENT_TYPE] = new_type
|
28
|
+
end
|
29
|
+
|
30
|
+
BRACKETS = %w- [ { -
|
31
|
+
WHITESPACE = [ " ", "\n", "\r", "\t" ]
|
32
|
+
|
33
|
+
def parse_response?(env)
|
34
|
+
super and BRACKETS.include? first_char(env[:body])
|
35
|
+
end
|
36
|
+
|
37
|
+
def first_char(body)
|
38
|
+
idx = -1
|
39
|
+
begin
|
40
|
+
char = body[idx += 1]
|
41
|
+
char = char.chr if char
|
42
|
+
end while char and WHITESPACE.include? char
|
43
|
+
char
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# deprecated alias
|
50
|
+
Faraday::Response::ParseJson = FaradayMiddleware::ParseJson
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'faraday_middleware/response_middleware'
|
2
|
+
|
3
|
+
module FaradayMiddleware
|
4
|
+
# Public: Restore marshalled Ruby objects in response bodies.
|
5
|
+
class ParseMarshal < ResponseMiddleware
|
6
|
+
define_parser do |body|
|
7
|
+
::Marshal.load body unless body.empty?
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# deprecated alias
|
13
|
+
Faraday::Response::ParseMarshal = FaradayMiddleware::ParseMarshal
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'faraday_middleware/response_middleware'
|
2
|
+
|
3
|
+
module FaradayMiddleware
|
4
|
+
# Public: parses response bodies with MultiXml.
|
5
|
+
class ParseXml < ResponseMiddleware
|
6
|
+
dependency 'multi_xml'
|
7
|
+
|
8
|
+
define_parser do |body|
|
9
|
+
::MultiXml.parse(body)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# deprecated alias
|
15
|
+
Faraday::Response::ParseXml = FaradayMiddleware::ParseXml
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'faraday_middleware/response_middleware'
|
2
|
+
|
3
|
+
module FaradayMiddleware
|
4
|
+
# Public: Parse response bodies as YAML.
|
5
|
+
#
|
6
|
+
# Warning: This is not backwards compatible with versions of this middleware prior to
|
7
|
+
# faraday_middleware v0.12 - prior to this version, we used YAML.load rather than
|
8
|
+
# YAMl.safe_load, which exposes serious remote code execution risks - see
|
9
|
+
# https://github.com/ruby/psych/issues/119 for details. If you're sure you can trust
|
10
|
+
# YAML you're passing, you can set up an unsafe version of this middleware as follows:
|
11
|
+
#
|
12
|
+
# class UnsafelyParseYaml < FaradayMiddleware::ResponseMiddleware
|
13
|
+
# dependency do
|
14
|
+
# require 'yaml'
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# define_parser do |body|
|
18
|
+
# YAML.load body
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# Faraday.new(..) do |config|
|
23
|
+
# config.use UnsafelyParseYaml
|
24
|
+
# ...
|
25
|
+
# end
|
26
|
+
class ParseYaml < ResponseMiddleware
|
27
|
+
dependency do
|
28
|
+
require 'safe_yaml/load'
|
29
|
+
end
|
30
|
+
|
31
|
+
define_parser do |body|
|
32
|
+
SafeYAML.load body
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# deprecated alias
|
38
|
+
Faraday::Response::ParseYaml = FaradayMiddleware::ParseYaml
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'faraday_middleware/response/mashify'
|
2
|
+
|
3
|
+
module FaradayMiddleware
|
4
|
+
# Public: Converts parsed response bodies to a Hashie::Rash if they were of
|
5
|
+
# Hash or Array type.
|
6
|
+
class Rashify < Mashify
|
7
|
+
dependency do
|
8
|
+
require 'rash'
|
9
|
+
self.mash_class = ::Hashie::Rash
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# deprecated alias
|
15
|
+
Faraday::Response::Rashify = FaradayMiddleware::Rashify
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module FaradayMiddleware
|
4
|
+
# Internal: The base class for middleware that parses responses.
|
5
|
+
class ResponseMiddleware < Faraday::Middleware
|
6
|
+
CONTENT_TYPE = 'Content-Type'.freeze
|
7
|
+
|
8
|
+
class << self
|
9
|
+
attr_accessor :parser
|
10
|
+
end
|
11
|
+
|
12
|
+
# Store a Proc that receives the body and returns the parsed result.
|
13
|
+
def self.define_parser(parser = nil)
|
14
|
+
@parser = parser || Proc.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.inherited(subclass)
|
18
|
+
super
|
19
|
+
subclass.load_error = self.load_error if subclass.respond_to? :load_error=
|
20
|
+
subclass.parser = self.parser
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(app = nil, options = {})
|
24
|
+
super(app)
|
25
|
+
@options = options
|
26
|
+
@content_types = Array(options[:content_type])
|
27
|
+
end
|
28
|
+
|
29
|
+
def call(environment)
|
30
|
+
@app.call(environment).on_complete do |env|
|
31
|
+
if process_response_type?(response_type(env)) and parse_response?(env)
|
32
|
+
process_response(env)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def process_response(env)
|
38
|
+
env[:raw_body] = env[:body] if preserve_raw?(env)
|
39
|
+
env[:body] = parse(env[:body])
|
40
|
+
rescue Faraday::Error::ParsingError => err
|
41
|
+
raise Faraday::Error::ParsingError.new(err, env[:response])
|
42
|
+
end
|
43
|
+
|
44
|
+
# Parse the response body.
|
45
|
+
#
|
46
|
+
# Instead of overriding this method, consider using `define_parser`.
|
47
|
+
def parse(body)
|
48
|
+
if self.class.parser
|
49
|
+
begin
|
50
|
+
self.class.parser.call(body)
|
51
|
+
rescue StandardError, SyntaxError => err
|
52
|
+
raise err if err.is_a? SyntaxError and err.class.name != 'Psych::SyntaxError'
|
53
|
+
raise Faraday::Error::ParsingError, err
|
54
|
+
end
|
55
|
+
else
|
56
|
+
body
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def response_type(env)
|
61
|
+
type = env[:response_headers][CONTENT_TYPE].to_s
|
62
|
+
type = type.split(';', 2).first if type.index(';')
|
63
|
+
type
|
64
|
+
end
|
65
|
+
|
66
|
+
def process_response_type?(type)
|
67
|
+
@content_types.empty? or @content_types.any? { |pattern|
|
68
|
+
pattern.is_a?(Regexp) ? type =~ pattern : type == pattern
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
def parse_response?(env)
|
73
|
+
env[:body].respond_to? :to_str
|
74
|
+
end
|
75
|
+
|
76
|
+
def preserve_raw?(env)
|
77
|
+
env[:request].fetch(:preserve_raw, @options[:preserve_raw])
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# DRAGONS
|
82
|
+
module OptionsExtension
|
83
|
+
attr_accessor :preserve_raw
|
84
|
+
|
85
|
+
def to_hash
|
86
|
+
super.update(:preserve_raw => preserve_raw)
|
87
|
+
end
|
88
|
+
|
89
|
+
def each
|
90
|
+
return to_enum(:each) unless block_given?
|
91
|
+
super
|
92
|
+
yield :preserve_raw, preserve_raw
|
93
|
+
end
|
94
|
+
|
95
|
+
def fetch(key, *args)
|
96
|
+
if :preserve_raw == key
|
97
|
+
value = __send__(key)
|
98
|
+
value.nil? ? args.fetch(0) : value
|
99
|
+
else
|
100
|
+
super
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
if defined?(Faraday::RequestOptions)
|
106
|
+
begin
|
107
|
+
Faraday::RequestOptions.from(:preserve_raw => true)
|
108
|
+
rescue NoMethodError
|
109
|
+
Faraday::RequestOptions.send(:include, OptionsExtension)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: faraday_middleware_safeyaml
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.12.pre.safeyaml
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Erik Michaels-Ober
|
8
|
+
- Wynn Netherland
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2017-07-03 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: faraday
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 0.7.4
|
21
|
+
- - "<"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '1.0'
|
24
|
+
type: :runtime
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
requirements:
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 0.7.4
|
31
|
+
- - "<"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.0'
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: safe_yaml
|
36
|
+
requirement: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
type: :runtime
|
42
|
+
prerelease: false
|
43
|
+
version_requirements: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
description:
|
49
|
+
email:
|
50
|
+
- sferik@gmail.com
|
51
|
+
- wynn.netherland@gmail.com
|
52
|
+
executables: []
|
53
|
+
extensions: []
|
54
|
+
extra_rdoc_files: []
|
55
|
+
files:
|
56
|
+
- LICENSE.md
|
57
|
+
- README.md
|
58
|
+
- lib/faraday_middleware.rb
|
59
|
+
- lib/faraday_middleware/addressable_patch.rb
|
60
|
+
- lib/faraday_middleware/backwards_compatibility.rb
|
61
|
+
- lib/faraday_middleware/gzip.rb
|
62
|
+
- lib/faraday_middleware/instrumentation.rb
|
63
|
+
- lib/faraday_middleware/rack_compatible.rb
|
64
|
+
- lib/faraday_middleware/request/encode_json.rb
|
65
|
+
- lib/faraday_middleware/request/method_override.rb
|
66
|
+
- lib/faraday_middleware/request/oauth.rb
|
67
|
+
- lib/faraday_middleware/request/oauth2.rb
|
68
|
+
- lib/faraday_middleware/response/caching.rb
|
69
|
+
- lib/faraday_middleware/response/chunked.rb
|
70
|
+
- lib/faraday_middleware/response/follow_redirects.rb
|
71
|
+
- lib/faraday_middleware/response/mashify.rb
|
72
|
+
- lib/faraday_middleware/response/parse_dates.rb
|
73
|
+
- lib/faraday_middleware/response/parse_json.rb
|
74
|
+
- lib/faraday_middleware/response/parse_marshal.rb
|
75
|
+
- lib/faraday_middleware/response/parse_xml.rb
|
76
|
+
- lib/faraday_middleware/response/parse_yaml.rb
|
77
|
+
- lib/faraday_middleware/response/rashify.rb
|
78
|
+
- lib/faraday_middleware/response_middleware.rb
|
79
|
+
- lib/faraday_middleware/version.rb
|
80
|
+
homepage: https://github.com/lostisland/faraday_middleware
|
81
|
+
licenses:
|
82
|
+
- MIT
|
83
|
+
metadata: {}
|
84
|
+
post_install_message:
|
85
|
+
rdoc_options: []
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: 1.3.1
|
98
|
+
requirements: []
|
99
|
+
rubyforge_project:
|
100
|
+
rubygems_version: 2.5.2
|
101
|
+
signing_key:
|
102
|
+
specification_version: 4
|
103
|
+
summary: Various middleware for Faraday - forked to fix security issue (Waiting on
|
104
|
+
https://github.com/lostisland/faraday_middleware/pull/157)
|
105
|
+
test_files: []
|