mechanize 2.0.1 → 2.1.pre.1
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.tar.gz.sig +0 -0
- data/CHANGELOG.rdoc +82 -0
- data/EXAMPLES.rdoc +1 -1
- data/FAQ.rdoc +9 -9
- data/Manifest.txt +35 -48
- data/README.rdoc +2 -1
- data/Rakefile +16 -3
- data/lib/mechanize.rb +809 -392
- data/lib/mechanize/content_type_error.rb +10 -11
- data/lib/mechanize/cookie.rb +193 -60
- data/lib/mechanize/cookie_jar.rb +39 -86
- data/lib/mechanize/download.rb +59 -0
- data/lib/mechanize/element_matcher.rb +1 -0
- data/lib/mechanize/file.rb +61 -76
- data/lib/mechanize/file_saver.rb +37 -35
- data/lib/mechanize/form.rb +475 -410
- data/lib/mechanize/form/button.rb +4 -7
- data/lib/mechanize/form/check_box.rb +10 -9
- data/lib/mechanize/form/field.rb +52 -42
- data/lib/mechanize/form/file_upload.rb +17 -19
- data/lib/mechanize/form/hidden.rb +3 -0
- data/lib/mechanize/form/image_button.rb +15 -16
- data/lib/mechanize/form/keygen.rb +34 -0
- data/lib/mechanize/form/multi_select_list.rb +20 -9
- data/lib/mechanize/form/option.rb +48 -47
- data/lib/mechanize/form/radio_button.rb +52 -45
- data/lib/mechanize/form/reset.rb +3 -0
- data/lib/mechanize/form/select_list.rb +10 -6
- data/lib/mechanize/form/submit.rb +3 -0
- data/lib/mechanize/form/text.rb +3 -0
- data/lib/mechanize/form/textarea.rb +3 -0
- data/lib/mechanize/headers.rb +17 -19
- data/lib/mechanize/history.rb +60 -61
- data/lib/mechanize/http.rb +5 -0
- data/lib/mechanize/http/agent.rb +485 -218
- data/lib/mechanize/http/auth_challenge.rb +59 -0
- data/lib/mechanize/http/auth_realm.rb +31 -0
- data/lib/mechanize/http/content_disposition_parser.rb +188 -0
- data/lib/mechanize/http/www_authenticate_parser.rb +155 -0
- data/lib/mechanize/monkey_patch.rb +14 -35
- data/lib/mechanize/page.rb +34 -2
- data/lib/mechanize/page/base.rb +6 -7
- data/lib/mechanize/page/frame.rb +5 -5
- data/lib/mechanize/page/image.rb +23 -23
- data/lib/mechanize/page/label.rb +16 -16
- data/lib/mechanize/page/link.rb +16 -0
- data/lib/mechanize/page/meta_refresh.rb +19 -7
- data/lib/mechanize/parser.rb +173 -0
- data/lib/mechanize/pluggable_parsers.rb +126 -83
- data/lib/mechanize/redirect_limit_reached_error.rb +16 -13
- data/lib/mechanize/redirect_not_get_or_head_error.rb +18 -16
- data/lib/mechanize/response_code_error.rb +16 -17
- data/lib/mechanize/robots_disallowed_error.rb +22 -23
- data/lib/mechanize/test_case.rb +659 -0
- data/lib/mechanize/unauthorized_error.rb +3 -0
- data/lib/mechanize/unsupported_scheme_error.rb +4 -6
- data/lib/mechanize/util.rb +0 -12
- data/test/htdocs/form_order_test.html +11 -0
- data/test/htdocs/form_test.html +2 -2
- data/test/htdocs/tc_links.html +1 -0
- data/test/test_mechanize.rb +367 -59
- data/test/test_mechanize_cookie.rb +69 -4
- data/test/test_mechanize_cookie_jar.rb +200 -124
- data/test/test_mechanize_download.rb +43 -0
- data/test/test_mechanize_file.rb +53 -45
- data/test/{test_mechanize_file_response.rb → test_mechanize_file_connection.rb} +2 -2
- data/test/test_mechanize_file_request.rb +2 -2
- data/test/test_mechanize_file_saver.rb +21 -0
- data/test/test_mechanize_form.rb +345 -46
- data/test/test_mechanize_form_check_box.rb +5 -4
- data/test/test_mechanize_form_encoding.rb +10 -16
- data/test/test_mechanize_form_field.rb +45 -3
- data/test/test_mechanize_form_file_upload.rb +20 -0
- data/test/test_mechanize_form_image_button.rb +2 -2
- data/test/test_mechanize_form_keygen.rb +32 -0
- data/test/test_mechanize_form_multi_select_list.rb +84 -0
- data/test/test_mechanize_form_option.rb +55 -0
- data/test/test_mechanize_form_radio_button.rb +78 -0
- data/test/test_mechanize_form_select_list.rb +76 -0
- data/test/test_mechanize_form_textarea.rb +8 -7
- data/test/{test_headers.rb → test_mechanize_headers.rb} +4 -2
- data/test/test_mechanize_history.rb +103 -0
- data/test/test_mechanize_http_agent.rb +525 -17
- data/test/test_mechanize_http_auth_challenge.rb +39 -0
- data/test/test_mechanize_http_auth_realm.rb +49 -0
- data/test/test_mechanize_http_content_disposition_parser.rb +118 -0
- data/test/test_mechanize_http_www_authenticate_parser.rb +146 -0
- data/test/test_mechanize_link.rb +10 -14
- data/test/test_mechanize_page.rb +118 -0
- data/test/test_mechanize_page_encoding.rb +48 -13
- data/test/test_mechanize_page_frame.rb +16 -0
- data/test/test_mechanize_page_link.rb +27 -19
- data/test/test_mechanize_page_meta_refresh.rb +26 -14
- data/test/test_mechanize_parser.rb +289 -0
- data/test/test_mechanize_pluggable_parser.rb +52 -0
- data/test/test_mechanize_redirect_limit_reached_error.rb +24 -0
- data/test/test_mechanize_redirect_not_get_or_head_error.rb +3 -7
- data/test/test_mechanize_subclass.rb +2 -2
- data/test/test_mechanize_util.rb +24 -13
- data/test/test_multi_select.rb +23 -22
- metadata +145 -114
- metadata.gz.sig +0 -0
- data/lib/mechanize/inspect.rb +0 -88
- data/test/helper.rb +0 -175
- data/test/htdocs/form_select_all.html +0 -16
- data/test/htdocs/form_select_none.html +0 -17
- data/test/htdocs/form_select_noopts.html +0 -10
- data/test/htdocs/iframe_test.html +0 -16
- data/test/htdocs/nofollow.html +0 -9
- data/test/htdocs/norobots.html +0 -8
- data/test/htdocs/rel_nofollow.html +0 -8
- data/test/htdocs/tc_base_images.html +0 -10
- data/test/htdocs/tc_images.html +0 -8
- data/test/htdocs/tc_no_attributes.html +0 -16
- data/test/htdocs/tc_radiobuttons.html +0 -17
- data/test/htdocs/test_bad_encoding.html +0 -52
- data/test/servlets.rb +0 -402
- data/test/ssl_server.rb +0 -48
- data/test/test_cookies.rb +0 -129
- data/test/test_form_action.rb +0 -52
- data/test/test_form_as_hash.rb +0 -59
- data/test/test_form_button.rb +0 -46
- data/test/test_frames.rb +0 -34
- data/test/test_history.rb +0 -118
- data/test/test_history_added.rb +0 -16
- data/test/test_html_unscape_forms.rb +0 -46
- data/test/test_if_modified_since.rb +0 -20
- data/test/test_images.rb +0 -19
- data/test/test_no_attributes.rb +0 -13
- data/test/test_option.rb +0 -18
- data/test/test_pluggable_parser.rb +0 -136
- data/test/test_post_form.rb +0 -37
- data/test/test_pretty_print.rb +0 -22
- data/test/test_radiobutton.rb +0 -75
- data/test/test_redirect_limit_reached.rb +0 -39
- data/test/test_referer.rb +0 -81
- data/test/test_relative_links.rb +0 -40
- data/test/test_request.rb +0 -13
- data/test/test_response_code.rb +0 -53
- data/test/test_robots.rb +0 -72
- data/test/test_save_file.rb +0 -48
- data/test/test_scheme.rb +0 -48
- data/test/test_select.rb +0 -119
- data/test/test_select_all.rb +0 -15
- data/test/test_select_none.rb +0 -15
- data/test/test_select_noopts.rb +0 -18
- data/test/test_set_fields.rb +0 -44
- data/test/test_ssl_server.rb +0 -20
metadata.gz.sig
CHANGED
Binary file
|
data/lib/mechanize/inspect.rb
DELETED
@@ -1,88 +0,0 @@
|
|
1
|
-
require 'pp'
|
2
|
-
|
3
|
-
# :stopdoc:
|
4
|
-
class Mechanize
|
5
|
-
def pretty_print(q)
|
6
|
-
q.object_group(self) {
|
7
|
-
q.breakable
|
8
|
-
q.pp cookie_jar
|
9
|
-
q.breakable
|
10
|
-
q.pp current_page
|
11
|
-
}
|
12
|
-
end
|
13
|
-
|
14
|
-
class Page
|
15
|
-
def pretty_print(q)
|
16
|
-
q.object_group(self) {
|
17
|
-
q.breakable
|
18
|
-
q.group(1, '{url', '}') {q.breakable; q.pp uri }
|
19
|
-
q.breakable
|
20
|
-
q.group(1, '{meta_refresh', '}') {
|
21
|
-
meta_refresh.each { |link| q.breakable; q.pp link }
|
22
|
-
}
|
23
|
-
q.breakable
|
24
|
-
q.group(1, '{title', '}') { q.breakable; q.pp title }
|
25
|
-
q.breakable
|
26
|
-
q.group(1, '{iframes', '}') {
|
27
|
-
iframes.each { |link| q.breakable; q.pp link }
|
28
|
-
}
|
29
|
-
q.breakable
|
30
|
-
q.group(1, '{frames', '}') {
|
31
|
-
frames.each { |link| q.breakable; q.pp link }
|
32
|
-
}
|
33
|
-
q.breakable
|
34
|
-
q.group(1, '{links', '}') {
|
35
|
-
links.each { |link| q.breakable; q.pp link }
|
36
|
-
}
|
37
|
-
q.breakable
|
38
|
-
q.group(1, '{forms', '}') {
|
39
|
-
forms.each { |form| q.breakable; q.pp form }
|
40
|
-
}
|
41
|
-
}
|
42
|
-
end
|
43
|
-
|
44
|
-
class Link
|
45
|
-
def pretty_print(q)
|
46
|
-
q.object_group(self) {
|
47
|
-
q.breakable; q.pp text
|
48
|
-
q.breakable; q.pp href
|
49
|
-
}
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
class Form
|
55
|
-
def pretty_print(q)
|
56
|
-
q.object_group(self) {
|
57
|
-
q.breakable; q.group(1, '{name', '}') { q.breakable; q.pp name }
|
58
|
-
q.breakable; q.group(1, '{method', '}') { q.breakable; q.pp method }
|
59
|
-
q.breakable; q.group(1, '{action', '}') { q.breakable; q.pp action }
|
60
|
-
q.breakable; q.group(1, '{fields', '}') {
|
61
|
-
fields.each do |field|
|
62
|
-
q.breakable
|
63
|
-
q.pp field
|
64
|
-
end
|
65
|
-
}
|
66
|
-
q.breakable; q.group(1, '{radiobuttons', '}') {
|
67
|
-
radiobuttons.each { |b| q.breakable; q.pp b }
|
68
|
-
}
|
69
|
-
q.breakable; q.group(1, '{checkboxes', '}') {
|
70
|
-
checkboxes.each { |b| q.breakable; q.pp b }
|
71
|
-
}
|
72
|
-
q.breakable; q.group(1, '{file_uploads', '}') {
|
73
|
-
file_uploads.each { |b| q.breakable; q.pp b }
|
74
|
-
}
|
75
|
-
q.breakable; q.group(1, '{buttons', '}') {
|
76
|
-
buttons.each { |b| q.breakable; q.pp b }
|
77
|
-
}
|
78
|
-
}
|
79
|
-
end
|
80
|
-
|
81
|
-
class RadioButton
|
82
|
-
def pretty_print_instance_variables
|
83
|
-
[:@checked, :@name, :@value]
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
# :startdoc:
|
data/test/helper.rb
DELETED
@@ -1,175 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'minitest/autorun'
|
3
|
-
require 'mechanize'
|
4
|
-
require 'webrick/httputils'
|
5
|
-
require 'servlets'
|
6
|
-
require 'tmpdir'
|
7
|
-
require 'tempfile'
|
8
|
-
|
9
|
-
BASE_DIR = File.dirname(__FILE__)
|
10
|
-
|
11
|
-
# Move this to a test base class
|
12
|
-
module MechTestHelper
|
13
|
-
def self.fake_page(agent)
|
14
|
-
html = <<-END
|
15
|
-
<html><body>
|
16
|
-
<form><input type="submit" value="submit" /></form>
|
17
|
-
</body></html>
|
18
|
-
END
|
19
|
-
html_response = { 'content-type' => 'text/html' }
|
20
|
-
Mechanize::Page.new( nil, html_response, html, 200, agent )
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
class Net::HTTP
|
25
|
-
alias :old_do_start :do_start
|
26
|
-
|
27
|
-
def do_start
|
28
|
-
@started = true
|
29
|
-
end
|
30
|
-
|
31
|
-
SERVLETS = {
|
32
|
-
'/gzip' => GzipServlet,
|
33
|
-
'/form_post' => FormTest,
|
34
|
-
'/basic_auth' => BasicAuthServlet,
|
35
|
-
'/form post' => FormTest,
|
36
|
-
'/response_code' => ResponseCodeTest,
|
37
|
-
'/http_refresh' => HttpRefreshTest,
|
38
|
-
'/bad_content_type' => BadContentTypeTest,
|
39
|
-
'/content_type_test' => ContentTypeTest,
|
40
|
-
'/referer' => RefererServlet,
|
41
|
-
'/file_upload' => FileUploadTest,
|
42
|
-
'/one_cookie' => OneCookieTest,
|
43
|
-
'/one_cookie_no_space' => OneCookieNoSpacesTest,
|
44
|
-
'/many_cookies' => ManyCookiesTest,
|
45
|
-
'/many_cookies_as_string' => ManyCookiesAsStringTest,
|
46
|
-
'/send_cookies' => SendCookiesTest,
|
47
|
-
'/quoted_value_cookie' => QuotedValueCookieTest,
|
48
|
-
'/if_modified_since' => ModifiedSinceServlet,
|
49
|
-
'/http_headers' => HeaderServlet,
|
50
|
-
'/infinite_redirect' => InfiniteRedirectTest,
|
51
|
-
'/infinite_refresh' => InfiniteRefreshTest,
|
52
|
-
'/redirect_ok' => RedirectOkTest,
|
53
|
-
'/redirect' => RedirectTest,
|
54
|
-
'/refresh_without_url' => RefreshWithoutUrl,
|
55
|
-
'/refresh_with_empty_url' => RefreshWithEmptyUrl,
|
56
|
-
'/digest_auth' => DigestAuthServlet,
|
57
|
-
'/verb' => VerbServlet,
|
58
|
-
}
|
59
|
-
|
60
|
-
PAGE_CACHE = {}
|
61
|
-
|
62
|
-
alias :old_request :request
|
63
|
-
|
64
|
-
def request(request, *data, &block)
|
65
|
-
url = URI.parse(request.path)
|
66
|
-
path = WEBrick::HTTPUtils.unescape(url.path)
|
67
|
-
|
68
|
-
path = '/index.html' if path == '/'
|
69
|
-
|
70
|
-
res = ::Response.new
|
71
|
-
res.query_params = url.query
|
72
|
-
|
73
|
-
request.query = if 'POST' != request.method && url.query then
|
74
|
-
WEBrick::HTTPUtils.parse_query url.query
|
75
|
-
elsif request['content-type'] =~ /www-form-urlencoded/ then
|
76
|
-
WEBrick::HTTPUtils.parse_query request.body
|
77
|
-
elsif request['content-type'] =~ /boundary=(.+)/ then
|
78
|
-
boundary = WEBrick::HTTPUtils.dequote $1
|
79
|
-
WEBrick::HTTPUtils.parse_form_data request.body, boundary
|
80
|
-
else
|
81
|
-
{}
|
82
|
-
end
|
83
|
-
|
84
|
-
request.cookies = WEBrick::Cookie.parse(request['Cookie'])
|
85
|
-
|
86
|
-
if SERVLETS[path]
|
87
|
-
SERVLETS[path].new({}).send("do_#{request.method}", request, res)
|
88
|
-
else
|
89
|
-
filename = "htdocs#{path.gsub(/[^\/\\.\w\s]/, '_')}"
|
90
|
-
unless PAGE_CACHE[filename]
|
91
|
-
File.open("#{BASE_DIR}/#{filename}", 'rb') { |file|
|
92
|
-
PAGE_CACHE[filename] = file.read
|
93
|
-
}
|
94
|
-
end
|
95
|
-
|
96
|
-
res.body = PAGE_CACHE[filename]
|
97
|
-
case filename
|
98
|
-
when /\.txt$/
|
99
|
-
res['Content-Type'] = 'text/plain'
|
100
|
-
when /\.jpg$/
|
101
|
-
res['Content-Type'] = 'image/jpeg'
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
res['Content-Type'] ||= 'text/html'
|
106
|
-
res.code ||= "200"
|
107
|
-
|
108
|
-
response_klass = Net::HTTPResponse::CODE_TO_OBJ[res.code.to_s]
|
109
|
-
response = response_klass.new res.http_version, res.code, res.message
|
110
|
-
|
111
|
-
res.header.each do |k,v|
|
112
|
-
v = v.first if v.length == 1
|
113
|
-
response[k] = v
|
114
|
-
end
|
115
|
-
|
116
|
-
res.cookies.each do |cookie|
|
117
|
-
response.add_field 'Set-Cookie', cookie.to_s
|
118
|
-
end
|
119
|
-
|
120
|
-
response['Content-Type'] ||= 'text/html'
|
121
|
-
response['Content-Length'] = res['Content-Length'] || res.body.length.to_s
|
122
|
-
|
123
|
-
io = StringIO.new(res.body)
|
124
|
-
response.instance_variable_set :@socket, io
|
125
|
-
def io.read clen, dest, _
|
126
|
-
dest << string[0, clen]
|
127
|
-
end
|
128
|
-
|
129
|
-
body_exist = request.response_body_permitted? &&
|
130
|
-
response_klass.body_permitted?
|
131
|
-
|
132
|
-
response.instance_variable_set :@body_exist, body_exist
|
133
|
-
|
134
|
-
yield response if block_given?
|
135
|
-
|
136
|
-
response
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
class Net::HTTPRequest
|
141
|
-
attr_accessor :query, :body, :cookies, :user
|
142
|
-
end
|
143
|
-
|
144
|
-
class Response
|
145
|
-
include Net::HTTPHeader
|
146
|
-
|
147
|
-
attr_reader :code
|
148
|
-
attr_accessor :body, :query, :cookies
|
149
|
-
attr_accessor :query_params, :http_version
|
150
|
-
attr_accessor :header
|
151
|
-
|
152
|
-
def code=(c)
|
153
|
-
@code = c.to_s
|
154
|
-
end
|
155
|
-
|
156
|
-
alias :status :code
|
157
|
-
alias :status= :code=
|
158
|
-
|
159
|
-
def initialize
|
160
|
-
@header = {}
|
161
|
-
@body = ''
|
162
|
-
@code = nil
|
163
|
-
@query = nil
|
164
|
-
@cookies = []
|
165
|
-
@http_version = '1.1'
|
166
|
-
end
|
167
|
-
|
168
|
-
def read_body
|
169
|
-
yield body
|
170
|
-
end
|
171
|
-
|
172
|
-
def message
|
173
|
-
''
|
174
|
-
end
|
175
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
<html>
|
2
|
-
<body>
|
3
|
-
<form name="form1" method="post" action="/form_post">
|
4
|
-
<select name="list">
|
5
|
-
<option value="1" selected>Option 1</option>
|
6
|
-
<option value="2" selected>Option 2</option>
|
7
|
-
<option value="3" selected>Option 3</option>
|
8
|
-
<option value="4" selected>Option 4</option>
|
9
|
-
<option value="5" selected>Option 5</option>
|
10
|
-
<option value="6" selected>Option 6</option>
|
11
|
-
</select>
|
12
|
-
<br />
|
13
|
-
<input type="submit" value="Submit" />
|
14
|
-
</form>
|
15
|
-
</body>
|
16
|
-
</html>
|
@@ -1,17 +0,0 @@
|
|
1
|
-
<html>
|
2
|
-
<body>
|
3
|
-
<form name="form1" method="post" action="/form_post">
|
4
|
-
<select name="list">
|
5
|
-
<option value="1">Option 1</option>
|
6
|
-
<option value="2">Option 2</option>
|
7
|
-
<option>Option No Value</option>
|
8
|
-
<option value="3">Option 3</option>
|
9
|
-
<option value="4">Option 4</option>
|
10
|
-
<option value="5">Option 5</option>
|
11
|
-
<option value="6">Option 6</option>
|
12
|
-
</select>
|
13
|
-
<br />
|
14
|
-
<input type="submit" value="Submit" />
|
15
|
-
</form>
|
16
|
-
</body>
|
17
|
-
</html>
|
@@ -1,16 +0,0 @@
|
|
1
|
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
|
2
|
-
"http://www.w3.org/TR/html4/frameset.dtd">
|
3
|
-
<HTML>
|
4
|
-
<HEAD>
|
5
|
-
<TITLE>A simple frameset document</TITLE>
|
6
|
-
</HEAD>
|
7
|
-
<BODY>
|
8
|
-
<IFRAME src="/file_upload.html" name="frame4">
|
9
|
-
[Your user agent does not support frames or is currently configured
|
10
|
-
not to display frames. However, you may visit
|
11
|
-
<A href="foo.html">the related document.</A>]
|
12
|
-
</IFRAME>
|
13
|
-
</BODY>
|
14
|
-
</HTML>
|
15
|
-
|
16
|
-
|
data/test/htdocs/nofollow.html
DELETED
data/test/htdocs/norobots.html
DELETED
data/test/htdocs/tc_images.html
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
<html>
|
2
|
-
<head><title>tc_radiobuttons.html</title></head>
|
3
|
-
<body>
|
4
|
-
<form name="form1" method="post" action="/form_post">
|
5
|
-
Gender:<br />
|
6
|
-
M: <input type="radio" name="gender" value="male" /><br />
|
7
|
-
F: <input type="radio" name="gender" value="female" /><br />
|
8
|
-
Your one favorite color:<br />
|
9
|
-
Green: <input type="radio" name="color" value="green" /><br />
|
10
|
-
Red: <input type="radio" name="color" value="red" /><br />
|
11
|
-
Blue: <input type="radio" name="color" value="blue" /><br />
|
12
|
-
Yellow: <input type="radio" name="color" value="yellow" /><br />
|
13
|
-
Brown: <input type="radio" name="color" value="brown" /><br />
|
14
|
-
<input type="submit" value="Submit" />
|
15
|
-
</form>
|
16
|
-
</body>
|
17
|
-
</html>
|
@@ -1,52 +0,0 @@
|
|
1
|
-
<html>
|
2
|
-
<head>
|
3
|
-
<meta http-equiv="Content-Type" content="text/html;charset=utf-8; charset=utf-8"/>
|
4
|
-
<title>Page Title</title>
|
5
|
-
</head>
|
6
|
-
<body>
|
7
|
-
<h1>Post Form 1</h1>
|
8
|
-
<form name="post_form1" method="post" action="/form_post?a=b&b=c">
|
9
|
-
<table>
|
10
|
-
<tr>
|
11
|
-
<td>First Name</td>
|
12
|
-
<td><input type="text" name="first_name" /></td>
|
13
|
-
</tr>
|
14
|
-
</table><br />
|
15
|
-
<input type="submit" value="Submit" />
|
16
|
-
</form>
|
17
|
-
|
18
|
-
<h1>Post Form 2</h1>
|
19
|
-
<form name="post_form2" method="get" action="/form_post?a=b&b=c">
|
20
|
-
<table>
|
21
|
-
<tr>
|
22
|
-
<td>First Name</td>
|
23
|
-
<td><input type="text" name="first_name" /></td>
|
24
|
-
</tr>
|
25
|
-
</table><br />
|
26
|
-
<input type="submit" value="Submit" />
|
27
|
-
</form>
|
28
|
-
|
29
|
-
<h1>Post Form 3</h1>
|
30
|
-
<form name="post_form3" method="post" action="/form_post?a=b&b=c">
|
31
|
-
<table>
|
32
|
-
<tr>
|
33
|
-
<td>First Name</td>
|
34
|
-
<td><input type="text" name="first_name" /></td>
|
35
|
-
</tr>
|
36
|
-
</table><br />
|
37
|
-
<input type="submit" value="Submit" />
|
38
|
-
</form>
|
39
|
-
|
40
|
-
<h1>Post Form 4</h1>
|
41
|
-
<form name="post_form4" method="post" action="/form_post#1">
|
42
|
-
<table>
|
43
|
-
<tr>
|
44
|
-
<td>First Name</td>
|
45
|
-
<td><input type="text" name="first_name" /></td>
|
46
|
-
</tr>
|
47
|
-
</table><br />
|
48
|
-
<input type="submit" value="Submit" />
|
49
|
-
</form>
|
50
|
-
</body>
|
51
|
-
</html>
|
52
|
-
|