tweakphoeus 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ea8b67191906a4405d2a281b65bebe605b75b47a
4
- data.tar.gz: f00524b1660e48dd48367f273fb59daba447cc73
3
+ metadata.gz: 03974c87632b69ec0956d0fb451350d8ffc5ec85
4
+ data.tar.gz: 42f409a675c5344ce173cc44b6d8624d333498bd
5
5
  SHA512:
6
- metadata.gz: c92ea3ec329f44879363f3411f4953f8b70a5492938b42b07ebbdaa4d82a551ab8aff5b5d951106933c0402dc151bfef4c83092d15118dc92c59e49f7f807ac4
7
- data.tar.gz: 22c40a0112be9ebc97f62f3a57d712e4760c448260447cf69f9be491db08b7a4b9eb82eab11f35b96416f4cf40a20f30bdabaedc995b3ee32862be8aeed4a327
6
+ metadata.gz: 78889b4ee6c703190e18d51996bb2b7bbf8d22a6667240283edc16b8a9f07dd0659c823d8e1910bbaff0f696300f2cb0c6510e64d334eca9db77f0efb27381f8
7
+ data.tar.gz: f83067fb5b6234937144eb86518277ec45e6bab6afa235d4ada784aa2645d089d83ae7e1536274dc470f5e79277d94b7ed10fd5a66ec8c45f834696f8c07af47
data/CHANGELOG.md CHANGED
@@ -1 +1,2 @@
1
1
  -- v0.1.0 - First stable version: Typhoeus dependency version updated
2
+ -- v0.2.0 - Refactor of cookies format
@@ -1,3 +1,3 @@
1
1
  module Tweakphoeus
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/tweakphoeus.rb CHANGED
@@ -7,22 +7,24 @@ module Tweakphoeus
7
7
 
8
8
  def initialize()
9
9
  @cookie_jar = {}
10
+ @referer = [""]
11
+ @base_headers = {
12
+ "User-Agent" => "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0",
13
+ "Accept-Language" => "es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3",
14
+ "Accept-Encoding" => "",
15
+ "DNT" => "1",
16
+ "Connection" => "keep-alive"
17
+ }
10
18
  end
11
19
 
12
20
  def get(url, body: nil, headers: nil, redirect: true)
13
- inject_cookies(url, headers)
14
- response = Typhoeus.get(url, body: body, headers: headers)
15
- obtain_cookies(response)
16
- response = get(redirect_url(response), body: body, headers: headers) if redirect && has_redirect?(response)
17
- response
21
+ set_referer_from_headers(headers)
22
+ http_request(url, body: body, headers: headers, redirect: redirect, method: :get)
18
23
  end
19
24
 
20
25
  def post(url, body: nil, headers: nil, redirect: false)
21
- inject_cookies(url, headers)
22
- response = Typhoeus.post(url, body: body, headers: headers)
23
- obtain_cookies(response)
24
- response = post(redirect_url(response), body: body, headers: headers) if redirect && has_redirect?(response)
25
- response
26
+ set_referer_from_headers(headers)
27
+ http_request(url, body: body, headers: headers, redirect: redirect, method: :post)
26
28
  end
27
29
 
28
30
  def get_hide_inputs response
@@ -30,60 +32,106 @@ module Tweakphoeus
30
32
  end
31
33
 
32
34
  def add_cookies host, key, value
33
- domain = get_domain host
34
- @cookie_jar[domain] = [] if @cookie_jar[domain].nil?
35
- @cookie_jar[domain] = @cookie_jar[domain].reject{|hash| hash.first[0]==key}
36
- @cookie_jar[domain] << {key => value}
35
+ domain = get_domain(host)
36
+ @cookie_jar[domain] ||= {}
37
+ @cookie_jar[domain][key] = value
37
38
  end
38
39
 
39
40
  def get_domain domain
40
- domain.match(/([a-zA-Z0-9]+:\/\/|)([^\/]+)/)[2]
41
+ domain.match(/([a-zA-Z0-9]+:\/\/|)([^\/]+)/)[2].gsub(/^\./,'')
42
+ end
43
+
44
+ def push_referer url = ""
45
+ @referer << url
46
+ url
47
+ end
48
+
49
+ def pop_referer
50
+ @referer.pop
51
+ end
52
+
53
+ def get_referer
54
+ @referer.last
41
55
  end
42
56
 
43
57
  private
44
58
 
59
+ def http_request(url, body: nil, headers: nil, redirect: false, method: method)
60
+ request_headers = @base_headers
61
+ request_headers["Cookie"] = inject_cookies(url, headers)
62
+ request_headers["Referer"] = get_referer
63
+ response = Typhoeus.send(method, url, body: body, headers: request_headers)
64
+ obtain_cookies(response)
65
+ set_referer(url) if method != :post
66
+ if redirect && has_redirect?(response)
67
+ if response.code != 307
68
+ method = :get
69
+ body = nil
70
+ end
71
+ response = http_request(redirect_url(response),
72
+ body: body,
73
+ headers: headers,
74
+ redirect: redirect,
75
+ method: method)
76
+ end
77
+ response
78
+ end
79
+
45
80
  def obtain_cookies response
