ruby-web 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. data/ChangeLog +474 -0
  2. data/INSTALL.txt +9 -0
  3. data/InstalledFiles +180 -0
  4. data/LICENSE.txt +74 -0
  5. data/Rakefile +529 -0
  6. data/TODO +65 -0
  7. data/doc/additional.xml +149 -0
  8. data/doc/core.xml +652 -0
  9. data/doc/credits/index.xml +52 -0
  10. data/doc/credits/php.contributors.xml +118 -0
  11. data/doc/credits/php.language-snippets.ent +622 -0
  12. data/doc/install/index.xml +136 -0
  13. data/doc/install/mac/index.xml +21 -0
  14. data/doc/install/ruby-web.install.rb.instructions.xml +7 -0
  15. data/doc/install/unix/index.xml +46 -0
  16. data/doc/install/win/apache1.xml +166 -0
  17. data/doc/install/win/apache2.xml +141 -0
  18. data/doc/install/win/iis.xml +162 -0
  19. data/doc/install/win/index.xml +24 -0
  20. data/doc/install/win/installer.xml +31 -0
  21. data/doc/install/win/manual.xml +43 -0
  22. data/doc/manual.xml +69 -0
  23. data/doc/old/apache_cgi.txt +23 -0
  24. data/doc/old/fastcgi.txt +23 -0
  25. data/doc/old/mod_ruby.txt +21 -0
  26. data/doc/old/snippets.rdoc +183 -0
  27. data/doc/old/webrick.txt +23 -0
  28. data/doc/old/windows_cgi.txt +9 -0
  29. data/doc/tutorial.xml +14 -0
  30. data/doc/xsl/manual-multi.xsl +10 -0
  31. data/doc/xsl/manual-pdf.xsl +6 -0
  32. data/doc/xsl/manual-single.xsl +6 -0
  33. data/doc/xsl/manual.css +22 -0
  34. data/install.rb +1022 -0
  35. data/lib/formatter.rb +314 -0
  36. data/lib/html-parser.rb +429 -0
  37. data/lib/htmlrepair.rb +113 -0
  38. data/lib/htmlsplit.rb +842 -0
  39. data/lib/sgml-parser.rb +332 -0
  40. data/lib/web.rb +68 -0
  41. data/lib/web/assertinclude.rb +129 -0
  42. data/lib/web/config.rb +50 -0
  43. data/lib/web/connection.rb +1070 -0
  44. data/lib/web/convenience.rb +154 -0
  45. data/lib/web/formreader.rb +318 -0
  46. data/lib/web/htmlparser/html-parser.rb +429 -0
  47. data/lib/web/htmlparser/sgml-parser.rb +332 -0
  48. data/lib/web/htmltools/element.rb +296 -0
  49. data/lib/web/htmltools/stparser.rb +276 -0
  50. data/lib/web/htmltools/tags.rb +286 -0
  51. data/lib/web/htmltools/tree.rb +139 -0
  52. data/lib/web/htmltools/xmltree.rb +160 -0
  53. data/lib/web/htmltools/xpath.rb +71 -0
  54. data/lib/web/info.rb +63 -0
  55. data/lib/web/load.rb +210 -0
  56. data/lib/web/mime.rb +87 -0
  57. data/lib/web/phprb.rb +340 -0
  58. data/lib/web/resources/test/cookie.rb +33 -0
  59. data/lib/web/resources/test/counter.rb +20 -0
  60. data/lib/web/resources/test/multipart.rb +14 -0
  61. data/lib/web/resources/test/redirect.rb +8 -0
  62. data/lib/web/resources/test/stock.rb +33 -0
  63. data/lib/web/sapi/apache.rb +129 -0
  64. data/lib/web/sapi/fastcgi.rb +22 -0
  65. data/lib/web/sapi/install/apache.rb +180 -0
  66. data/lib/web/sapi/install/iis.rb +93 -0
  67. data/lib/web/sapi/install/macosx.rb +90 -0
  68. data/lib/web/sapi/webrick.rb +86 -0
  69. data/lib/web/session.rb +83 -0
  70. data/lib/web/shim/cgi.rb +129 -0
  71. data/lib/web/shim/rails.rb +175 -0
  72. data/lib/web/stringio.rb +78 -0
  73. data/lib/web/strscanparser.rb +24 -0
  74. data/lib/web/tagparser.rb +96 -0
  75. data/lib/web/testing.rb +666 -0
  76. data/lib/web/traceoutput.rb +75 -0
  77. data/lib/web/unit.rb +56 -0
  78. data/lib/web/upload.rb +59 -0
  79. data/lib/web/validate.rb +52 -0
  80. data/lib/web/wiki.rb +557 -0
  81. data/lib/web/wiki/linker.rb +72 -0
  82. data/lib/web/wiki/page.rb +201 -0
  83. data/lib/webunit.rb +27 -0
  84. data/lib/webunit/assert.rb +152 -0
  85. data/lib/webunit/converter.rb +154 -0
  86. data/lib/webunit/cookie.rb +118 -0
  87. data/lib/webunit/domwalker.rb +185 -0
  88. data/lib/webunit/exception.rb +14 -0
  89. data/lib/webunit/form.rb +116 -0
  90. data/lib/webunit/frame.rb +37 -0
  91. data/lib/webunit/htmlelem.rb +122 -0
  92. data/lib/webunit/image.rb +26 -0
  93. data/lib/webunit/jscript.rb +31 -0
  94. data/lib/webunit/link.rb +33 -0
  95. data/lib/webunit/params.rb +321 -0
  96. data/lib/webunit/parser.rb +229 -0
  97. data/lib/webunit/response.rb +464 -0
  98. data/lib/webunit/runtest.rb +41 -0
  99. data/lib/webunit/table.rb +148 -0
  100. data/lib/webunit/testcase.rb +45 -0
  101. data/lib/webunit/ui/cui/testrunner.rb +50 -0
  102. data/lib/webunit/utils.rb +68 -0
  103. data/lib/webunit/webunit.rb +28 -0
  104. data/test/dev/action.rb +83 -0
  105. data/test/dev/forms.rb +104 -0
  106. data/test/dev/forms2.rb +104 -0
  107. data/test/dev/parser.rb +17 -0
  108. data/test/dev/scripts/dump.rb +24 -0
  109. data/test/dev/scripts/makedist.rb +62 -0
  110. data/test/dev/scripts/uri.rb +41 -0
  111. data/test/dev/scripts/uri/common.rb +432 -0
  112. data/test/dev/scripts/uri/ftp.rb +149 -0
  113. data/test/dev/scripts/uri/generic.rb +1106 -0
  114. data/test/dev/scripts/uri/http.rb +76 -0
  115. data/test/dev/scripts/uri/https.rb +26 -0
  116. data/test/dev/scripts/uri/ldap.rb +238 -0
  117. data/test/dev/scripts/uri/mailto.rb +260 -0
  118. data/test/dev/scripts/urireg.rb +174 -0
  119. data/test/dev/simpledispatcher.rb +156 -0
  120. data/test/dev/test.action.rb +146 -0
  121. data/test/dev/test.formreader.rb +463 -0
  122. data/test/dev/test.simpledispatcher.rb +186 -0
  123. data/test/dev/webunit/conv/digit-0.rb +21 -0
  124. data/test/dev/webunit/conv/digit-1.rb +17 -0
  125. data/test/dev/webunit/conv/digit.rb +23 -0
  126. data/test/dev/webunit/conv/test_digit-0.rb +16 -0
  127. data/test/dev/webunit/conv/test_digit-1.rb +19 -0
  128. data/test/dev/webunit/conv/test_digit.rb +26 -0
  129. data/test/dev/webunit/conv/test_digit_view-0.rb +76 -0
  130. data/test/dev/webunit/conv/test_digit_view-1.rb +102 -0
  131. data/test/dev/webunit/conv/test_digit_view.rb +134 -0
  132. data/test/installation/htdocs/cgi_test.rb +296 -0
  133. data/test/installation/htdocs/test_install.rb +4 -0
  134. data/test/installation/runwebtest.rb +5 -0
  135. data/test/installation/test_cookie.rb +128 -0
  136. data/test/installation/test_form.rb +47 -0
  137. data/test/installation/test_multipart.rb +51 -0
  138. data/test/installation/test_request.rb +24 -0
  139. data/test/installation/test_response.rb +35 -0
  140. data/test/unit/htdocs/cookie.rb +32 -0
  141. data/test/unit/htdocs/multipart.rb +28 -0
  142. data/test/unit/htdocs/redirect.rb +12 -0
  143. data/test/unit/htdocs/simple.rb +13 -0
  144. data/test/unit/htdocs/stock.rb +33 -0
  145. data/test/unit/test_assert.rb +162 -0
  146. data/test/unit/test_cookie.rb +114 -0
  147. data/test/unit/test_domwalker.rb +77 -0
  148. data/test/unit/test_form.rb +42 -0
  149. data/test/unit/test_frame.rb +40 -0
  150. data/test/unit/test_htmlelem.rb +74 -0
  151. data/test/unit/test_image.rb +45 -0
  152. data/test/unit/test_jscript.rb +57 -0
  153. data/test/unit/test_link.rb +85 -0
  154. data/test/unit/test_multipart.rb +51 -0
  155. data/test/unit/test_params.rb +210 -0
  156. data/test/unit/test_parser.rb +53 -0
  157. data/test/unit/test_response.rb +150 -0
  158. data/test/unit/test_table.rb +70 -0
  159. data/test/unit/test_utils.rb +106 -0
  160. data/test/unit/test_webunit.rb +28 -0
  161. data/test/web/mod_ruby_stub.rb +39 -0
  162. data/test/web/test.assertinclude.rb +109 -0
  163. data/test/web/test.buffer.rb +182 -0
  164. data/test/web/test.code.loader.rb +78 -0
  165. data/test/web/test.config.rb +31 -0
  166. data/test/web/test.error.handling.rb +91 -0
  167. data/test/web/test.formreader-2.0.rb +352 -0
  168. data/test/web/test.load.rb +125 -0
  169. data/test/web/test.mime-type.rb +23 -0
  170. data/test/web/test.narf.cgi.rb +106 -0
  171. data/test/web/test.phprb.rb +239 -0
  172. data/test/web/test.request.rb +368 -0
  173. data/test/web/test.response.rb +637 -0
  174. data/test/web/test.ruby-web.rb +10 -0
  175. data/test/web/test.session.rb +50 -0
  176. data/test/web/test.shim.cgi.rb +96 -0
  177. data/test/web/test.tagparser.rb +65 -0
  178. data/test/web/test.template2.rb +297 -0
  179. data/test/web/test.testing2.rb +318 -0
  180. data/test/web/test.upload.rb +45 -0
  181. data/test/web/test.validate.rb +46 -0
  182. data/test/web/test.web.test.rb +495 -0
  183. data/test/wiki/test.history.rb +297 -0
  184. data/test/wiki/test.illustration_page.rb +287 -0
  185. data/test/wiki/test.linker.rb +197 -0
  186. data/test/wiki/test.tarpit.rb +56 -0
  187. data/test/wiki/test.wiki.rb +300 -0
  188. data/test/wikitestroot/admin.rb +7 -0
  189. data/test/wikitestroot/wiki.rb +6 -0
  190. metadata +234 -0
