mechanize 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of mechanize might be problematic. Click here for more details.
- data/README +32 -0
- data/doc/classes/Net/HTTP.html +1716 -0
- data/doc/classes/Net/HTTP.src/M000103.html +18 -0
- data/doc/classes/Net/HTTP.src/M000104.html +18 -0
- data/doc/classes/Net/HTTP.src/M000105.html +18 -0
- data/doc/classes/Net/HTTP.src/M000106.html +18 -0
- data/doc/classes/Net/HTTP.src/M000107.html +29 -0
- data/doc/classes/Net/HTTP.src/M000108.html +18 -0
- data/doc/classes/Net/HTTP.src/M000109.html +22 -0
- data/doc/classes/Net/HTTP.src/M000110.html +18 -0
- data/doc/classes/Net/HTTP.src/M000111.html +18 -0
- data/doc/classes/Net/HTTP.src/M000112.html +18 -0
- data/doc/classes/Net/HTTP.src/M000113.html +18 -0
- data/doc/classes/Net/HTTP.src/M000114.html +22 -0
- data/doc/classes/Net/HTTP.src/M000115.html +29 -0
- data/doc/classes/Net/HTTP.src/M000116.html +18 -0
- data/doc/classes/Net/HTTP.src/M000117.html +19 -0
- data/doc/classes/Net/HTTP.src/M000118.html +19 -0
- data/doc/classes/Net/HTTP.src/M000119.html +18 -0
- data/doc/classes/Net/HTTP.src/M000121.html +18 -0
- data/doc/classes/Net/HTTP.src/M000122.html +28 -0
- data/doc/classes/Net/HTTP.src/M000123.html +19 -0
- data/doc/classes/Net/HTTP.src/M000124.html +30 -0
- data/doc/classes/Net/HTTP.src/M000125.html +18 -0
- data/doc/classes/Net/HTTP.src/M000126.html +18 -0
- data/doc/classes/Net/HTTP.src/M000127.html +18 -0
- data/doc/classes/Net/HTTP.src/M000128.html +18 -0
- data/doc/classes/Net/HTTP.src/M000129.html +18 -0
- data/doc/classes/Net/HTTP.src/M000130.html +18 -0
- data/doc/classes/Net/HTTP.src/M000133.html +28 -0
- data/doc/classes/Net/HTTP.src/M000134.html +20 -0
- data/doc/classes/Net/HTTP.src/M000135.html +28 -0
- data/doc/classes/Net/HTTP.src/M000136.html +18 -0
- data/doc/classes/Net/HTTP.src/M000137.html +18 -0
- data/doc/classes/Net/HTTP.src/M000138.html +18 -0
- data/doc/classes/Net/HTTP.src/M000139.html +18 -0
- data/doc/classes/Net/HTTP.src/M000140.html +18 -0
- data/doc/classes/Net/HTTP.src/M000141.html +18 -0
- data/doc/classes/Net/HTTP.src/M000142.html +18 -0
- data/doc/classes/Net/HTTP.src/M000143.html +18 -0
- data/doc/classes/Net/HTTP.src/M000144.html +18 -0
- data/doc/classes/Net/HTTP.src/M000145.html +18 -0
- data/doc/classes/Net/HTTP.src/M000146.html +18 -0
- data/doc/classes/Net/HTTP.src/M000147.html +18 -0
- data/doc/classes/Net/HTTP.src/M000148.html +18 -0
- data/doc/classes/Net/HTTP.src/M000152.html +19 -0
- data/doc/classes/Net/HTTP.src/M000153.html +39 -0
- data/doc/classes/Net/HTTP.src/M000154.html +18 -0
- data/doc/classes/Net/HTTP.src/M000156.html +24 -0
- data/doc/classes/Net/HTTP.src/M000157.html +18 -0
- data/doc/classes/Net/HTTP.src/M000158.html +19 -0
- data/doc/classes/Net/HTTP.src/M000159.html +21 -0
- data/doc/classes/Net/HTTP.src/M000161.html +19 -0
- data/doc/classes/Net/HTTP/Copy.html +134 -0
- data/doc/classes/Net/HTTP/Delete.html +134 -0
- data/doc/classes/Net/HTTP/Get.html +134 -0
- data/doc/classes/Net/HTTP/Head.html +134 -0
- data/doc/classes/Net/HTTP/Lock.html +134 -0
- data/doc/classes/Net/HTTP/Mkcol.html +134 -0
- data/doc/classes/Net/HTTP/Move.html +134 -0
- data/doc/classes/Net/HTTP/Options.html +134 -0
- data/doc/classes/Net/HTTP/Post.html +134 -0
- data/doc/classes/Net/HTTP/Propfind.html +134 -0
- data/doc/classes/Net/HTTP/Proppatch.html +134 -0
- data/doc/classes/Net/HTTP/Put.html +134 -0
- data/doc/classes/Net/HTTP/Trace.html +134 -0
- data/doc/classes/Net/HTTP/Unlock.html +134 -0
- data/doc/classes/Net/HTTPError.html +120 -0
- data/doc/classes/Net/HTTPExceptions.html +137 -0
- data/doc/classes/Net/HTTPFatalError.html +120 -0
- data/doc/classes/Net/HTTPGenericRequest.html +274 -0
- data/doc/classes/Net/HTTPGenericRequest.src/M000088.html +26 -0
- data/doc/classes/Net/HTTPGenericRequest.src/M000089.html +18 -0
- data/doc/classes/Net/HTTPGenericRequest.src/M000090.html +18 -0
- data/doc/classes/Net/HTTPGenericRequest.src/M000091.html +18 -0
- data/doc/classes/Net/HTTPGenericRequest.src/M000092.html +19 -0
- data/doc/classes/Net/HTTPGenericRequest.src/M000093.html +20 -0
- data/doc/classes/Net/HTTPGenericRequest.src/M000094.html +20 -0
- data/doc/classes/Net/HTTPHeader.html +734 -0
- data/doc/classes/Net/HTTPHeader.src/M000055.html +23 -0
- data/doc/classes/Net/HTTPHeader.src/M000056.html +19 -0
- data/doc/classes/Net/HTTPHeader.src/M000057.html +22 -0
- data/doc/classes/Net/HTTPHeader.src/M000058.html +22 -0
- data/doc/classes/Net/HTTPHeader.src/M000059.html +19 -0
- data/doc/classes/Net/HTTPHeader.src/M000060.html +19 -0
- data/doc/classes/Net/HTTPHeader.src/M000061.html +20 -0
- data/doc/classes/Net/HTTPHeader.src/M000063.html +18 -0
- data/doc/classes/Net/HTTPHeader.src/M000065.html +20 -0
- data/doc/classes/Net/HTTPHeader.src/M000066.html +20 -0
- data/doc/classes/Net/HTTPHeader.src/M000067.html +18 -0
- data/doc/classes/Net/HTTPHeader.src/M000068.html +18 -0
- data/doc/classes/Net/HTTPHeader.src/M000069.html +18 -0
- data/doc/classes/Net/HTTPHeader.src/M000070.html +20 -0
- data/doc/classes/Net/HTTPHeader.src/M000072.html +30 -0
- data/doc/classes/Net/HTTPHeader.src/M000073.html +43 -0
- data/doc/classes/Net/HTTPHeader.src/M000075.html +21 -0
- data/doc/classes/Net/HTTPHeader.src/M000076.html +22 -0
- data/doc/classes/Net/HTTPHeader.src/M000077.html +20 -0
- data/doc/classes/Net/HTTPHeader.src/M000078.html +21 -0
- data/doc/classes/Net/HTTPHeader.src/M000079.html +19 -0
- data/doc/classes/Net/HTTPHeader.src/M000080.html +18 -0
- data/doc/classes/Net/HTTPHeader.src/M000081.html +19 -0
- data/doc/classes/Net/HTTPHeader.src/M000082.html +19 -0
- data/doc/classes/Net/HTTPHeader.src/M000083.html +23 -0
- data/doc/classes/Net/HTTPHeader.src/M000084.html +18 -0
- data/doc/classes/Net/HTTPHeader.src/M000086.html +18 -0
- data/doc/classes/Net/HTTPHeader.src/M000087.html +18 -0
- data/doc/classes/Net/HTTPRequest.html +150 -0
- data/doc/classes/Net/HTTPRequest.src/M000102.html +21 -0
- data/doc/classes/Net/HTTPResponse.html +425 -0
- data/doc/classes/Net/HTTPResponse.src/M000162.html +18 -0
- data/doc/classes/Net/HTTPResponse.src/M000163.html +18 -0
- data/doc/classes/Net/HTTPResponse.src/M000164.html +23 -0
- data/doc/classes/Net/HTTPResponse.src/M000165.html +18 -0
- data/doc/classes/Net/HTTPResponse.src/M000166.html +32 -0
- data/doc/classes/Net/HTTPResponse.src/M000167.html +18 -0
- data/doc/classes/Net/HTTPRetriableError.html +120 -0
- data/doc/classes/Net/HTTPServerException.html +120 -0
- data/doc/classes/Net/ProtoAuthError.html +113 -0
- data/doc/classes/Net/ProtoCommandError.html +113 -0
- data/doc/classes/Net/ProtoFatalError.html +113 -0
- data/doc/classes/Net/ProtoRetriableError.html +113 -0
- data/doc/classes/Net/ProtoServerError.html +113 -0
- data/doc/classes/Net/ProtoSyntaxError.html +113 -0
- data/doc/classes/Net/ProtoUnknownError.html +113 -0
- data/doc/classes/Net/ProtocolError.html +111 -0
- data/doc/classes/Net/WriteAdapter.html +235 -0
- data/doc/classes/Net/WriteAdapter.src/M000095.html +19 -0
- data/doc/classes/Net/WriteAdapter.src/M000096.html +18 -0
- data/doc/classes/Net/WriteAdapter.src/M000097.html +18 -0
- data/doc/classes/Net/WriteAdapter.src/M000099.html +19 -0
- data/doc/classes/Net/WriteAdapter.src/M000100.html +18 -0
- data/doc/classes/Net/WriteAdapter.src/M000101.html +18 -0
- data/doc/classes/REXML.html +109 -0
- data/doc/classes/REXML/Comment.html +137 -0
- data/doc/classes/REXML/Comment.src/M000053.html +18 -0
- data/doc/classes/REXML/Node.html +240 -0
- data/doc/classes/REXML/Node.src/M000047.html +21 -0
- data/doc/classes/REXML/Node.src/M000048.html +21 -0
- data/doc/classes/REXML/Node.src/M000049.html +22 -0
- data/doc/classes/REXML/Node.src/M000050.html +18 -0
- data/doc/classes/REXML/Node.src/M000051.html +18 -0
- data/doc/classes/REXML/Node.src/M000052.html +18 -0
- data/doc/classes/REXML/Text.html +137 -0
- data/doc/classes/REXML/Text.src/M000054.html +18 -0
- data/doc/classes/WWW.html +130 -0
- data/doc/classes/WWW/Button.html +190 -0
- data/doc/classes/WWW/Button.src/M000028.html +18 -0
- data/doc/classes/WWW/Button.src/M000029.html +18 -0
- data/doc/classes/WWW/Button.src/M000030.html +25 -0
- data/doc/classes/WWW/CheckBox.html +160 -0
- data/doc/classes/WWW/CheckBox.src/M000024.html +18 -0
- data/doc/classes/WWW/Cookie.html +207 -0
- data/doc/classes/WWW/Cookie.src/M000032.html +59 -0
- data/doc/classes/WWW/Cookie.src/M000033.html +21 -0
- data/doc/classes/WWW/Cookie.src/M000034.html +18 -0
- data/doc/classes/WWW/CookieJar.html +197 -0
- data/doc/classes/WWW/CookieJar.src/M000008.html +18 -0
- data/doc/classes/WWW/CookieJar.src/M000009.html +22 -0
- data/doc/classes/WWW/CookieJar.src/M000010.html +33 -0
- data/doc/classes/WWW/CookieJar.src/M000011.html +18 -0
- data/doc/classes/WWW/Field.html +174 -0
- data/doc/classes/WWW/Field.src/M000045.html +18 -0
- data/doc/classes/WWW/Field.src/M000046.html +26 -0
- data/doc/classes/WWW/FileUpload.html +163 -0
- data/doc/classes/WWW/FileUpload.src/M000031.html +19 -0
- data/doc/classes/WWW/Form.html +152 -0
- data/doc/classes/WWW/Form.src/M000044.html +19 -0
- data/doc/classes/WWW/GlobalForm.html +271 -0
- data/doc/classes/WWW/GlobalForm.src/M000004.html +24 -0
- data/doc/classes/WWW/GlobalForm.src/M000005.html +26 -0
- data/doc/classes/WWW/GlobalForm.src/M000006.html +46 -0
- data/doc/classes/WWW/GlobalForm.src/M000007.html +46 -0
- data/doc/classes/WWW/ImageButton.html +157 -0
- data/doc/classes/WWW/ImageButton.src/M000027.html +22 -0
- data/doc/classes/WWW/Link.html +160 -0
- data/doc/classes/WWW/Link.src/M000025.html +20 -0
- data/doc/classes/WWW/Mechanize.html +379 -0
- data/doc/classes/WWW/Mechanize.src/M000013.html +21 -0
- data/doc/classes/WWW/Mechanize.src/M000014.html +18 -0
- data/doc/classes/WWW/Mechanize.src/M000015.html +24 -0
- data/doc/classes/WWW/Mechanize.src/M000016.html +19 -0
- data/doc/classes/WWW/Mechanize.src/M000017.html +23 -0
- data/doc/classes/WWW/Mechanize.src/M000018.html +32 -0
- data/doc/classes/WWW/Mechanize.src/M000019.html +19 -0
- data/doc/classes/WWW/Mechanize.src/M000020.html +18 -0
- data/doc/classes/WWW/Mechanize.src/M000021.html +33 -0
- data/doc/classes/WWW/Mechanize.src/M000022.html +18 -0
- data/doc/classes/WWW/Meta.html +113 -0
- data/doc/classes/WWW/Page.html +313 -0
- data/doc/classes/WWW/Page.src/M000036.html +18 -0
- data/doc/classes/WWW/Page.src/M000037.html +18 -0
- data/doc/classes/WWW/Page.src/M000038.html +18 -0
- data/doc/classes/WWW/Page.src/M000039.html +19 -0
- data/doc/classes/WWW/Page.src/M000040.html +19 -0
- data/doc/classes/WWW/Page.src/M000041.html +19 -0
- data/doc/classes/WWW/Page.src/M000042.html +19 -0
- data/doc/classes/WWW/Page.src/M000043.html +19 -0
- data/doc/classes/WWW/RadioButton.html +160 -0
- data/doc/classes/WWW/RadioButton.src/M000012.html +18 -0
- data/doc/classes/WWW/ResponseCodeError.html +150 -0
- data/doc/classes/WWW/ResponseCodeError.src/M000035.html +18 -0
- data/doc/classes/WWW/SelectList.html +160 -0
- data/doc/classes/WWW/SelectList.src/M000026.html +28 -0
- data/doc/created.rid +1 -0
- data/doc/files/CHANGELOG.html +136 -0
- data/doc/files/LICENSE.html +531 -0
- data/doc/files/README.html +161 -0
- data/doc/files/lib/mechanize/cookie_rb.html +101 -0
- data/doc/files/lib/mechanize/net-overrides/net/http_rb.html +139 -0
- data/doc/files/lib/mechanize/net-overrides/net/https_rb.html +109 -0
- data/doc/files/lib/mechanize/net-overrides/net/protocol_rb.html +117 -0
- data/doc/files/lib/mechanize/parsing_rb.html +267 -0
- data/doc/files/lib/mechanize/parsing_rb.src/M000001.html +22 -0
- data/doc/files/lib/mechanize/parsing_rb.src/M000002.html +44 -0
- data/doc/files/lib/mechanize/parsing_rb.src/M000003.html +34 -0
- data/doc/files/lib/mechanize_rb.html +152 -0
- data/doc/fr_class_index.html +80 -0
- data/doc/fr_file_index.html +35 -0
- data/doc/fr_method_index.html +194 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/lib/mechanize.rb +128 -26
- data/lib/mechanize/cookie.rb +98 -0
- data/lib/mechanize/net-overrides/net/http.rb +2 -2
- data/test/README +7 -0
- data/test/htdocs/find_link.html +40 -0
- data/test/htdocs/form_test.html +154 -0
- data/test/htdocs/google.html +13 -0
- data/test/htdocs/index.html +6 -0
- data/test/server.rb +19 -0
- data/test/servlets.rb +130 -0
- data/test/tc_cookies.rb +125 -0
- data/test/tc_forms.rb +339 -0
- data/test/tc_links.rb +25 -0
- data/test/tc_mech.rb +70 -0
- data/test/tc_response_code.rb +31 -0
- data/test/ts_mech.rb +9 -0
- metadata +310 -41
- data/Rakefile +0 -14
- data/examples/rubyforge.rb +0 -13
- data/mechanize.gemspec +0 -22
@@ -0,0 +1,98 @@
|
|
1
|
+
module WWW
|
2
|
+
class Cookie
|
3
|
+
attr_reader :name, :value, :path, :domain, :expires, :secure
|
4
|
+
def initialize(url, cookie_text)
|
5
|
+
cookie = Hash.new
|
6
|
+
cookie_text.split(/; /).each do |data|
|
7
|
+
name, value = data.split('=', 2)
|
8
|
+
next unless name
|
9
|
+
cookie[name] = value ? URI::unescape(value) : nil
|
10
|
+
end
|
11
|
+
|
12
|
+
@path = cookie.delete(
|
13
|
+
cookie.keys.find { |k| k.downcase == "path" }
|
14
|
+
) || url.path
|
15
|
+
|
16
|
+
expires_key = cookie.keys.find { |k| k.downcase == "expires" }
|
17
|
+
if expires_key
|
18
|
+
@expires = DateTime.parse(cookie.delete(expires_key),
|
19
|
+
"%A %d-%b-%y %H:%M:%S %Z")
|
20
|
+
end
|
21
|
+
|
22
|
+
secure_key = cookie.keys.find { |k| k.downcase == "secure" }
|
23
|
+
if secure_key
|
24
|
+
@secure = true
|
25
|
+
cookie.delete(secure_key)
|
26
|
+
else
|
27
|
+
@secure = false
|
28
|
+
end
|
29
|
+
|
30
|
+
# Set the domain name of the cookie
|
31
|
+
domain_key = cookie.keys.find { |k| k.downcase == "domain" }
|
32
|
+
if domain_key
|
33
|
+
domain = cookie.delete(domain_key)
|
34
|
+
domain.sub!(/^\./, '')
|
35
|
+
if url.host =~ /#{domain}$/
|
36
|
+
@domain = domain
|
37
|
+
end
|
38
|
+
else
|
39
|
+
@domain = url.host
|
40
|
+
end
|
41
|
+
|
42
|
+
cookie.each { |k,v|
|
43
|
+
@name = k.strip
|
44
|
+
@value = v.strip
|
45
|
+
@string = "#{k}=#{URI::escape(v)}"
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
def Cookie::parse(uri, raw_cookie, &block)
|
50
|
+
esc = raw_cookie.gsub(/(expires=[^,]*),([^;]*(;|$))/i) { "#{$1}#{$2}" }
|
51
|
+
esc.split(/,/).each do |cookie|
|
52
|
+
yield Cookie.new(uri, cookie)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_s
|
57
|
+
@string
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class CookieJar
|
62
|
+
attr_accessor :jar
|
63
|
+
def initialize
|
64
|
+
@jar = {}
|
65
|
+
end
|
66
|
+
|
67
|
+
def add(cookie)
|
68
|
+
unless @jar.has_key?(cookie.domain)
|
69
|
+
@jar[cookie.domain] = Hash.new
|
70
|
+
end
|
71
|
+
|
72
|
+
@jar[cookie.domain][cookie.name] = cookie
|
73
|
+
end
|
74
|
+
|
75
|
+
def cookies(url)
|
76
|
+
cookies = []
|
77
|
+
@jar.each_key do |domain|
|
78
|
+
if url.host =~ /#{domain}$/
|
79
|
+
@jar[domain].each_key do |name|
|
80
|
+
if url.path =~ /^#{@jar[domain][name].path}/
|
81
|
+
if @jar[domain][name].expires.nil?
|
82
|
+
cookies << @jar[domain][name]
|
83
|
+
elsif DateTime.now < @jar[domain][name].expires
|
84
|
+
cookies << @jar[domain][name]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
cookies
|
92
|
+
end
|
93
|
+
|
94
|
+
def empty?(url)
|
95
|
+
cookies(url).length > 0 ? false : true
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -1059,7 +1059,7 @@ module Net # :nodoc:
|
|
1059
1059
|
# p request['X-My-Header'] #=> "a, b, c"
|
1060
1060
|
# p request.get_fields('X-My-Header') #=> ["a", "b", "c"]
|
1061
1061
|
#
|
1062
|
-
def
|
1062
|
+
def add_field(key, val)
|
1063
1063
|
if @header.key?(key.downcase)
|
1064
1064
|
@header[key.downcase].concat Array(val)
|
1065
1065
|
else
|
@@ -1839,7 +1839,7 @@ module Net # :nodoc:
|
|
1839
1839
|
httpv, code, msg = read_status_line(sock)
|
1840
1840
|
res = response_class(code).new(httpv, code, msg)
|
1841
1841
|
each_response_header(sock) do |k,v|
|
1842
|
-
res.
|
1842
|
+
res.add_field k, v
|
1843
1843
|
end
|
1844
1844
|
res
|
1845
1845
|
end
|
data/test/README
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<meta http_equiv="Refresh" content="0; url=http://www.incorrect.com">
|
4
|
+
<meta http-equiv="Rfresh" content="0; url=http://www.also-wrong.com">
|
5
|
+
<meta http-equiv="Refresh" content="0; url=http://www.drphil.com/">
|
6
|
+
<META HTTP-EQUIV="REFRESH" CONTENT="0; URL=HTTP://WWW.UPCASE.COM/">
|
7
|
+
<TITLE>Testing the links</TITLE>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
<A HREF="http://blargle.com/">blargle</A>
|
11
|
+
<A HREF="http://a.cpan.org/">CPAN A</A>
|
12
|
+
<A HREF="http://b.cpan.org/">CPAN B</A>
|
13
|
+
<FRAME SRC="foo.html">
|
14
|
+
<FRAME SRC="bar.html">
|
15
|
+
<A HREF="http://c.cpan.org/" NAME="bongo">CPAN C</A>
|
16
|
+
<A HREF="http://d.cpan.org/">CPAN D</A>
|
17
|
+
|
18
|
+
<A HREF="http://www.msnbc.com/">MSNBC</A>
|
19
|
+
<FRAME SRC="http://www.oreilly.com/" NAME="wongo">
|
20
|
+
<A HREF="http://www.cnn.com/">CNN</A>
|
21
|
+
<A HREF="http://www.bbc.co.uk/" NAME="Wilma">BBC</A>
|
22
|
+
<A HREF="http://www.msnbc.com/">News</A>
|
23
|
+
<A HREF="http://www.cnn.com/" NAME="Fred">News</A>
|
24
|
+
<A HREF="http://www.bbc.co.uk/">News</A>
|
25
|
+
<A onmouseover="window.status='Rebuild Files'; return true" href="#" onClick="window.open( '/cgi-bin/MT/mt.cgi', 'rebuild', 'width=400,height=200,resizable=yes')">Rebuild Index</A>
|
26
|
+
|
27
|
+
<MAP NAME="SOME_MAP">
|
28
|
+
<AREA HREF="http://www.msnbc.com/area" COORDS="1,2,3,4"></AREA>
|
29
|
+
<AREA HREF="http://www.cnn.com/area" COORDS="5,6,7,8" NAME="Marty">
|
30
|
+
<AREA HREF="http://www.cpan.org/area" COORDS="10,11,12,13" />
|
31
|
+
</MAP>
|
32
|
+
<IMG SRC="SOME_IMAGE" USEMAP="#SOME_MAP">
|
33
|
+
|
34
|
+
<!-- new stuff -->
|
35
|
+
<A HREF="http://nowhere.org/" Name="Here">NoWhere</A>
|
36
|
+
<A HREF="http://nowhere.org/padded" Name=" Here "> NoWhere </A>
|
37
|
+
<A HREF="blongo.html">Blongo!</A>
|
38
|
+
</body>
|
39
|
+
</html>
|
40
|
+
|
@@ -0,0 +1,154 @@
|
|
1
|
+
<html>
|
2
|
+
<head><title>Page Title</title></head>
|
3
|
+
<body>
|
4
|
+
<h1>Hello World!</h1>
|
5
|
+
<form name="post_form1" method="post" action="/form_post">
|
6
|
+
<table>
|
7
|
+
<tr>
|
8
|
+
<td>First Name</td>
|
9
|
+
<td><input type="text" name="first_name" /></td>
|
10
|
+
</tr>
|
11
|
+
<tr>
|
12
|
+
<td>Gender</td>
|
13
|
+
<td>
|
14
|
+
M: <input type="radio" name="gender" value="male" /><br />
|
15
|
+
F: <input type="radio" name="gender" value="female" /><br />
|
16
|
+
</td>
|
17
|
+
</tr>
|
18
|
+
<tr>
|
19
|
+
<td>Check this if you are cool:</td>
|
20
|
+
<td><input type="checkbox" name="cool person" /></td>
|
21
|
+
</tr>
|
22
|
+
<tr>
|
23
|
+
<td>Check this if you like ham:</td>
|
24
|
+
<td><input type="checkbox" name="likes ham" /></td>
|
25
|
+
</tr>
|
26
|
+
</table><br />
|
27
|
+
<input type="submit" value="Submit" />
|
28
|
+
</form>
|
29
|
+
<form name="get_form1" method="get" action="/form_post">
|
30
|
+
<table>
|
31
|
+
<tr>
|
32
|
+
<td>First Name</td>
|
33
|
+
<td><input type="text" name="first_name" /></td>
|
34
|
+
</tr>
|
35
|
+
<tr>
|
36
|
+
<td>Gender</td>
|
37
|
+
<td>
|
38
|
+
M: <input type="radio" name="gender" value="male" /><br />
|
39
|
+
F: <input type="radio" name="gender" value="female" /><br />
|
40
|
+
</td>
|
41
|
+
</tr>
|
42
|
+
<tr>
|
43
|
+
<td>Check this if you are cool:</td>
|
44
|
+
<td><input type="checkbox" name="cool person" /></td>
|
45
|
+
</tr>
|
46
|
+
<tr>
|
47
|
+
<td>Check this if you like ham:</td>
|
48
|
+
<td><input type="checkbox" name="likes ham" /></td>
|
49
|
+
</tr>
|
50
|
+
</table><br />
|
51
|
+
<input type="submit" value="Submit" />
|
52
|
+
</form>
|
53
|
+
|
54
|
+
<!-- Get ant post to a form with a space in the name -->
|
55
|
+
<form name="post_form2" method="post" action="/form post">
|
56
|
+
<table>
|
57
|
+
<tr>
|
58
|
+
<td>First Name</td>
|
59
|
+
<td><input type="text" name="first_name" /></td>
|
60
|
+
</tr>
|
61
|
+
<tr>
|
62
|
+
<td>Gender</td>
|
63
|
+
<td>
|
64
|
+
M: <input type="radio" name="gender" value="male" /><br />
|
65
|
+
F: <input type="radio" name="gender" value="female" /><br />
|
66
|
+
</td>
|
67
|
+
</tr>
|
68
|
+
<tr>
|
69
|
+
<td>Check this if you are cool:</td>
|
70
|
+
<td><input type="checkbox" name="cool person" /></td>
|
71
|
+
</tr>
|
72
|
+
<tr>
|
73
|
+
<td>Check this if you like ham:</td>
|
74
|
+
<td><input type="checkbox" name="likes ham" /></td>
|
75
|
+
</tr>
|
76
|
+
</table><br />
|
77
|
+
<input type="submit" value="Submit" />
|
78
|
+
</form>
|
79
|
+
<form name="get_form2" method="get" action="/form post">
|
80
|
+
<table>
|
81
|
+
<tr>
|
82
|
+
<td>First Name</td>
|
83
|
+
<td><input type="text" name="first_name" /></td>
|
84
|
+
</tr>
|
85
|
+
<tr>
|
86
|
+
<td>Gender</td>
|
87
|
+
<td>
|
88
|
+
M: <input type="radio" name="gender" value="male" /><br />
|
89
|
+
F: <input type="radio" name="gender" value="female" /><br />
|
90
|
+
</td>
|
91
|
+
</tr>
|
92
|
+
<tr>
|
93
|
+
<td>Check this if you are cool:</td>
|
94
|
+
<td><input type="checkbox" name="cool person" /></td>
|
95
|
+
</tr>
|
96
|
+
<tr>
|
97
|
+
<td>Check this if you like ham:</td>
|
98
|
+
<td><input type="checkbox" name="likes ham" /></td>
|
99
|
+
</tr>
|
100
|
+
</table><br />
|
101
|
+
<input type="submit" value="Submit" />
|
102
|
+
</form>
|
103
|
+
|
104
|
+
<!-- forms with parameters in the action -->
|
105
|
+
<form name="post_form3" method="post" action="/form_post?great day=yes&one=two">
|
106
|
+
<table>
|
107
|
+
<tr>
|
108
|
+
<td>First Name</td>
|
109
|
+
<td><input type="text" name="first_name" /></td>
|
110
|
+
</tr>
|
111
|
+
<tr>
|
112
|
+
<td>Gender</td>
|
113
|
+
<td>
|
114
|
+
M: <input type="radio" name="gender" value="male" /><br />
|
115
|
+
F: <input type="radio" name="gender" value="female" /><br />
|
116
|
+
</td>
|
117
|
+
</tr>
|
118
|
+
<tr>
|
119
|
+
<td>Check this if you are cool:</td>
|
120
|
+
<td><input type="checkbox" name="cool person" /></td>
|
121
|
+
</tr>
|
122
|
+
<tr>
|
123
|
+
<td>Check this if you like ham:</td>
|
124
|
+
<td><input type="checkbox" name="likes ham" /></td>
|
125
|
+
</tr>
|
126
|
+
</table><br />
|
127
|
+
<input type="submit" value="Submit" />
|
128
|
+
</form>
|
129
|
+
<form name="get_form3" method="get" action="/form_post?great day=yes&one=two">
|
130
|
+
<table>
|
131
|
+
<tr>
|
132
|
+
<td>First Name</td>
|
133
|
+
<td><input type="text" name="first_name" /></td>
|
134
|
+
</tr>
|
135
|
+
<tr>
|
136
|
+
<td>Gender</td>
|
137
|
+
<td>
|
138
|
+
M: <input type="radio" name="gender" value="male" /><br />
|
139
|
+
F: <input type="radio" name="gender" value="female" /><br />
|
140
|
+
</td>
|
141
|
+
</tr>
|
142
|
+
<tr>
|
143
|
+
<td>Check this if you are cool:</td>
|
144
|
+
<td><input type="checkbox" name="cool person" /></td>
|
145
|
+
</tr>
|
146
|
+
<tr>
|
147
|
+
<td>Check this if you like ham:</td>
|
148
|
+
<td><input type="checkbox" name="likes ham" /></td>
|
149
|
+
</tr>
|
150
|
+
</table><br />
|
151
|
+
<input type="submit" value="Submit" />
|
152
|
+
</form>
|
153
|
+
</body>
|
154
|
+
</html>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title><style><!--
|
2
|
+
body,td,a,p,.h{font-family:arial,sans-serif;}
|
3
|
+
.h{font-size: 20px;}
|
4
|
+
.q{color:#0000cc;}
|
5
|
+
//-->
|
6
|
+
</style>
|
7
|
+
<script>
|
8
|
+
<!--
|
9
|
+
function sf(){document.f.q.focus();}
|
10
|
+
// -->
|
11
|
+
</script>
|
12
|
+
</head><body bgcolor=#ffffff text=#000000 link=#0000cc vlink=#551a8b alink=#ff0000 onLoad=sf() topmargin=3 marginheight=3><center><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td align=right nowrap><font size=-1><a href="/url?sa=p&pref=ig&pval=2&q=http://www.google.com/ig%3Fhl%3Den">Personalized Home</a> | <a href="https://www.google.com/accounts/Login?continue=http://www.google.com/&hl=en">Sign in</a></font></td></tr><tr height=4><td><img alt="" width=1 height=1></td></tr></table><img src="/intl/en/images/logo.gif" width=276 height=110 alt="Google"><br><br>
|
13
|
+
<form action=/search name=f><table border=0 cellspacing=0 cellpadding=4><tr><td nowrap><font size=-1><b>Web</b> <a id=1a class=q href="/imghp?hl=en&tab=wi&ie=UTF-8">Images</a> <a id=2a class=q href="http://groups.google.com/grphp?hl=en&tab=wg&ie=UTF-8">Groups</a> <a id=4a class=q href="http://news.google.com/nwshp?hl=en&tab=wn&ie=UTF-8">News</a> <a id=5a class=q href="http://froogle.google.com/frghp?hl=en&tab=wf&ie=UTF-8">Froogle</a> <a id=7a class=q href="/lochp?hl=en&tab=wl&ie=UTF-8">Local</a> <b><a href="/intl/en/options/" class=q>more »</a></b></font></td></tr></table><table cellspacing=0 cellpadding=0><tr><td width=25%> </td><td align=center><input type=hidden name=hl value=en><input type=hidden name=ie value="ISO-8859-1"><input maxlength=2048 size=55 name=q value="" title="Google Search"><br><input type=submit value="Google Search" name=btnG><input type=submit value="I'm Feeling Lucky" name=btnI></td><td valign=top nowrap width=25%><font size=-2> <a href=/advanced_search?hl=en>Advanced Search</a><br> <a href=/preferences?hl=en>Preferences</a><br> <a href=/language_tools?hl=en>Language Tools</a></font></td></tr></table></form><br><br><font size=-1><a href="/ads/">Advertising Programs</a> - <a href=/services/>Business Solutions</a> - <a href=/intl/en/about.html>About Google</a></font><p><font size=-2>©2006 Google</font></p></center></body></html>
|
data/test/server.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'webrick'
|
2
|
+
require 'servlets'
|
3
|
+
|
4
|
+
s = WEBrick::HTTPServer.new(
|
5
|
+
:Port => 2000,
|
6
|
+
:DocumentRoot => Dir::pwd + "/htdocs"
|
7
|
+
)
|
8
|
+
s.mount("/one_cookie", OneCookieTest)
|
9
|
+
s.mount("/many_cookies", ManyCookiesTest)
|
10
|
+
s.mount("/many_cookies_as_string", ManyCookiesAsStringTest)
|
11
|
+
s.mount("/send_cookies", SendCookiesTest)
|
12
|
+
s.mount("/form_post", FormTest)
|
13
|
+
s.mount("/form post", FormTest)
|
14
|
+
s.mount("/response_code", ResponseCodeTest)
|
15
|
+
|
16
|
+
trap("INT") { s.stop }
|
17
|
+
|
18
|
+
s.start
|
19
|
+
|
data/test/servlets.rb
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'webrick'
|
2
|
+
require 'logger'
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
class ResponseCodeTest < WEBrick::HTTPServlet::AbstractServlet
|
6
|
+
def do_GET(req, res)
|
7
|
+
res['Content-Type'] = "text/html"
|
8
|
+
if req.query['code']
|
9
|
+
code = req.query['code'].to_i
|
10
|
+
case code
|
11
|
+
when 301
|
12
|
+
res['Location'] = "/index.html"
|
13
|
+
when 302
|
14
|
+
res['Location'] = "/index.html"
|
15
|
+
end
|
16
|
+
res.status = code
|
17
|
+
else
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
class FormTest < WEBrick::HTTPServlet::AbstractServlet
|
22
|
+
def do_GET(req, res)
|
23
|
+
res.body = "<HTML><body>"
|
24
|
+
req.query.each_key { |k|
|
25
|
+
res.body << "<a href=\"#\">#{k}:#{req.query[k]}</a><br />"
|
26
|
+
}
|
27
|
+
res.body << "</body></HTML>"
|
28
|
+
res['Content-Type'] = "text/html"
|
29
|
+
end
|
30
|
+
|
31
|
+
def do_POST(req, res)
|
32
|
+
res.body = "<HTML><body>"
|
33
|
+
req.query.each_key { |k|
|
34
|
+
res.body << "<a href=\"#\">#{k}:#{req.query[k]}</a><br />"
|
35
|
+
}
|
36
|
+
res.body << "</body></HTML>"
|
37
|
+
res['Content-Type'] = "text/html"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class OneCookieTest < WEBrick::HTTPServlet::AbstractServlet
|
42
|
+
def do_GET(req, res)
|
43
|
+
cookie = WEBrick::Cookie.new("foo", "bar")
|
44
|
+
cookie.path = "/"
|
45
|
+
cookie.expires = Time.now + 86400
|
46
|
+
res.cookies << cookie
|
47
|
+
res['Content-Type'] = "text/html"
|
48
|
+
res.body = "<html><body>hello</body></html>"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class ManyCookiesTest < WEBrick::HTTPServlet::AbstractServlet
|
53
|
+
def do_GET(req, res)
|
54
|
+
name_cookie = WEBrick::Cookie.new("name", "Aaron")
|
55
|
+
name_cookie.path = "/"
|
56
|
+
name_cookie.expires = Time.now + 86400
|
57
|
+
res.cookies << name_cookie
|
58
|
+
res.cookies << name_cookie
|
59
|
+
res.cookies << name_cookie
|
60
|
+
res.cookies << name_cookie
|
61
|
+
|
62
|
+
expired_cookie = WEBrick::Cookie.new("expired", "doh")
|
63
|
+
expired_cookie.path = "/"
|
64
|
+
expired_cookie.expires = Time.now - 86400
|
65
|
+
res.cookies << expired_cookie
|
66
|
+
|
67
|
+
different_path_cookie = WEBrick::Cookie.new("a_path", "some_path")
|
68
|
+
different_path_cookie.path = "/some_path"
|
69
|
+
different_path_cookie.expires = Time.now + 86400
|
70
|
+
res.cookies << different_path_cookie
|
71
|
+
|
72
|
+
no_path_cookie = WEBrick::Cookie.new("no_path", "no_path")
|
73
|
+
no_path_cookie.expires = Time.now + 86400
|
74
|
+
res.cookies << no_path_cookie
|
75
|
+
|
76
|
+
no_exp_path_cookie = WEBrick::Cookie.new("no_expires", "nope")
|
77
|
+
no_exp_path_cookie.path = "/"
|
78
|
+
res.cookies << no_exp_path_cookie
|
79
|
+
|
80
|
+
res['Content-Type'] = "text/html"
|
81
|
+
res.body = "<html><body>hello</body></html>"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
class ManyCookiesAsStringTest < WEBrick::HTTPServlet::AbstractServlet
|
86
|
+
def do_GET(req, res)
|
87
|
+
cookies = []
|
88
|
+
name_cookie = WEBrick::Cookie.new("name", "Aaron")
|
89
|
+
name_cookie.path = "/"
|
90
|
+
name_cookie.expires = Time.now + 86400
|
91
|
+
cookies << name_cookie
|
92
|
+
cookies << name_cookie
|
93
|
+
cookies << name_cookie
|
94
|
+
cookies << name_cookie
|
95
|
+
|
96
|
+
expired_cookie = WEBrick::Cookie.new("expired", "doh")
|
97
|
+
expired_cookie.path = "/"
|
98
|
+
expired_cookie.expires = Time.now - 86400
|
99
|
+
cookies << expired_cookie
|
100
|
+
|
101
|
+
different_path_cookie = WEBrick::Cookie.new("a_path", "some_path")
|
102
|
+
different_path_cookie.path = "/some_path"
|
103
|
+
different_path_cookie.expires = Time.now + 86400
|
104
|
+
cookies << different_path_cookie
|
105
|
+
|
106
|
+
no_path_cookie = WEBrick::Cookie.new("no_path", "no_path")
|
107
|
+
no_path_cookie.expires = Time.now + 86400
|
108
|
+
cookies << no_path_cookie
|
109
|
+
|
110
|
+
no_exp_path_cookie = WEBrick::Cookie.new("no_expires", "nope")
|
111
|
+
no_exp_path_cookie.path = "/"
|
112
|
+
cookies << no_exp_path_cookie
|
113
|
+
|
114
|
+
res['Set-Cookie'] = cookies.join(', ')
|
115
|
+
|
116
|
+
res['Content-Type'] = "text/html"
|
117
|
+
res.body = "<html><body>hello</body></html>"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
class SendCookiesTest < WEBrick::HTTPServlet::AbstractServlet
|
122
|
+
def do_GET(req, res)
|
123
|
+
res['Content-Type'] = "text/html"
|
124
|
+
res.body = "<html><body>"
|
125
|
+
req.cookies.each { |c|
|
126
|
+
res.body << "<a href=\"#\">#{c.name}:#{c.value}</a>"
|
127
|
+
}
|
128
|
+
res.body << "</body></html>"
|
129
|
+
end
|
130
|
+
end
|