micky 0.1.0 → 0.2.0
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 +4 -4
- data/README.md +5 -4
- data/lib/micky/request.rb +48 -24
- data/lib/micky/uri.rb +21 -3
- data/lib/micky/version.rb +1 -1
- data/lib/micky.rb +4 -0
- data/micky.gemspec +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: af45a8a8f7fc7e48b95beeffbff81a51e9948ad1
|
4
|
+
data.tar.gz: 057926d44234a5d7cea3205f35e905ee58d9ebeb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e9b6c1d51655b9e995e4bad8ffe680f8f105a8d29371cbecef8936ac53da0eed02547995e44da155df9d139d44bb1570d044316d58d3631dca734150430c865
|
7
|
+
data.tar.gz: a93d83e01d8511b1c56a4fb00b83ecb0ab8291a4a9d5b45d4148770b074ffb43ff2723d200b5a21bcf1193c964770d06adb42ad0427c7fa4ab3e59e7650c3320
|
data/README.md
CHANGED
@@ -52,7 +52,7 @@ if Micky.head(params[:website_url])
|
|
52
52
|
url.path = '/favicon.ico'
|
53
53
|
|
54
54
|
if favicon = Micky.get(url)
|
55
|
-
# Do whatever with the raw `favicon.
|
55
|
+
# Do whatever with the raw `favicon.body`, for whatever reason
|
56
56
|
else
|
57
57
|
# This site has no favicon, or a broken one, too bad
|
58
58
|
end
|
@@ -105,11 +105,11 @@ Micky.parsers['application/json'] = -> (body) {
|
|
105
105
|
}
|
106
106
|
```
|
107
107
|
|
108
|
-
Parse images into [
|
108
|
+
Parse images into [MiniMagick](https://github.com/minimagick/minimagick)
|
109
109
|
instances:
|
110
110
|
|
111
111
|
```ruby
|
112
|
-
|
112
|
+
image_parser = -> (body) {
|
113
113
|
begin
|
114
114
|
MiniMagick::Image.read(body)
|
115
115
|
rescue MiniMagick::Invalid
|
@@ -117,7 +117,7 @@ parser = -> (body) {
|
|
117
117
|
}
|
118
118
|
|
119
119
|
%w[image/png image/jpeg image/jpg image/gif].each do |type|
|
120
|
-
Micky.parsers[type] =
|
120
|
+
Micky.parsers[type] = image_parser
|
121
121
|
end
|
122
122
|
```
|
123
123
|
|
@@ -125,6 +125,7 @@ end
|
|
125
125
|
|
126
126
|
- Add tests
|
127
127
|
- Better document configuration options in README
|
128
|
+
- Add `raise_errors: true` option
|
128
129
|
|
129
130
|
## Contributing
|
130
131
|
|
data/lib/micky/request.rb
CHANGED
@@ -5,7 +5,7 @@ module Micky
|
|
5
5
|
class Request
|
6
6
|
def initialize(opts = {})
|
7
7
|
# Options can be set per request and fallback to module-level defaults
|
8
|
-
[:max_redirects, :timeout, :skip_resolve, :resolve_timeout, :headers, :parsers].each do |name|
|
8
|
+
[:max_redirects, :timeout, :skip_resolve, :resolve_timeout, :oauth, :query, :headers, :parsers].each do |name|
|
9
9
|
value = opts.has_key?(name) ? opts[name] : Micky.public_send(name)
|
10
10
|
instance_variable_set "@#{name}", value
|
11
11
|
end
|
@@ -13,25 +13,35 @@ module Micky
|
|
13
13
|
|
14
14
|
def get(uri)
|
15
15
|
@request_class_name = 'Get'
|
16
|
-
|
16
|
+
request_with_redirect_handling(uri)
|
17
17
|
end
|
18
18
|
|
19
19
|
def head(uri)
|
20
20
|
@request_class_name = 'Head'
|
21
|
-
|
21
|
+
request_with_redirect_handling(uri)
|
22
22
|
end
|
23
23
|
|
24
24
|
private
|
25
25
|
|
26
|
-
def
|
27
|
-
@uri = uri
|
28
|
-
request_with_redirect_handling(0)
|
29
|
-
end
|
30
|
-
|
31
|
-
def request_with_redirect_handling(redirect_count)
|
26
|
+
def request_with_redirect_handling(uri, redirect_count = 0)
|
32
27
|
return log "Max redirects reached (#{@max_redirects})" if redirect_count >= @max_redirects
|
33
28
|
|
34
|
-
|
29
|
+
case response = request(uri)
|
30
|
+
when Net::HTTPSuccess
|
31
|
+
Response.new(response)
|
32
|
+
when Net::HTTPRedirection
|
33
|
+
uri = response['Location']
|
34
|
+
log "Redirect to #{uri}"
|
35
|
+
request_with_redirect_handling(uri, redirect_count + 1)
|
36
|
+
else
|
37
|
+
log response
|
38
|
+
log response.body
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def request(uri)
|
44
|
+
@uri = Micky::URI(uri) or return nil
|
35
45
|
|
36
46
|
unless @skip_resolve == true
|
37
47
|
# Resolv is the only domain validity check that can be wrapped with Timeout.
|
@@ -60,24 +70,38 @@ module Micky
|
|
60
70
|
http.read_timeout = @timeout
|
61
71
|
http.ssl_timeout = @timeout
|
62
72
|
|
73
|
+
# Query string
|
74
|
+
query = Hash[::URI.decode_www_form(@uri.query || '')]
|
75
|
+
|
76
|
+
if @query && @query.any?
|
77
|
+
query.merge! Hash[@query.map { |k,v| [k.to_s, v] }]
|
78
|
+
@uri.query = ::URI.encode_www_form(query)
|
79
|
+
end
|
80
|
+
|
81
|
+
# OAuth
|
82
|
+
if @oauth && @oauth.any?
|
83
|
+
unless defined? SimpleOAuth
|
84
|
+
begin
|
85
|
+
require 'simple_oauth'
|
86
|
+
rescue LoadError
|
87
|
+
raise 'You must install the simple_oauth gem to use the :oauth argument.'
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
uri_without_query = @uri.dup
|
92
|
+
uri_without_query.query = ''
|
93
|
+
header = SimpleOAuth::Header.new(@request_class_name, uri_without_query, query, @oauth).to_s
|
94
|
+
@headers['Authorization'] = header
|
95
|
+
end
|
96
|
+
|
63
97
|
# Request
|
64
98
|
request = Net::HTTP.const_get(@request_class_name).new(@uri)
|
65
|
-
@headers.each { |k,v| request[k] = v }
|
66
99
|
|
67
|
-
|
100
|
+
# Headers
|
101
|
+
@headers.each { |k,v| request[k] = v }
|
68
102
|
|
69
|
-
|
70
|
-
|
71
|
-
Response.new(response)
|
72
|
-
when Net::HTTPRedirection
|
73
|
-
log "Redirect to #{response['Location']}"
|
74
|
-
@uri = response['Location']
|
75
|
-
request_with_redirect_handling(redirect_count + 1)
|
76
|
-
else
|
77
|
-
log response
|
78
|
-
nil
|
79
|
-
end
|
80
|
-
rescue Timeout::Error, ::URI::InvalidURIError, OpenSSL::SSL::SSLError, SystemCallError, SocketError => e
|
103
|
+
http.request(request)
|
104
|
+
rescue Timeout::Error, OpenSSL::SSL::SSLError, SystemCallError, SocketError => e
|
81
105
|
log e
|
82
106
|
nil
|
83
107
|
end
|
data/lib/micky/uri.rb
CHANGED
@@ -1,12 +1,30 @@
|
|
1
|
-
require 'delegate'
|
2
1
|
require 'uri'
|
3
2
|
|
4
3
|
module Micky
|
5
|
-
HTTP_URI_REGEX =
|
4
|
+
HTTP_URI_REGEX = %r{\Ahttps?://}
|
6
5
|
|
7
6
|
def self.URI(uri)
|
8
7
|
uri = uri.to_s.strip
|
9
8
|
uri = "http://#{uri}" if uri !~ HTTP_URI_REGEX
|
10
|
-
|
9
|
+
begin
|
10
|
+
::URI.parse(uri)
|
11
|
+
rescue ::URI::InvalidURIError
|
12
|
+
begin
|
13
|
+
::URI.parse(::URI.encode(uri))
|
14
|
+
rescue ::URI::InvalidURIError
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module URI
|
20
|
+
def self.extract(text)
|
21
|
+
::URI.extract(text).select { |uri|
|
22
|
+
begin
|
23
|
+
::URI.parse(uri).is_a? ::URI::HTTP
|
24
|
+
rescue ::URI::InvalidURIError
|
25
|
+
false
|
26
|
+
end
|
27
|
+
}
|
28
|
+
end
|
11
29
|
end
|
12
30
|
end
|
data/lib/micky/version.rb
CHANGED
data/lib/micky.rb
CHANGED
@@ -10,6 +10,8 @@ module Micky
|
|
10
10
|
attr_accessor :timeout
|
11
11
|
attr_accessor :skip_resolve
|
12
12
|
attr_accessor :resolve_timeout
|
13
|
+
attr_accessor :oauth
|
14
|
+
attr_accessor :query
|
13
15
|
attr_accessor :headers
|
14
16
|
attr_accessor :parsers
|
15
17
|
end
|
@@ -19,6 +21,8 @@ module Micky
|
|
19
21
|
@timeout = 5
|
20
22
|
@skip_resolve = false
|
21
23
|
@resolve_timeout = 2
|
24
|
+
@oauth = {}
|
25
|
+
@query = {}
|
22
26
|
@headers = {}
|
23
27
|
@parsers = {
|
24
28
|
'application/json' => -> (body) {
|
data/micky.gemspec
CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
|
|
13
13
|
'exceptions (invalid hosts/URIs, server errors, timeouts, redirect loops), ' \
|
14
14
|
'automatically parses responses (JSON, etc.), is very lightweight, and has no ' \
|
15
15
|
'dependency.'
|
16
|
-
spec.summary = '
|
16
|
+
spec.summary = 'Lightweight and worry-free HTTP client'
|
17
17
|
spec.homepage = 'http://github.com/rafBM/micky'
|
18
18
|
spec.license = 'MIT'
|
19
19
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: micky
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rafaël Blais Masson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-11-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -78,8 +78,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
78
|
version: '0'
|
79
79
|
requirements: []
|
80
80
|
rubyforge_project:
|
81
|
-
rubygems_version: 2.
|
81
|
+
rubygems_version: 2.1.9
|
82
82
|
signing_key:
|
83
83
|
specification_version: 4
|
84
|
-
summary:
|
84
|
+
summary: Lightweight and worry-free HTTP client
|
85
85
|
test_files: []
|