@@ -0,0 +1,229 @@
1
+ =begin
2
+ = WebUnit::Parser
3
+ Copyright(C) 2001 yuichi TAKAHASHI, Narushima Hironori.
4
+ $Id: parser.rb,v 1.5 2004/04/29 12:34:04 yuichi Exp $
5
+ Part of WebUnit::Parser is variant of html-parser
6
+ =end
7
+
8
+ require 'htmlrepair'
9
+ require 'sgml-parser'
10
+ require 'html-parser'
11
+ require 'formatter'
12
+
13
+ module WebUnit
14
+
15
+ class Parser < SGMLParser
16
+
17
+ include Utils
18
+
19
+ @@ignoretags = []
20
+ SingleTags = %w( meta br hr base link area ) # input, frame, img
21
+
22
+ def initialize()
23
+ super( NullFormatter.new )
24
+ @elem_stack = [ HtmlElem::new( nil, nil ) ]
25
+ @form_stack = []
26
+ @table_stack = []
27
+ self.ignore @@ignoretags
28
+ end
29
+
30
+ def feed( response )
31
+ @response = response
32
+ begin
33
+ $stderr.puts HTMLSplit.new( @response.body ).repair.to_s if $DEBUG
34
+ super( HTMLSplit.new( @response.body ).repair.to_s )
35
+ rescue
36
+ raise BadHtmlTags, $!.message + @elem_stack.inspect
37
+ end
38
+ @elem_stack.pop.children[0]
39
+ end
40
+
41
+ def handle_data(data)
42
+ @elem_stack.last.append data.squeeze( " \n" ).strip
43
+ end
44
+
45
+ def starttag( elem )
46
+ @elem_stack.last.append elem
47
+ @elem_stack.push elem
48
+ end
49
+
50
+ def endtag( tag )
51
+ elem = @elem_stack.pop
52
+ if tag != elem.tag
53
+ if SingleTags.include?(tag)
54
+ @elem_stack.push(elem)
55
+ else
56
+ puts "'#{tag}'(wait for '#{elem.tag.to_s}')" if $DEBUG
57
+ raise BadHtmlTags, "'#{tag}'(wait for '#{elem.tag.to_s}')"
58
+ end
59
+ end
60
+ elem
61
+ end
62
+
63
+ def unknown_starttag( tag, attrs )
64
+ elem = HtmlElem::new( tag, attrs_to_hash( attrs ) )
65
+ starttag( elem )
66
+ end
67
+
68
+ def unknown_endtag( tag )
69
+ endtag( tag )
70
+ end
71
+
72
+ # special start and end ( a, form, table, ... )
73
+
74
+ def start_a( attrs )
75
+ ah = attrs_to_hash attrs
76
+ unless ah["href"] =~ /^#/
77
+ ah["href"] = complete_url( ah["href"], @response.url )
78
+ ah["href"].gsub!( "&amp;", "&" )
79
+ end
80
+ elem = Link::new( ah )
81
+ @response.add_link( elem )
82
+ starttag( elem )
83
+ end
84
+
85
+ def start_form( attrs )
86
+ ah = attrs_to_hash attrs
87
+ ah["action"] = complete_url( ah["action"], @response.url )
88
+ ah["action"].gsub!( "&amp;", "&" )
89
+ elem = Form::new( ah )
90
+ @response.add_form elem
91
+ @form_stack.push elem
92
+ starttag( elem )
93
+ end
94
+ def end_form
95
+ endtag( 'form' )
96
+ @form_stack.pop
97
+ end
98
+
99
+ def start_select( attrs )
100
+ ah = attrs_to_hash attrs
101
+ elem = Select::new( ah )
102
+ @form_stack.last.add_param elem
103
+ starttag( elem )
104
+ end
105
+ def end_select
106
+ endtag( 'select' )
107
+ @form_stack.last.parameters.last.end_option
108
+ end
109
+
110
+ def start_option( attrs )
111
+ ah = attrs_to_hash attrs
112
+ elem = SelectOption::new( ah )
113
+ @form_stack.last.parameters.last.add_option elem
114
+ starttag( elem )
115
+ end
116
+
117
+ def start_textarea( attrs )
118
+ ah = attrs_to_hash attrs
119
+ elem = Textarea::new( ah )
120
+ @form_stack.last.add_param elem
121
+ starttag( elem )
122
+ end
123
+
124
+ def start_table( attrs )
125
+ ah = attrs_to_hash attrs
126
+ elem = Table::new( ah )
127
+ @response.add_table elem
128
+ @table_stack.push elem
129
+ starttag( elem )
130
+ end
131
+ def end_table
132
+ endtag( 'table' )
133
+ @table_stack.pop
134
+ end
135
+
136
+ def start_tr( attrs )
137
+ elem = TableRow::new( attrs_to_hash( attrs ) )
138
+ starttag( elem )
139
+ @table_stack.last.add_row( attrs_to_hash( attrs ) )
140
+ end
141
+
142
+ def start_th( attrs )
143
+ elem = TableCell::new( 'th', attrs_to_hash( attrs ) )
144
+ @table_stack.last.add_cell( elem )
145
+ starttag( elem )
146
+ end
147
+
148
+ def start_td( attrs )
149
+ elem = TableCell::new( 'td', attrs_to_hash( attrs ) )
150
+ @table_stack.last.add_cell( elem )
151
+ starttag( elem )
152
+ end
153
+
154
+ # do ( start only )
155
+ def dotag( tag, attrs )
156
+ elem = HtmlElem::new( tag, attrs_to_hash( attrs ) )
157
+ @elem_stack.last.children.push elem
158
+ end
159
+
160
+ SingleTags.each do |t|
161
+ eval "def do_#{t}( attrs ); dotag( '#{t}', attrs ); end"
162
+ end
163
+
164
+ # special do ( input, frame, ... )
165
+
166
+ def do_input( attrs )
167
+ ah = attrs_to_hash attrs
168
+ case ah['type']
169
+ when 'submit'
170
+ elem = InputSubmit::new( ah )
171
+ when 'reset'
172
+ elem = InputReset::new( ah )
173
+ when 'checkbox'
174
+ elem = InputCheckbox::new( ah )
175
+ when 'radio'
176
+ elem = InputRadio::new( ah )
177
+ when 'image'
178
+ elem = InputImage::new( ah )
179
+ when 'file'
180
+ elem = InputFile::new( ah )
181
+ else # text
182
+ elem = Input::new( ah )
183
+ end
184
+
185
+ @form_stack.last.add_param elem if @form_stack.last
186
+ @elem_stack.last.children.push elem
187
+ end
188
+
189
+ def do_frame( attrs )
190
+ ah = attrs_to_hash attrs
191
+ ah['src'] = complete_url( ah['src'], @response.url )
192
+ elem = Frame::new( ah )
193
+ @response.add_frame( elem )
194
+ end
195
+
196
+ def do_img( attrs )
197
+ ah = attrs_to_hash attrs
198
+ elem = Image::new( ah )
199
+ @response.add_image( elem )
200
+ @elem_stack.last.children.push elem
201
+ end
202
+
203
+ # ignore tag
204
+ def ignore( arr )
205
+ arr.each do |t|
206
+ self.instance_eval( "def start_#{t}( a ); end" )
207
+ self.instance_eval( "def end_#{t}; end" )
208
+ self.instance_eval( "def do_#{t}( a ); end" )
209
+ end
210
+ end
211
+
212
+ def self::ignore( arr )
213
+ @@ignoretags = arr
214
+ end
215
+
216
+ # utils
217
+
218
+ def attrs_to_hash( attrs )
219
+ h = {}
220
+ for a, v in attrs
221
+ v = v.split('"')[1]
222
+ h[a] = v ? v : ''
223
+ end
224
+ h
225
+ end
226
+
227
+ end
228
+
229
+ end
@@ -0,0 +1,464 @@
1
+ =begin
2
+ = WebUnit::Response
3
+ Copyright(C) 2001 yuichi TAKAHASHI, Narushima Hironori.
4
+ $Id: response.rb,v 1.1.1.1 2003/01/21 11:50:40 yuichi Exp $
5
+ =end
6
+
7
+ require 'net/http'
8
+
9
+ module WebUnit
10
+
11
+ class Response
12
+
13
+ include Utils
14
+
15
+ @@host = nil
16
+ @@port = nil
17
+ @@http = nil
18
+
19
+ attr_reader :url, :method, :response, :body, :code
20
+ attr_reader :tree, :links, :forms, :tables, :frames, :images
21
+ attr_accessor :username, :password
22
+
23
+ =begin
24
+ --- Response.get(url,data=nil)
25
+ return a Response.
26
+ =end
27
+ def self::get( url, data=nil, up=nil )
28
+ r = self.new
29
+ r.username = up[0] if up
30
+ r.password = up[1] if up
31
+ r.init_http( url, "GET", data )
32
+ end
33
+
34
+ =begin
35
+ --- Response.post(url,data=nil)
36
+ return a Response.
37
+ =end
38
+ def self::post( url, data=nil, up=nil )
39
+ r = self.new
40
+ r.username = up[0] if up
41
+ r.password = up[1] if up
42
+ r.init_http( url, "POST", data )
43
+ end
44
+
45
+ =begin
46
+ --- Response.html( html)
47
+ return a Response.
48
+ =end
49
+
50
+ def self::html( html, url=nil )
51
+ html = "<html>#{html}</html>" unless html =~ %r!^<html>!
52
+ self.new.init_html( html, url )
53
+ end
54
+
55
+ def self::reset
56
+ begin
57
+ @@http.finish if @@http
58
+ rescue IOError
59
+ @@http = nil
60
+ end
61
+ @@host = nil
62
+ @@port = nil
63
+ @@http = nil
64
+ end
65
+
66
+ def init_html( html, url )
67
+ @url = url
68
+ @method = 'html'
69
+ @body = html
70
+ feed
71
+ self
72
+ end
73
+
74
+ def do_connect(host, port)
75
+ if @@host != host or @@port != port
76
+ @@host = host
77
+ @@port = port
78
+ begin
79
+ @@http.finish if @@http
80
+ rescue IOError
81
+ @@http = nil
82
+ end
83
+ @@http = Net::HTTP::new( host, port )
84
+ end
85
+ end
86
+
87
+ def init_http( url, method, data=nil, retried=false, multipart=false)
88
+ url = $URLBASE + url unless url =~ %r!://!
89
+ @url = url
90
+ @method = method
91
+ header = {}
92
+
93
+ prot,host,port,path = parse_url( url )
94
+ do_connect( host, port)
95
+
96
+ header.update( Cookies::header( path ) )
97
+ @username ||= nil; @password ||= nil
98
+ if @username != nil && @password != nil
99
+ header['authorization'] =
100
+ 'Basic ' + ["#{@username}:#{@password}"].pack('m').gsub(/\s+/, '')
101
+ end
102
+
103
+ begin
104
+ if multipart
105
+ header['Content-type'] = "multipart/form-data,boundary=#{BOUNDARY}"
106
+
107
+ #puts data
108
+
109
+ @response = @@http.post2( path, data.gsub("\n", "\r\n"), header)
110
+ else
111
+ case @method.upcase
112
+ when "GET" then
113
+ path << '?' + data if data
114
+ puts path if $DEBUG
115
+ @response = @@http.get2( path, header )
116
+ when "POST" then
117
+ if header['Content-type'] == nil
118
+ header['Content-type'] = "application/x-www-form-urlencoded"
119
+ end
120
+ @response = @@http.post2( path, data, header )
121
+ end
122
+ end
123
+ rescue Errno::EPIPE
124
+ @@host = nil
125
+ raise if retried
126
+ return self.init_http( url, method, data, true, multipart)
127
+ end
128
+
129
+ @body = @response.body
130
+ @code = @response.code
131
+ p @response['set-cookie'] if $DEBUG
132
+ Cookies::update( @response['set-cookie'] )
133
+ case @response['content-type']
134
+ when %r!text/html!
135
+ feed
136
+ when %r!text/xml!
137
+ return DomWalker::new( @response.body )
138
+ end
139
+
140
+ raise HttpNotFound if @code == "404"
141
+ self
142
+ end
143
+
144
+ def feed
145
+ @forms = []
146
+ @tables = []
147
+ @links = []
148
+ @frames = []
149
+ @images = []
150
+
151
+ @code ||= nil
152
+ if @code == '302'
153
+ @links.push Link.new( 'href' => @response['Location'] ) if @response.key? 'Location'
154
+ end
155
+ p = Parser.new
156
+ @tree = p.feed( self )
157
+ p.close
158
+ freeze
159
+ end
160
+
161
+ def add_link( link )
162
+ @links.push( link )
163
+ end
164
+
165
+ def add_form( form )
166
+ @forms.push( form )
167
+ end
168
+
169
+ def add_frame( frame )
170
+ @frames.push( frame )
171
+ end
172
+
173
+ def add_table( table )
174
+ @tables.push( table )
175
+ end
176
+
177
+ def add_image( image )
178
+ @images.push( image )
179
+ end
180
+
181
+ def freeze
182
+ @forms.each do |f|
183
+ f.freeze
184
+ end
185
+ end
186
+
187
+ =begin
188
+ --- Response#title
189
+ return title.
190
+ =end
191
+
192
+ def title
193
+ @tree.find( 'title' )[0].data
194
+ end
195
+
196
+ =begin
197
+ --- Response#find( tag )
198
+ same as Htmlelem#find.
199
+ =end
200
+
201
+ def find( tag )
202
+ @tree.find( tag )
203
+ end
204
+
205
+ =begin
206
+ --- Response#search( str )
207
+ same as Htmlelem#search.
208
+ =end
209
+
210
+ def search( str )
211
+ @tree.search( str )
212
+ end
213
+
214
+ =begin
215
+ --- Response#readlink( str )
216
+ same as Htmlelem#find.
217
+ =end
218
+
219
+ def readlink( str )
220
+ @tree.readlink( str )
221
+ end
222
+
223
+ =begin
224
+ --- Response#click( str )
225
+ at first Response#readlink, and then, Form#submit.
226
+ =end
227
+
228
+ def click( str, x=nil, y=nil )
229
+ begin
230
+ @tree.readlink( str )
231
+ rescue ElemNotFound
232
+ matched = 0
233
+ @tree.find( 'input' ).each do |i|
234
+ if i.class == InputSubmit
235
+ matched = i.name if i.name == str || i.value == str
236
+ elsif i.class == InputImage
237
+ matched = i.name if i.name == str
238
+ end
239
+ end
240
+ if matched == 0
241
+ raise ElemNotFound
242
+ else
243
+ submit( matched, x, y )
244
+ end
245
+ end
246
+ end
247
+
248
+ =begin
249
+ --- Response#submit( button=nil,x=nil,y=nil)
250
+ short for Response.forms[0].submit.
251
+ =end
252
+
253
+ def submit( button=nil, x=nil, y=nil )
254
+ @forms[0].submit( button, x, y )
255
+ end
256
+
257
+ def push( button=nil )
258
+ $stderr.puts "no longer support Response#push, use Response#submit"
259
+ submit
260
+ end
261
+
262
+ =begin
263
+ --- Response#param
264
+ short for Response.forms[0].params
265
+ =end
266
+
267
+ def params
268
+ @forms[0].params
269
+ end
270
+
271
+ =begin
272
+ --- Response#image
273
+ =end
274
+
275
+ def image
276
+ self.images[0]
277
+ end
278
+
279
+ =begin
280
+ --- Response#link
281
+ short for Response.links[0]
282
+ =end
283
+
284
+ def link
285
+ @links[0]
286
+ end
287
+
288
+ =begin
289
+ --- Response#form
290
+ short for Response.forms[0]
291
+ =end
292
+
293
+ def form
294
+ @forms[0]
295
+ end
296
+
297
+ =begin
298
+ --- Response#table
299
+ short for Response.tables[0]
300
+ =end
301
+
302
+ def table
303
+ @tables[0]
304
+ end
305
+
306
+ =begin
307
+ --- Response#frame
308
+ short for Response.frames[0]
309
+ =end
310
+
311
+ def frame
312
+ @frames[0]
313
+ end
314
+
315
+ =begin
316
+ --- Response#redirect
317
+ =end
318
+
319
+ def redirect
320
+ if @code == '302'
321
+ @links[0].read
322
+ else
323
+ raise BadOperation
324
+ end
325
+ end
326
+
327
+ =begin
328
+ --- Response#opens
329
+ =end
330
+
331
+ def opens
332
+ a = []
333
+ re_script = %r|<!--(.*?)// *-->|m
334
+ re_open = %r|open\( *['"]([^'"]*)['"], *['"]([^'"]*)['"] *\)|
335
+ body_rest = response.body
336
+ while re_script =~ body_rest
337
+ body_rest = $'
338
+ rest = $1
339
+ while re_open =~ rest
340
+ ah = {}
341
+ ah['file'] = $1
342
+ ah['target'] = $2
343
+ ah['url'] = complete_url( ah['file'], @url )
344
+ a << JSciriptOpenObject::new( ah )
345
+ rest = $'
346
+ end
347
+ end
348
+ a
349
+ end
350
+
351
+ def js_open_objs
352
+ $stderr.puts "no longer support Response#js_open_objs, use Response#opens"
353
+ opens
354
+ end
355
+
356
+ =begin
357
+ --- Response#open
358
+ short for Response.opens[0]
359
+ =end
360
+
361
+ def open
362
+ opens[0]
363
+ end
364
+
365
+ =begin
366
+ --- Response#pbody
367
+ =end
368
+
369
+ def pbody
370
+ puts "\n" + '-' * 72
371
+ puts self.format
372
+ puts '-' * 72
373
+ end
374
+
375
+ =begin
376
+ --- Response#format
377
+ =end
378
+
379
+ def format
380
+ w = MemWriter.new
381
+ p = HTMLParser.new( AbstractFormatter.new( w ) )
382
+ p.feed( @body )
383
+ p.close
384
+ w.to_s
385
+ end
386
+
387
+ end
388
+
389
+ class MemWriter < NullWriter
390
+
391
+ def initialize
392
+ @body = ''
393
+ @maxcol = 72
394
+ super()
395
+ reset
396
+ end
397
+
398
+ def reset
399
+ @col = 0
400
+ @atbreak = false
401
+ end
402
+
403
+ def to_s
404
+ @body.squeeze( "\n" )
405
+ end
406
+
407
+ def send_paragraph(blankline)
408
+ @body << ("\n" + "\n"*blankline)
409
+ @col = 0
410
+ @atbreak = false
411
+ end
412
+
413
+ def send_line_break
414
+ @body << ("\n")
415
+ @col = 0
416
+ @atbreak = false
417
+ end
418
+
419
+ def send_hor_rule #(*args, **kw)
420
+ @body << ("\n")
421
+ @body << ('-'*@maxcol)
422
+ @body << ("\n")
423
+ @col = 0
424
+ @atbreak = false
425
+ end
426
+
427
+ def send_literal_data(data)
428
+ @body << (data)
429
+ i = data.rindex("\n")
430
+ if i
431
+ @col = 0
432
+ data = data[i+1..-1]
433
+ #data = string.expandtabs(data)
434
+ @col = @col + data.length
435
+ @atbreak = false
436
+ end
437
+ end
438
+
439
+ def send_flowing_data(data)
440
+ return if not data
441
+ atbreak = (@atbreak || (/^\s/ =~ data))
442
+ col = @col
443
+ maxcol = @maxcol
444
+ for word in data.split
445
+ if atbreak
446
+ if col + word.length >= maxcol
447
+ @body << ("\n")
448
+ col = 0
449
+ else
450
+ @body << (' ')
451
+ col = col + 1
452
+ end
453
+ end
454
+ @body << (word)
455
+ col = col + word.length
456
+ atbreak = true
457
+ end
458
+ @col = col
459
+ @atbreak = (/\s$/ =~ data)
460
+ end
461
+
462
+ end
463
+
464
+ end