http_utilities 1.0.2 → 1.0.5
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/Gemfile +4 -3
- data/http_utilities.gemspec +2 -2
- data/lib/http_utilities/http/proxy_support.rb +9 -7
- data/lib/http_utilities/proxies/proxy_checker.rb +48 -13
- data/lib/http_utilities/proxies/proxy_module.rb +12 -0
- data/lib/http_utilities.rb +1 -1
- metadata +35 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c3ac10c88e4301a9be712c06747987b7bbec37e
|
4
|
+
data.tar.gz: 85a711b2b5cc059682522bc9c03cd09140afe4a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 933e6381c41d5bfd6c0d1e337b936087eaf4e6ea8319caa0ab9878739ecfec1271a596fb551b02d98ada765caa56b5a73dbb8bb3fe337110d09a19bdf8e3a386
|
7
|
+
data.tar.gz: b4101592f6b9c6ced152ca5bf933ca74b51cb54bc7c80f486a095612d246a387d6d4ffd23cad4fbfa40f498861d0c6da49d4d6a2efa9f86b6813e92eb90c1a18
|
data/Gemfile
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
|
-
gem "nokogiri",
|
4
|
-
gem "mechanize",
|
5
|
-
gem "multi_xml",
|
3
|
+
gem "nokogiri", ">= 1.5.5"
|
4
|
+
gem "mechanize", ">= 2.5"
|
5
|
+
gem "multi_xml", ">= 0.5"
|
6
|
+
gem "net-ssh", ">= 2.8"
|
6
7
|
|
7
8
|
gem "activerecord-import", :require => false
|
8
9
|
|
data/http_utilities.gemspec
CHANGED
@@ -3,10 +3,9 @@ Gem::Specification.new do |s|
|
|
3
3
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.3.5") if s.respond_to? :required_rubygems_version=
|
4
4
|
|
5
5
|
s.name = "http_utilities"
|
6
|
-
s.version = "1.0.
|
6
|
+
s.version = "1.0.5"
|
7
7
|
|
8
8
|
s.authors = ["Sebastian Johnsson"]
|
9
|
-
s.date = "2012-11-22"
|
10
9
|
s.description = "Wrapper for common Http Libraries (Net:HTTP/Open URI/Curl)"
|
11
10
|
|
12
11
|
s.homepage = "http://github.com/Agiley/http_utilities"
|
@@ -15,6 +14,7 @@ Gem::Specification.new do |s|
|
|
15
14
|
s.add_dependency(%q<nokogiri>, [">= 1.5.5"])
|
16
15
|
s.add_dependency(%q<mechanize>, [">= 2.5"])
|
17
16
|
s.add_dependency(%q<multi_xml>, [">= 0.5"])
|
17
|
+
s.add_dependency(%q<net-ssh>, [">= 2.8"])
|
18
18
|
s.add_dependency(%q<activerecord-import>, [">= 0"])
|
19
19
|
|
20
20
|
s.add_development_dependency(%q<rails>, [">= 0"])
|
@@ -35,13 +35,15 @@ module HttpUtilities
|
|
35
35
|
self.proxy = specific_proxy
|
36
36
|
|
37
37
|
elsif (proxy_model_defined?)
|
38
|
-
proxy_object
|
38
|
+
proxy_object = Proxy.get_random_proxy(self.proxy[:protocol], self.proxy[:type])
|
39
39
|
|
40
40
|
#log(:info, "[HttpUtilities::Http::ProxySupport] - Randomized Proxy object: #{proxy_object.inspect}")
|
41
41
|
|
42
42
|
if (proxy_object)
|
43
43
|
self.proxy[:host] = proxy_object.host
|
44
44
|
self.proxy[:port] = proxy_object.port
|
45
|
+
proxy_username = proxy_object.username.present? ? proxy_object.username : nil
|
46
|
+
proxy_password = proxy_object.password.present? ? proxy_object.password : nil
|
45
47
|
end
|
46
48
|
end
|
47
49
|
end
|
@@ -52,20 +54,20 @@ module HttpUtilities
|
|
52
54
|
def set_proxy_credentials(proxy_username, proxy_password, proxy_credentials)
|
53
55
|
if (self.using_proxy? && (!self.proxy[:username] || !self.proxy[:password]))
|
54
56
|
if (proxy_username && proxy_password)
|
55
|
-
self.proxy[:username]
|
56
|
-
self.proxy[:password]
|
57
|
+
self.proxy[:username] = proxy_username
|
58
|
+
self.proxy[:password] = proxy_password
|
57
59
|
|
58
60
|
elsif (proxy_credentials)
|
59
61
|
if (proxy_credentials.is_a?(Hash))
|
60
|
-
self.proxy[:username]
|
61
|
-
self.proxy[:password]
|
62
|
+
self.proxy[:username] = proxy_credentials[:username]
|
63
|
+
self.proxy[:password] = proxy_credentials[:password]
|
62
64
|
|
63
65
|
elsif (proxy_credentials.is_a?(String))
|
64
66
|
parts = proxy_credentials.split(":")
|
65
67
|
|
66
68
|
if (parts && parts.any? && parts.size >= 2)
|
67
|
-
self.proxy[:username]
|
68
|
-
self.proxy[:password]
|
69
|
+
self.proxy[:username] = parts.first
|
70
|
+
self.proxy[:password] = parts.second
|
69
71
|
end
|
70
72
|
end
|
71
73
|
end
|
@@ -1,9 +1,12 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
|
3
|
+
require 'socket'
|
4
|
+
require 'net/ssh/proxy/socks5'
|
5
|
+
require 'activerecord-import'
|
6
|
+
|
3
7
|
module HttpUtilities
|
4
8
|
module Proxies
|
5
9
|
class ProxyChecker
|
6
|
-
require 'activerecord-import'
|
7
10
|
attr_accessor :client, :processed_proxies
|
8
11
|
attr_accessor :limit, :minimum_successful_attempts, :maximum_failed_attempts
|
9
12
|
|
@@ -43,20 +46,52 @@ module HttpUtilities
|
|
43
46
|
end
|
44
47
|
end
|
45
48
|
|
46
|
-
def check_proxy(proxy
|
49
|
+
def check_proxy(proxy)
|
50
|
+
Rails.logger.info "#{Time.now}: Will check if proxy #{proxy.proxy_address} is working."
|
51
|
+
|
52
|
+
self.send("check_#{proxy.protocol}_proxy")
|
53
|
+
end
|
54
|
+
|
55
|
+
def check_socks_proxy(proxy, test_host: "whois.verisign-grs.com", test_port: 43, test_query: "=google.com")
|
56
|
+
valid_proxy = false
|
57
|
+
|
58
|
+
begin
|
59
|
+
socks_proxy = Net::SSH::Proxy::SOCKS5.new(proxy.host, proxy.port, proxy.socks_proxy_credentials)
|
60
|
+
client = socks_proxy.open(test_host, test_port)
|
61
|
+
|
62
|
+
client.write("#{test_query}\r\n")
|
63
|
+
response = client.read
|
64
|
+
|
65
|
+
valid_proxy = (response && response.present?)
|
66
|
+
|
67
|
+
rescue StandardError => e
|
68
|
+
Rails.logger.error "Exception occured while trying to check proxy #{proxy.proxy_address}. Error Class: #{e.class}. Error Message: #{e.message}"
|
69
|
+
valid_proxy = false
|
70
|
+
end
|
71
|
+
|
72
|
+
if (valid_proxy)
|
73
|
+
Rails.logger.info "#{Time.now}: Proxy #{proxy.proxy_address} is working!"
|
74
|
+
else
|
75
|
+
Rails.logger.info "#{Time.now}: Proxy #{proxy.proxy_address} is not working!"
|
76
|
+
end
|
77
|
+
|
78
|
+
self.processed_proxies << {proxy: proxy, valid: valid_proxy}
|
79
|
+
end
|
80
|
+
|
81
|
+
def check_http_proxy(proxy, timeout = 60)
|
47
82
|
document = nil
|
48
83
|
valid_proxy = false
|
49
84
|
|
50
|
-
options = {
|
51
|
-
:
|
52
|
-
:proxy
|
53
|
-
:
|
54
|
-
:timeout
|
55
|
-
:
|
56
|
-
:
|
85
|
+
options = {method: :net_http,
|
86
|
+
use_proxy: true,
|
87
|
+
proxy: proxy.proxy_address,
|
88
|
+
proxy_protocol: proxy.protocol,
|
89
|
+
timeout: timeout,
|
90
|
+
maximum_redirects: 1,
|
91
|
+
disable_auth: true
|
57
92
|
}
|
58
93
|
|
59
|
-
Rails.logger.info "#{Time.now}: Fetching
|
94
|
+
Rails.logger.info "#{Time.now}: Fetching Google.com with proxy #{proxy.proxy_address}."
|
60
95
|
|
61
96
|
response = self.client.retrieve_parsed_html("http://www.google.com/webhp?hl=en", options)
|
62
97
|
|
@@ -73,7 +108,7 @@ module HttpUtilities
|
|
73
108
|
Rails.logger.info "Title is: #{title}. Proxy #{proxy.proxy_address}"
|
74
109
|
|
75
110
|
rescue Exception => e
|
76
|
-
Rails.logger.error "Exception occured while trying to
|
111
|
+
Rails.logger.error "Exception occured while trying to check proxy #{proxy.proxy_address}. Error Class: #{e.class}. Error Message: #{e.message}"
|
77
112
|
valid_proxy = false
|
78
113
|
end
|
79
114
|
end
|
@@ -85,10 +120,10 @@ module HttpUtilities
|
|
85
120
|
Rails.logger.info "#{Time.now}: Proxy #{proxy.proxy_address} is not working!"
|
86
121
|
end
|
87
122
|
|
88
|
-
self.processed_proxies << {:
|
123
|
+
self.processed_proxies << {proxy: proxy, valid: valid_proxy}
|
89
124
|
end
|
90
125
|
|
91
|
-
def update_proxies
|
126
|
+
def update_proxies
|
92
127
|
columns = [:host, :port, :last_checked_at, :valid_proxy, :successful_attempts, :failed_attempts]
|
93
128
|
values = []
|
94
129
|
|
@@ -63,6 +63,18 @@ module HttpUtilities
|
|
63
63
|
def proxy_credentials
|
64
64
|
return ::Proxy.format_proxy_credentials(self.username, self.password)
|
65
65
|
end
|
66
|
+
|
67
|
+
def socks_proxy_credentials
|
68
|
+
credentials = {}
|
69
|
+
|
70
|
+
if (!self.username.empty? && !self.password.empty?)
|
71
|
+
credentials = {user: self.username, password: self.password}
|
72
|
+
elsif (!self.username.empty? && self.password.empty?)
|
73
|
+
credentials = {user: self.username}
|
74
|
+
end
|
75
|
+
|
76
|
+
return credentials
|
77
|
+
end
|
66
78
|
end
|
67
79
|
|
68
80
|
end
|
data/lib/http_utilities.rb
CHANGED
metadata
CHANGED
@@ -1,125 +1,139 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http_utilities
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sebastian Johnsson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 1.5.5
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 1.5.5
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: mechanize
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '2.5'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '2.5'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: multi_xml
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0.5'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0.5'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: net-ssh
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.8'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.8'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: activerecord-import
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- -
|
73
|
+
- - ">="
|
60
74
|
- !ruby/object:Gem::Version
|
61
75
|
version: '0'
|
62
76
|
type: :runtime
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- -
|
80
|
+
- - ">="
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: rails
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- -
|
87
|
+
- - ">="
|
74
88
|
- !ruby/object:Gem::Version
|
75
89
|
version: '0'
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- -
|
94
|
+
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: rspec
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
|
-
- -
|
101
|
+
- - ">="
|
88
102
|
- !ruby/object:Gem::Version
|
89
103
|
version: '0'
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
|
-
- -
|
108
|
+
- - ">="
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: sqlite3
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
|
-
- -
|
115
|
+
- - ">="
|
102
116
|
- !ruby/object:Gem::Version
|
103
117
|
version: '0'
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
108
|
-
- -
|
122
|
+
- - ">="
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: mysql2
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
|
-
- -
|
129
|
+
- - ">="
|
116
130
|
- !ruby/object:Gem::Version
|
117
131
|
version: 0.3.11
|
118
132
|
type: :development
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
|
-
- -
|
136
|
+
- - ">="
|
123
137
|
- !ruby/object:Gem::Version
|
124
138
|
version: 0.3.11
|
125
139
|
description: Wrapper for common Http Libraries (Net:HTTP/Open URI/Curl)
|
@@ -184,17 +198,17 @@ require_paths:
|
|
184
198
|
- lib
|
185
199
|
required_ruby_version: !ruby/object:Gem::Requirement
|
186
200
|
requirements:
|
187
|
-
- -
|
201
|
+
- - ">="
|
188
202
|
- !ruby/object:Gem::Version
|
189
203
|
version: '0'
|
190
204
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
191
205
|
requirements:
|
192
|
-
- -
|
206
|
+
- - ">="
|
193
207
|
- !ruby/object:Gem::Version
|
194
208
|
version: 1.3.5
|
195
209
|
requirements: []
|
196
210
|
rubyforge_project:
|
197
|
-
rubygems_version: 2.
|
211
|
+
rubygems_version: 2.2.2
|
198
212
|
signing_key:
|
199
213
|
specification_version: 2
|
200
214
|
summary: Wrapper for common Http Libraries (Net:HTTP/Open URI/Curl)
|