tweakphoeus 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 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.