diamond-mechanize 2.1 → 2.2
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.
- metadata +222 -167
- data/Rakefile +0 -49
- data/lib/mechanize/content_type_error.rb +0 -13
- data/lib/mechanize/cookie.rb +0 -232
- data/lib/mechanize/cookie_jar.rb +0 -194
- data/lib/mechanize/download.rb +0 -59
- data/lib/mechanize/element_matcher.rb +0 -36
- data/lib/mechanize/file.rb +0 -65
- data/lib/mechanize/file_connection.rb +0 -17
- data/lib/mechanize/file_request.rb +0 -26
- data/lib/mechanize/file_response.rb +0 -74
- data/lib/mechanize/file_saver.rb +0 -39
- data/lib/mechanize/form/button.rb +0 -6
- data/lib/mechanize/form/check_box.rb +0 -12
- data/lib/mechanize/form/field.rb +0 -54
- data/lib/mechanize/form/file_upload.rb +0 -21
- data/lib/mechanize/form/hidden.rb +0 -3
- data/lib/mechanize/form/image_button.rb +0 -19
- data/lib/mechanize/form/keygen.rb +0 -34
- data/lib/mechanize/form/multi_select_list.rb +0 -94
- data/lib/mechanize/form/option.rb +0 -50
- data/lib/mechanize/form/radio_button.rb +0 -55
- data/lib/mechanize/form/reset.rb +0 -3
- data/lib/mechanize/form/select_list.rb +0 -44
- data/lib/mechanize/form/submit.rb +0 -3
- data/lib/mechanize/form/text.rb +0 -3
- data/lib/mechanize/form/textarea.rb +0 -3
- data/lib/mechanize/form.rb +0 -543
- data/lib/mechanize/headers.rb +0 -23
- data/lib/mechanize/history.rb +0 -82
- data/lib/mechanize/http/agent.rb +0 -1004
- data/lib/mechanize/http/auth_challenge.rb +0 -59
- data/lib/mechanize/http/auth_realm.rb +0 -31
- data/lib/mechanize/http/content_disposition_parser.rb +0 -188
- data/lib/mechanize/http/www_authenticate_parser.rb +0 -155
- data/lib/mechanize/http.rb +0 -8
- data/lib/mechanize/monkey_patch.rb +0 -16
- data/lib/mechanize/page/base.rb +0 -7
- data/lib/mechanize/page/frame.rb +0 -27
- data/lib/mechanize/page/image.rb +0 -30
- data/lib/mechanize/page/label.rb +0 -20
- data/lib/mechanize/page/link.rb +0 -98
- data/lib/mechanize/page/meta_refresh.rb +0 -68
- data/lib/mechanize/page.rb +0 -440
- data/lib/mechanize/parser.rb +0 -173
- data/lib/mechanize/pluggable_parsers.rb +0 -144
- data/lib/mechanize/redirect_limit_reached_error.rb +0 -19
- data/lib/mechanize/redirect_not_get_or_head_error.rb +0 -21
- data/lib/mechanize/response_code_error.rb +0 -21
- data/lib/mechanize/response_read_error.rb +0 -27
- data/lib/mechanize/robots_disallowed_error.rb +0 -28
- data/lib/mechanize/test_case.rb +0 -663
- data/lib/mechanize/unauthorized_error.rb +0 -3
- data/lib/mechanize/unsupported_scheme_error.rb +0 -6
- data/lib/mechanize/util.rb +0 -101
- data/lib/mechanize.rb +0 -1079
- data/test/data/htpasswd +0 -1
- data/test/data/server.crt +0 -16
- data/test/data/server.csr +0 -12
- data/test/data/server.key +0 -15
- data/test/data/server.pem +0 -15
- data/test/htdocs/alt_text.html +0 -10
- data/test/htdocs/bad_form_test.html +0 -9
- data/test/htdocs/button.jpg +0 -0
- data/test/htdocs/canonical_uri.html +0 -9
- data/test/htdocs/dir with spaces/foo.html +0 -1
- data/test/htdocs/empty_form.html +0 -6
- data/test/htdocs/file_upload.html +0 -26
- data/test/htdocs/find_link.html +0 -41
- data/test/htdocs/form_multi_select.html +0 -16
- data/test/htdocs/form_multival.html +0 -37
- data/test/htdocs/form_no_action.html +0 -18
- data/test/htdocs/form_no_input_name.html +0 -16
- data/test/htdocs/form_order_test.html +0 -11
- data/test/htdocs/form_select.html +0 -16
- data/test/htdocs/form_set_fields.html +0 -14
- data/test/htdocs/form_test.html +0 -188
- data/test/htdocs/frame_referer_test.html +0 -10
- data/test/htdocs/frame_test.html +0 -30
- data/test/htdocs/google.html +0 -13
- data/test/htdocs/index.html +0 -6
- data/test/htdocs/link with space.html +0 -5
- data/test/htdocs/meta_cookie.html +0 -11
- data/test/htdocs/no_title_test.html +0 -6
- data/test/htdocs/noindex.html +0 -9
- data/test/htdocs/rails_3_encoding_hack_form_test.html +0 -27
- data/test/htdocs/relative/tc_relative_links.html +0 -21
- data/test/htdocs/robots.html +0 -8
- data/test/htdocs/robots.txt +0 -2
- data/test/htdocs/tc_bad_charset.html +0 -9
- data/test/htdocs/tc_bad_links.html +0 -5
- data/test/htdocs/tc_base_link.html +0 -8
- data/test/htdocs/tc_blank_form.html +0 -11
- data/test/htdocs/tc_charset.html +0 -6
- data/test/htdocs/tc_checkboxes.html +0 -19
- data/test/htdocs/tc_encoded_links.html +0 -5
- data/test/htdocs/tc_field_precedence.html +0 -11
- data/test/htdocs/tc_follow_meta.html +0 -8
- data/test/htdocs/tc_form_action.html +0 -48
- data/test/htdocs/tc_links.html +0 -19
- data/test/htdocs/tc_meta_in_body.html +0 -9
- data/test/htdocs/tc_pretty_print.html +0 -17
- data/test/htdocs/tc_referer.html +0 -16
- data/test/htdocs/tc_relative_links.html +0 -19
- data/test/htdocs/tc_textarea.html +0 -23
- data/test/htdocs/test_click.html +0 -11
- data/test/htdocs/unusual______.html +0 -5
- data/test/test_mechanize.rb +0 -1164
- data/test/test_mechanize_cookie.rb +0 -451
- data/test/test_mechanize_cookie_jar.rb +0 -483
- data/test/test_mechanize_download.rb +0 -43
- data/test/test_mechanize_file.rb +0 -61
- data/test/test_mechanize_file_connection.rb +0 -21
- data/test/test_mechanize_file_request.rb +0 -19
- data/test/test_mechanize_file_saver.rb +0 -21
- data/test/test_mechanize_form.rb +0 -875
- data/test/test_mechanize_form_check_box.rb +0 -38
- data/test/test_mechanize_form_encoding.rb +0 -114
- data/test/test_mechanize_form_field.rb +0 -63
- data/test/test_mechanize_form_file_upload.rb +0 -20
- data/test/test_mechanize_form_image_button.rb +0 -12
- data/test/test_mechanize_form_keygen.rb +0 -32
- data/test/test_mechanize_form_multi_select_list.rb +0 -84
- data/test/test_mechanize_form_option.rb +0 -55
- data/test/test_mechanize_form_radio_button.rb +0 -78
- data/test/test_mechanize_form_select_list.rb +0 -76
- data/test/test_mechanize_form_textarea.rb +0 -52
- data/test/test_mechanize_headers.rb +0 -35
- data/test/test_mechanize_history.rb +0 -103
- data/test/test_mechanize_http_agent.rb +0 -1225
- data/test/test_mechanize_http_auth_challenge.rb +0 -39
- data/test/test_mechanize_http_auth_realm.rb +0 -49
- data/test/test_mechanize_http_content_disposition_parser.rb +0 -118
- data/test/test_mechanize_http_www_authenticate_parser.rb +0 -146
- data/test/test_mechanize_link.rb +0 -80
- data/test/test_mechanize_page.rb +0 -118
- data/test/test_mechanize_page_encoding.rb +0 -182
- data/test/test_mechanize_page_frame.rb +0 -16
- data/test/test_mechanize_page_link.rb +0 -390
- data/test/test_mechanize_page_meta_refresh.rb +0 -127
- data/test/test_mechanize_parser.rb +0 -289
- data/test/test_mechanize_pluggable_parser.rb +0 -52
- data/test/test_mechanize_redirect_limit_reached_error.rb +0 -24
- data/test/test_mechanize_redirect_not_get_or_head_error.rb +0 -14
- data/test/test_mechanize_subclass.rb +0 -22
- data/test/test_mechanize_util.rb +0 -103
- data/test/test_multi_select.rb +0 -119
@@ -1,13 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# This error is raised when a pluggable parser tries to parse a content type
|
3
|
-
# that it does not know how to handle. For example if Mechanize::Page were to
|
4
|
-
# try to parse a PDF, a ContentTypeError would be thrown.
|
5
|
-
|
6
|
-
class Mechanize::ContentTypeError < Mechanize::Error
|
7
|
-
attr_reader :content_type
|
8
|
-
|
9
|
-
def initialize(content_type)
|
10
|
-
@content_type = content_type
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
data/lib/mechanize/cookie.rb
DELETED
@@ -1,232 +0,0 @@
|
|
1
|
-
require 'time'
|
2
|
-
require 'webrick/cookie'
|
3
|
-
require 'domain_name'
|
4
|
-
|
5
|
-
# This class is used to represent an HTTP Cookie.
|
6
|
-
class Mechanize::Cookie
|
7
|
-
attr_reader :name
|
8
|
-
attr_accessor :value, :version
|
9
|
-
attr_accessor :domain, :path, :secure
|
10
|
-
attr_accessor :comment, :max_age
|
11
|
-
|
12
|
-
attr_accessor :session
|
13
|
-
|
14
|
-
attr_accessor :created_at
|
15
|
-
attr_accessor :accessed_at
|
16
|
-
|
17
|
-
# :call-seq:
|
18
|
-
# new(name, value)
|
19
|
-
# new(name, value, attr_hash)
|
20
|
-
# new(attr_hash)
|
21
|
-
#
|
22
|
-
# Creates a cookie object. For each key of +attr_hash+, the setter
|
23
|
-
# is called if defined. Each key can be either a symbol or a
|
24
|
-
# string, downcased or not.
|
25
|
-
#
|
26
|
-
# e.g.
|
27
|
-
# new("uid", "a12345")
|
28
|
-
# new("uid", "a12345", :domain => 'example.org',
|
29
|
-
# :for_domain => true, :expired => Time.now + 7*86400)
|
30
|
-
# new("name" => "uid", "value" => "a12345", "Domain" => 'www.example.org')
|
31
|
-
#
|
32
|
-
def initialize(*args)
|
33
|
-
@version = 0 # Netscape Cookie
|
34
|
-
|
35
|
-
@domain = @path = @secure = @comment = @max_age =
|
36
|
-
@expires = @comment_url = @discard = @port = nil
|
37
|
-
|
38
|
-
@created_at = @accessed_at = Time.now
|
39
|
-
case args.size
|
40
|
-
when 2
|
41
|
-
@name, @value = *args
|
42
|
-
@for_domain = false
|
43
|
-
return
|
44
|
-
when 3
|
45
|
-
@name, @value, attr_hash = *args
|
46
|
-
when 1
|
47
|
-
attr_hash = args.first
|
48
|
-
else
|
49
|
-
raise ArgumentError, "wrong number of arguments (#{args.size} for 1-3)"
|
50
|
-
end
|
51
|
-
for_domain = false
|
52
|
-
attr_hash.each_pair { |key, val|
|
53
|
-
skey = key.to_s.downcase
|
54
|
-
skey.sub!(/[!?]\z/, '')
|
55
|
-
case skey
|
56
|
-
when 'for_domain'
|
57
|
-
for_domain = !!val
|
58
|
-
when 'name'
|
59
|
-
@name = val
|
60
|
-
when 'value'
|
61
|
-
@value = val
|
62
|
-
else
|
63
|
-
setter = :"#{skey}="
|
64
|
-
send(setter, val) if respond_to?(setter)
|
65
|
-
end
|
66
|
-
}
|
67
|
-
@for_domain = for_domain
|
68
|
-
end
|
69
|
-
|
70
|
-
# If this flag is true, this cookie will be sent to any host in the
|
71
|
-
# +domain+. If it is false, this cookie will be sent only to the
|
72
|
-
# host indicated by the +domain+.
|
73
|
-
attr_accessor :for_domain
|
74
|
-
alias for_domain? for_domain
|
75
|
-
|
76
|
-
class << self
|
77
|
-
# Parses a Set-Cookie header line +str+ sent from +uri+ into an
|
78
|
-
# array of Cookie objects. Note that this array may contain
|
79
|
-
# nil's when some of the cookie-pairs are malformed.
|
80
|
-
def parse(uri, str, log = Mechanize.log)
|
81
|
-
return str.split(/,(?=[^;,]*=)|,$/).map { |c|
|
82
|
-
cookie_elem = c.split(/;+/)
|
83
|
-
first_elem = cookie_elem.shift
|
84
|
-
first_elem.strip!
|
85
|
-
key, value = first_elem.split(/\=/, 2)
|
86
|
-
|
87
|
-
begin
|
88
|
-
cookie = new(key, value.dup)
|
89
|
-
rescue
|
90
|
-
log.warn("Couldn't parse key/value: #{first_elem}") if log
|
91
|
-
next
|
92
|
-
end
|
93
|
-
|
94
|
-
cookie_elem.each do |pair|
|
95
|
-
pair.strip!
|
96
|
-
key, value = pair.split(/\=/, 2)
|
97
|
-
next unless key
|
98
|
-
value = WEBrick::HTTPUtils.dequote(value.strip) if value
|
99
|
-
|
100
|
-
case key.downcase
|
101
|
-
when 'domain'
|
102
|
-
begin
|
103
|
-
cookie.domain = value
|
104
|
-
cookie.for_domain = true
|
105
|
-
rescue
|
106
|
-
log.warn("Couldn't parse domain: #{value}") if log
|
107
|
-
end
|
108
|
-
when 'path'
|
109
|
-
cookie.path = value
|
110
|
-
when 'expires'
|
111
|
-
if value.empty?
|
112
|
-
cookie.session = true
|
113
|
-
next
|
114
|
-
end
|
115
|
-
|
116
|
-
begin
|
117
|
-
cookie.expires = Time::parse(value)
|
118
|
-
rescue
|
119
|
-
log.warn("Couldn't parse expires: #{value}") if log
|
120
|
-
end
|
121
|
-
when 'max-age'
|
122
|
-
begin
|
123
|
-
cookie.max_age = Integer(value)
|
124
|
-
rescue
|
125
|
-
log.warn("Couldn't parse max age '#{value}'") if log
|
126
|
-
end
|
127
|
-
when 'comment'
|
128
|
-
cookie.comment = value
|
129
|
-
when 'version'
|
130
|
-
begin
|
131
|
-
cookie.version = Integer(value)
|
132
|
-
rescue
|
133
|
-
log.warn("Couldn't parse version '#{value}'") if log
|
134
|
-
cookie.version = nil
|
135
|
-
end
|
136
|
-
when 'secure'
|
137
|
-
cookie.secure = true
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
cookie.path ||= (uri + './').path
|
142
|
-
cookie.secure ||= false
|
143
|
-
cookie.domain ||= uri.host
|
144
|
-
# Move this in to the cookie jar
|
145
|
-
yield cookie if block_given?
|
146
|
-
|
147
|
-
cookie
|
148
|
-
}
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
alias set_domain domain=
|
153
|
-
|
154
|
-
# Sets the domain attribute. A leading dot in +domain+ implies
|
155
|
-
# turning the +for_domain?+ flag on.
|
156
|
-
def domain=(domain)
|
157
|
-
if DomainName === domain
|
158
|
-
@domain_name = domain
|
159
|
-
else
|
160
|
-
domain.is_a?(String) or
|
161
|
-
(domain.respond_to?(:to_str) && (domain = domain.to_str).is_a?(String)) or
|
162
|
-
raise TypeError, "#{domain.class} is not a String"
|
163
|
-
if domain.start_with?('.')
|
164
|
-
@for_domain = true
|
165
|
-
domain = domain[1..-1]
|
166
|
-
end
|
167
|
-
# Do we really need to support this?
|
168
|
-
if domain.match(/\A([^:]+):[0-9]+\z/)
|
169
|
-
domain = $1
|
170
|
-
end
|
171
|
-
@domain_name = DomainName.new(domain)
|
172
|
-
end
|
173
|
-
set_domain(@domain_name.hostname)
|
174
|
-
end
|
175
|
-
|
176
|
-
def expires=(t)
|
177
|
-
@expires = t && (t.is_a?(Time) ? t.httpdate : t.to_s)
|
178
|
-
end
|
179
|
-
|
180
|
-
def expires
|
181
|
-
@expires && Time.parse(@expires)
|
182
|
-
end
|
183
|
-
|
184
|
-
def expired?
|
185
|
-
return false unless expires
|
186
|
-
Time.now > expires
|
187
|
-
end
|
188
|
-
|
189
|
-
alias secure? secure
|
190
|
-
|
191
|
-
def acceptable_from_uri?(uri)
|
192
|
-
host = DomainName.new(uri.host)
|
193
|
-
|
194
|
-
# RFC 6265 5.3
|
195
|
-
# When the user agent "receives a cookie":
|
196
|
-
return host.hostname == domain unless @for_domain
|
197
|
-
|
198
|
-
if host.cookie_domain?(@domain_name)
|
199
|
-
true
|
200
|
-
elsif host.hostname == domain
|
201
|
-
@for_domain = false
|
202
|
-
true
|
203
|
-
else
|
204
|
-
false
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
def valid_for_uri?(uri)
|
209
|
-
return false if secure? && uri.scheme != 'https'
|
210
|
-
acceptable_from_uri?(uri) && uri.path.start_with?(path)
|
211
|
-
end
|
212
|
-
|
213
|
-
def to_s
|
214
|
-
"#{@name}=#{@value}"
|
215
|
-
end
|
216
|
-
|
217
|
-
def init_with(coder)
|
218
|
-
yaml_initialize(coder.tag, coder.map)
|
219
|
-
end
|
220
|
-
|
221
|
-
def yaml_initialize(tag, map)
|
222
|
-
@for_domain = true # for forward compatibility
|
223
|
-
map.each { |key, value|
|
224
|
-
case key
|
225
|
-
when 'domain'
|
226
|
-
self.domain = value # ditto
|
227
|
-
else
|
228
|
-
instance_variable_set(:"@#{key}", value)
|
229
|
-
end
|
230
|
-
}
|
231
|
-
end
|
232
|
-
end
|
data/lib/mechanize/cookie_jar.rb
DELETED
@@ -1,194 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# This class is used to manage the Cookies that have been returned from
|
3
|
-
# any particular website.
|
4
|
-
|
5
|
-
class Mechanize::CookieJar
|
6
|
-
include Enumerable
|
7
|
-
|
8
|
-
# add_cookie wants something resembling a URI.
|
9
|
-
|
10
|
-
attr_reader :jar
|
11
|
-
|
12
|
-
def initialize
|
13
|
-
@jar = {}
|
14
|
-
end
|
15
|
-
|
16
|
-
def initialize_copy other # :nodoc:
|
17
|
-
@jar = Marshal.load Marshal.dump other.jar
|
18
|
-
end
|
19
|
-
|
20
|
-
# Add a +cookie+ to the jar if it is considered acceptable from
|
21
|
-
# +uri+. Return nil if the cookie was not added, otherwise return
|
22
|
-
# the cookie added.
|
23
|
-
def add(uri, cookie)
|
24
|
-
return nil unless cookie.acceptable_from_uri?(uri)
|
25
|
-
add!(cookie)
|
26
|
-
cookie
|
27
|
-
end
|
28
|
-
|
29
|
-
# Add a +cookie+ to the jar and return self.
|
30
|
-
def add!(cookie)
|
31
|
-
normal_domain = cookie.domain.downcase
|
32
|
-
|
33
|
-
@jar[normal_domain] ||= {} unless @jar.has_key?(normal_domain)
|
34
|
-
|
35
|
-
@jar[normal_domain][cookie.path] ||= {}
|
36
|
-
@jar[normal_domain][cookie.path][cookie.name] = cookie
|
37
|
-
|
38
|
-
self
|
39
|
-
end
|
40
|
-
alias << add!
|
41
|
-
|
42
|
-
# Fetch the cookies that should be used for the URI object passed in.
|
43
|
-
def cookies(url)
|
44
|
-
cleanup
|
45
|
-
url.path = '/' if url.path.empty?
|
46
|
-
now = Time.now
|
47
|
-
|
48
|
-
select { |cookie|
|
49
|
-
!cookie.expired? && cookie.valid_for_uri?(url) && (cookie.accessed_at = now)
|
50
|
-
}.sort_by { |cookie|
|
51
|
-
# RFC 6265 5.4
|
52
|
-
# Precedence: 1. longer path 2. older creation
|
53
|
-
[-cookie.path.length, cookie.created_at]
|
54
|
-
}
|
55
|
-
end
|
56
|
-
|
57
|
-
def empty?(url)
|
58
|
-
cookies(url).length > 0 ? false : true
|
59
|
-
end
|
60
|
-
|
61
|
-
def each
|
62
|
-
block_given? or return enum_for(__method__)
|
63
|
-
cleanup
|
64
|
-
@jar.each { |domain, paths|
|
65
|
-
paths.each { |path, hash|
|
66
|
-
hash.each_value { |cookie|
|
67
|
-
yield cookie
|
68
|
-
}
|
69
|
-
}
|
70
|
-
}
|
71
|
-
end
|
72
|
-
|
73
|
-
# Save the cookie jar to a file in the format specified.
|
74
|
-
#
|
75
|
-
# Available formats:
|
76
|
-
# :yaml <- YAML structure
|
77
|
-
# :cookiestxt <- Mozilla's cookies.txt format
|
78
|
-
def save_as(file, format = :yaml)
|
79
|
-
jar = dup
|
80
|
-
jar.cleanup true
|
81
|
-
|
82
|
-
open(file, 'w') { |f|
|
83
|
-
case format
|
84
|
-
when :yaml then
|
85
|
-
load_yaml
|
86
|
-
|
87
|
-
YAML.dump(jar.jar, f)
|
88
|
-
when :cookiestxt then
|
89
|
-
jar.dump_cookiestxt(f)
|
90
|
-
else
|
91
|
-
raise ArgumentError, "Unknown cookie jar file format"
|
92
|
-
end
|
93
|
-
}
|
94
|
-
|
95
|
-
self
|
96
|
-
end
|
97
|
-
|
98
|
-
# Load cookie jar from a file in the format specified.
|
99
|
-
#
|
100
|
-
# Available formats:
|
101
|
-
# :yaml <- YAML structure.
|
102
|
-
# :cookiestxt <- Mozilla's cookies.txt format
|
103
|
-
def load(file, format = :yaml)
|
104
|
-
@jar = open(file) { |f|
|
105
|
-
case format
|
106
|
-
when :yaml then
|
107
|
-
load_yaml
|
108
|
-
|
109
|
-
YAML.load(f)
|
110
|
-
when :cookiestxt then
|
111
|
-
load_cookiestxt(f)
|
112
|
-
else
|
113
|
-
raise ArgumentError, "Unknown cookie jar file format"
|
114
|
-
end
|
115
|
-
}
|
116
|
-
|
117
|
-
cleanup
|
118
|
-
|
119
|
-
self
|
120
|
-
end
|
121
|
-
|
122
|
-
def load_yaml # :nodoc:
|
123
|
-
begin
|
124
|
-
require 'psych'
|
125
|
-
rescue LoadError
|
126
|
-
end
|
127
|
-
|
128
|
-
require 'yaml'
|
129
|
-
end
|
130
|
-
|
131
|
-
# Clear the cookie jar
|
132
|
-
def clear!
|
133
|
-
@jar = {}
|
134
|
-
end
|
135
|
-
|
136
|
-
# Read cookies from Mozilla cookies.txt-style IO stream
|
137
|
-
def load_cookiestxt(io)
|
138
|
-
now = Time.now
|
139
|
-
|
140
|
-
io.each_line do |line|
|
141
|
-
line.chomp!
|
142
|
-
line.gsub!(/#.+/, '')
|
143
|
-
fields = line.split("\t")
|
144
|
-
|
145
|
-
next if fields.length != 7
|
146
|
-
|
147
|
-
expires_seconds = fields[4].to_i
|
148
|
-
expires = (expires_seconds == 0) ? nil : Time.at(expires_seconds)
|
149
|
-
next if expires and (expires < now)
|
150
|
-
|
151
|
-
c = Mechanize::Cookie.new(fields[5], fields[6])
|
152
|
-
c.domain = fields[0]
|
153
|
-
c.for_domain = (fields[1] == "TRUE") # Whether this cookie is for domain
|
154
|
-
c.path = fields[2] # Path for which the cookie is relevant
|
155
|
-
c.secure = (fields[3] == "TRUE") # Requires a secure connection
|
156
|
-
c.expires = expires # Time the cookie expires.
|
157
|
-
c.version = 0 # Conforms to Netscape cookie spec.
|
158
|
-
|
159
|
-
add!(c)
|
160
|
-
end
|
161
|
-
|
162
|
-
@jar
|
163
|
-
end
|
164
|
-
|
165
|
-
# Write cookies to Mozilla cookies.txt-style IO stream
|
166
|
-
def dump_cookiestxt(io)
|
167
|
-
to_a.each do |cookie|
|
168
|
-
io.puts([
|
169
|
-
cookie.domain,
|
170
|
-
cookie.for_domain? ? "TRUE" : "FALSE",
|
171
|
-
cookie.path,
|
172
|
-
cookie.secure ? "TRUE" : "FALSE",
|
173
|
-
cookie.expires.to_i.to_s,
|
174
|
-
cookie.name,
|
175
|
-
cookie.value
|
176
|
-
].join("\t"))
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
protected
|
181
|
-
|
182
|
-
# Remove expired cookies
|
183
|
-
def cleanup session = false
|
184
|
-
@jar.each do |domain, paths|
|
185
|
-
paths.each do |path, names|
|
186
|
-
names.each do |cookie_name, cookie|
|
187
|
-
paths[path].delete(cookie_name) if
|
188
|
-
cookie.expired? or (session and cookie.session)
|
189
|
-
end
|
190
|
-
end
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
data/lib/mechanize/download.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# Download is a pluggable parser for downloading files without loading them
|
3
|
-
# into memory first. You may subclass this class to handle content types you
|
4
|
-
# do not wish to load into memory first.
|
5
|
-
#
|
6
|
-
# See Mechanize::PluggableParser for instructions on using this class.
|
7
|
-
|
8
|
-
class Mechanize::Download
|
9
|
-
|
10
|
-
include Mechanize::Parser
|
11
|
-
|
12
|
-
##
|
13
|
-
# Accessor for the IO-like that contains the body
|
14
|
-
|
15
|
-
attr_reader :body_io
|
16
|
-
|
17
|
-
alias content body_io
|
18
|
-
|
19
|
-
##
|
20
|
-
# Creates a new download retrieved from the given +uri+ and +response+
|
21
|
-
# object. The +body_io+ is an IO-like containing the HTTP response body and
|
22
|
-
# +code+ is the HTTP status.
|
23
|
-
|
24
|
-
def initialize uri = nil, response = nil, body_io = nil, code = nil
|
25
|
-
@uri = uri
|
26
|
-
@body_io = body_io
|
27
|
-
@code = code
|
28
|
-
|
29
|
-
@full_path = false unless defined? @full_path
|
30
|
-
|
31
|
-
fill_header response
|
32
|
-
extract_filename
|
33
|
-
|
34
|
-
yield self if block_given?
|
35
|
-
end
|
36
|
-
|
37
|
-
##
|
38
|
-
# Saves a copy of the body_io to +filename+
|
39
|
-
|
40
|
-
def save filename = nil
|
41
|
-
filename = find_free_name filename
|
42
|
-
|
43
|
-
dirname = File.dirname filename
|
44
|
-
FileUtils.mkdir_p dirname
|
45
|
-
|
46
|
-
# Ruby 1.8.7 implements StringIO#path, can't use respond_to? :path
|
47
|
-
if StringIO === @body_io then
|
48
|
-
open filename, 'wb' do |io|
|
49
|
-
until @body_io.eof? do
|
50
|
-
io.write @body_io.read 16384
|
51
|
-
end
|
52
|
-
end
|
53
|
-
else
|
54
|
-
FileUtils.mv @body_io.path, filename
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
|