46
81
  set_cookies_field = response.headers["Set-Cookie"]
47
82
  return if set_cookies_field.nil?
48
83
  if set_cookies_field.is_a?(String)
49
- set_cookies_field = [response.headers["Set-Cookie"]]
84
+ set_cookies_field = [set_cookies_field]
50
85
  end
51
86
 
52
87
  set_cookies_field.each do |cookie|
53
- key, value = cookie.match(/^([^=]+)=([^;].+)/).to_a[1..-1]
88
+ key, value = cookie.match(/^([^=]+)=(.+)/).to_a[1..-1]
54
89
  domain = cookie.match(/Domain=([^;]+)/)
55
90
 
56
91
  if domain.nil?
57
- domain = get_domain response.request.url
92
+ domain = get_domain(response.request.url)
58
93
  else
59
- domain = domain[1]
94
+ domain = domain[1].gsub(/^\./,'')
60
95
  end
61
96
 
97
+ value = value.split(';').first
62
98
  if value != "\"\""
63
- @cookie_jar[domain] = [] if @cookie_jar[domain].nil?
64
- @cookie_jar[domain] = @cookie_jar[domain].reject{|hash| hash.first[0]==key}
65
- @cookie_jar[domain] << {key => value}
99
+ @cookie_jar[domain] ||= {}
100
+ @cookie_jar[domain][key] = value
101
+ else
102
+ @cookie_jar[domain] ||= {}
103
+ @cookie_jar[domain].delete(key)
66
104
  end
67
105
  end
68
106
  end
69
107
 
70
108
  def inject_cookies url, headers
71
- domain = get_domain url
72
- headers = {} if headers.nil?
73
- cookies = []
109
+ domain = get_domain(url)
110
+ headers ||= {}
111
+ cookies = parse_cookie(headers["Cookie"])
74
112
 
75
113
  while domain.split(".").count > 1
76
114
  if @cookie_jar[domain]
77
- @cookie_jar[domain].each do |cookie|
78
- if !cookie.in?(cookies.map{|k,v| k})
79
- cookies << cookie
80
- end
81
- end
115
+ cookies = @cookie_jar[domain].merge(cookies)
82
116
  end
83
117
  domain = domain.split(".")[1..-1].join(".")
84
118
  end
85
119
 
86
- headers["Cookie"] = cookies.map{|hash| hash.map{|k,v| k + "=" + v}}.flatten.join('; ')
120
+ cookies.map{|k,v| "#{k}=#{v}"}.join('; ')
121
+ end
122
+
123
+ def parse_cookie cookie_string
124
+ cookies = {}
125
+
126
+ if cookie_string.is_a?(String)
127
+ cookie_string.split(';').each do |string|
128
+ key, value = string.split('=')
129
+ key.strip!
130
+ cookies[key.strip] = value if value && !["Domain","Path","domain","path"].include?(key)
131
+ end
132
+ end
133
+
134
+ cookies
87
135
  end
88
136
 
89
137
  def has_redirect? response
@@ -97,5 +145,16 @@ module Tweakphoeus
97
145
  def purge_bad_cookies cookies
98
146
  cookies.reject{|e| e.first.last=="\"\""}
99
147
  end
148
+
149
+ def set_referer_from_headers headers
150
+ if headers && headers["Referer"].is_a?(String)
151
+ @referer.last.replace headers["Referer"]
152
+ end
153
+ end
154
+
155
+ def set_referer url
156
+ @referer.last.replace url
157
+ end
158
+
100
159
  end
101
160
  end
data/tweakphoeus.gemspec CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
28
  spec.require_paths = ["lib"]
29
29
 
30
- spec.add_dependency 'typhoeus', "~> 1.0.1"
30
+ spec.add_dependency 'typhoeus', '~> 1.0', '>= 1.0.1'
31
31
  spec.add_development_dependency "bundler", "~> 1.10"
32
32
  spec.add_development_dependency "rake", "~> 10.0"
33
33
  spec.add_development_dependency "rspec", "~> 3.0", "> 3.0.0"
metadata CHANGED
@@ -1,20 +1,23 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tweakphoeus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Martin Garcia
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-01-22 00:00:00.000000000 Z
11
+ date: 2016-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: typhoeus
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ - - ">="
18
21
  - !ruby/object:Gem::Version
19
22
  version: 1.0.1
20
23
  type: :runtime
@@ -22,6 +25,9 @@ dependencies:
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
30
+ - - ">="
25
31
  - !ruby/object:Gem::Version
26
32
  version: 1.0.1
27
33
  - !ruby/object:Gem::Dependency
@@ -114,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
120
  version: '0'
115
121
  requirements: []
116
122
  rubyforge_project:
117
- rubygems_version: 2.5.1
123
+ rubygems_version: 2.4.8
118
124
  signing_key:
119
125
  specification_version: 4
120
126
  summary: Typhoeus on steroids.