micky 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|