ruby-web 1.1.1
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.
- data/ChangeLog +474 -0
- data/INSTALL.txt +9 -0
- data/InstalledFiles +180 -0
- data/LICENSE.txt +74 -0
- data/Rakefile +529 -0
- data/TODO +65 -0
- data/doc/additional.xml +149 -0
- data/doc/core.xml +652 -0
- data/doc/credits/index.xml +52 -0
- data/doc/credits/php.contributors.xml +118 -0
- data/doc/credits/php.language-snippets.ent +622 -0
- data/doc/install/index.xml +136 -0
- data/doc/install/mac/index.xml +21 -0
- data/doc/install/ruby-web.install.rb.instructions.xml +7 -0
- data/doc/install/unix/index.xml +46 -0
- data/doc/install/win/apache1.xml +166 -0
- data/doc/install/win/apache2.xml +141 -0
- data/doc/install/win/iis.xml +162 -0
- data/doc/install/win/index.xml +24 -0
- data/doc/install/win/installer.xml +31 -0
- data/doc/install/win/manual.xml +43 -0
- data/doc/manual.xml +69 -0
- data/doc/old/apache_cgi.txt +23 -0
- data/doc/old/fastcgi.txt +23 -0
- data/doc/old/mod_ruby.txt +21 -0
- data/doc/old/snippets.rdoc +183 -0
- data/doc/old/webrick.txt +23 -0
- data/doc/old/windows_cgi.txt +9 -0
- data/doc/tutorial.xml +14 -0
- data/doc/xsl/manual-multi.xsl +10 -0
- data/doc/xsl/manual-pdf.xsl +6 -0
- data/doc/xsl/manual-single.xsl +6 -0
- data/doc/xsl/manual.css +22 -0
- data/install.rb +1022 -0
- data/lib/formatter.rb +314 -0
- data/lib/html-parser.rb +429 -0
- data/lib/htmlrepair.rb +113 -0
- data/lib/htmlsplit.rb +842 -0
- data/lib/sgml-parser.rb +332 -0
- data/lib/web.rb +68 -0
- data/lib/web/assertinclude.rb +129 -0
- data/lib/web/config.rb +50 -0
- data/lib/web/connection.rb +1070 -0
- data/lib/web/convenience.rb +154 -0
- data/lib/web/formreader.rb +318 -0
- data/lib/web/htmlparser/html-parser.rb +429 -0
- data/lib/web/htmlparser/sgml-parser.rb +332 -0
- data/lib/web/htmltools/element.rb +296 -0
- data/lib/web/htmltools/stparser.rb +276 -0
- data/lib/web/htmltools/tags.rb +286 -0
- data/lib/web/htmltools/tree.rb +139 -0
- data/lib/web/htmltools/xmltree.rb +160 -0
- data/lib/web/htmltools/xpath.rb +71 -0
- data/lib/web/info.rb +63 -0
- data/lib/web/load.rb +210 -0
- data/lib/web/mime.rb +87 -0
- data/lib/web/phprb.rb +340 -0
- data/lib/web/resources/test/cookie.rb +33 -0
- data/lib/web/resources/test/counter.rb +20 -0
- data/lib/web/resources/test/multipart.rb +14 -0
- data/lib/web/resources/test/redirect.rb +8 -0
- data/lib/web/resources/test/stock.rb +33 -0
- data/lib/web/sapi/apache.rb +129 -0
- data/lib/web/sapi/fastcgi.rb +22 -0
- data/lib/web/sapi/install/apache.rb +180 -0
- data/lib/web/sapi/install/iis.rb +93 -0
- data/lib/web/sapi/install/macosx.rb +90 -0
- data/lib/web/sapi/webrick.rb +86 -0
- data/lib/web/session.rb +83 -0
- data/lib/web/shim/cgi.rb +129 -0
- data/lib/web/shim/rails.rb +175 -0
- data/lib/web/stringio.rb +78 -0
- data/lib/web/strscanparser.rb +24 -0
- data/lib/web/tagparser.rb +96 -0
- data/lib/web/testing.rb +666 -0
- data/lib/web/traceoutput.rb +75 -0
- data/lib/web/unit.rb +56 -0
- data/lib/web/upload.rb +59 -0
- data/lib/web/validate.rb +52 -0
- data/lib/web/wiki.rb +557 -0
- data/lib/web/wiki/linker.rb +72 -0
- data/lib/web/wiki/page.rb +201 -0
- data/lib/webunit.rb +27 -0
- data/lib/webunit/assert.rb +152 -0
- data/lib/webunit/converter.rb +154 -0
- data/lib/webunit/cookie.rb +118 -0
- data/lib/webunit/domwalker.rb +185 -0
- data/lib/webunit/exception.rb +14 -0
- data/lib/webunit/form.rb +116 -0
- data/lib/webunit/frame.rb +37 -0
- data/lib/webunit/htmlelem.rb +122 -0
- data/lib/webunit/image.rb +26 -0
- data/lib/webunit/jscript.rb +31 -0
- data/lib/webunit/link.rb +33 -0
- data/lib/webunit/params.rb +321 -0
- data/lib/webunit/parser.rb +229 -0
- data/lib/webunit/response.rb +464 -0
- data/lib/webunit/runtest.rb +41 -0
- data/lib/webunit/table.rb +148 -0
- data/lib/webunit/testcase.rb +45 -0
- data/lib/webunit/ui/cui/testrunner.rb +50 -0
- data/lib/webunit/utils.rb +68 -0
- data/lib/webunit/webunit.rb +28 -0
- data/test/dev/action.rb +83 -0
- data/test/dev/forms.rb +104 -0
- data/test/dev/forms2.rb +104 -0
- data/test/dev/parser.rb +17 -0
- data/test/dev/scripts/dump.rb +24 -0
- data/test/dev/scripts/makedist.rb +62 -0
- data/test/dev/scripts/uri.rb +41 -0
- data/test/dev/scripts/uri/common.rb +432 -0
- data/test/dev/scripts/uri/ftp.rb +149 -0
- data/test/dev/scripts/uri/generic.rb +1106 -0
- data/test/dev/scripts/uri/http.rb +76 -0
- data/test/dev/scripts/uri/https.rb +26 -0
- data/test/dev/scripts/uri/ldap.rb +238 -0
- data/test/dev/scripts/uri/mailto.rb +260 -0
- data/test/dev/scripts/urireg.rb +174 -0
- data/test/dev/simpledispatcher.rb +156 -0
- data/test/dev/test.action.rb +146 -0
- data/test/dev/test.formreader.rb +463 -0
- data/test/dev/test.simpledispatcher.rb +186 -0
- data/test/dev/webunit/conv/digit-0.rb +21 -0
- data/test/dev/webunit/conv/digit-1.rb +17 -0
- data/test/dev/webunit/conv/digit.rb +23 -0
- data/test/dev/webunit/conv/test_digit-0.rb +16 -0
- data/test/dev/webunit/conv/test_digit-1.rb +19 -0
- data/test/dev/webunit/conv/test_digit.rb +26 -0
- data/test/dev/webunit/conv/test_digit_view-0.rb +76 -0
- data/test/dev/webunit/conv/test_digit_view-1.rb +102 -0
- data/test/dev/webunit/conv/test_digit_view.rb +134 -0
- data/test/installation/htdocs/cgi_test.rb +296 -0
- data/test/installation/htdocs/test_install.rb +4 -0
- data/test/installation/runwebtest.rb +5 -0
- data/test/installation/test_cookie.rb +128 -0
- data/test/installation/test_form.rb +47 -0
- data/test/installation/test_multipart.rb +51 -0
- data/test/installation/test_request.rb +24 -0
- data/test/installation/test_response.rb +35 -0
- data/test/unit/htdocs/cookie.rb +32 -0
- data/test/unit/htdocs/multipart.rb +28 -0
- data/test/unit/htdocs/redirect.rb +12 -0
- data/test/unit/htdocs/simple.rb +13 -0
- data/test/unit/htdocs/stock.rb +33 -0
- data/test/unit/test_assert.rb +162 -0
- data/test/unit/test_cookie.rb +114 -0
- data/test/unit/test_domwalker.rb +77 -0
- data/test/unit/test_form.rb +42 -0
- data/test/unit/test_frame.rb +40 -0
- data/test/unit/test_htmlelem.rb +74 -0
- data/test/unit/test_image.rb +45 -0
- data/test/unit/test_jscript.rb +57 -0
- data/test/unit/test_link.rb +85 -0
- data/test/unit/test_multipart.rb +51 -0
- data/test/unit/test_params.rb +210 -0
- data/test/unit/test_parser.rb +53 -0
- data/test/unit/test_response.rb +150 -0
- data/test/unit/test_table.rb +70 -0
- data/test/unit/test_utils.rb +106 -0
- data/test/unit/test_webunit.rb +28 -0
- data/test/web/mod_ruby_stub.rb +39 -0
- data/test/web/test.assertinclude.rb +109 -0
- data/test/web/test.buffer.rb +182 -0
- data/test/web/test.code.loader.rb +78 -0
- data/test/web/test.config.rb +31 -0
- data/test/web/test.error.handling.rb +91 -0
- data/test/web/test.formreader-2.0.rb +352 -0
- data/test/web/test.load.rb +125 -0
- data/test/web/test.mime-type.rb +23 -0
- data/test/web/test.narf.cgi.rb +106 -0
- data/test/web/test.phprb.rb +239 -0
- data/test/web/test.request.rb +368 -0
- data/test/web/test.response.rb +637 -0
- data/test/web/test.ruby-web.rb +10 -0
- data/test/web/test.session.rb +50 -0
- data/test/web/test.shim.cgi.rb +96 -0
- data/test/web/test.tagparser.rb +65 -0
- data/test/web/test.template2.rb +297 -0
- data/test/web/test.testing2.rb +318 -0
- data/test/web/test.upload.rb +45 -0
- data/test/web/test.validate.rb +46 -0
- data/test/web/test.web.test.rb +495 -0
- data/test/wiki/test.history.rb +297 -0
- data/test/wiki/test.illustration_page.rb +287 -0
- data/test/wiki/test.linker.rb +197 -0
- data/test/wiki/test.tarpit.rb +56 -0
- data/test/wiki/test.wiki.rb +300 -0
- data/test/wikitestroot/admin.rb +7 -0
- data/test/wikitestroot/wiki.rb +6 -0
- metadata +234 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#
|
|
2
|
+
# $Id: http.rb,v 1.1.1.1 2002/11/29 04:34:25 patsplat Exp $
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2001 akira yamada <akira@ruby-lang.org>
|
|
5
|
+
# You can redistribute it and/or modify it under the same term as Ruby.
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
require 'uri/generic'
|
|
9
|
+
|
|
10
|
+
module URI
|
|
11
|
+
|
|
12
|
+
=begin
|
|
13
|
+
|
|
14
|
+
== URI::HTTP
|
|
15
|
+
|
|
16
|
+
=== Super Class
|
|
17
|
+
|
|
18
|
+
((<URI::Generic>))
|
|
19
|
+
|
|
20
|
+
=end
|
|
21
|
+
|
|
22
|
+
# RFC1738 section 3.3.
|
|
23
|
+
class HTTP < Generic
|
|
24
|
+
DEFAULT_PORT = 80
|
|
25
|
+
|
|
26
|
+
COMPONENT = [
|
|
27
|
+
:scheme,
|
|
28
|
+
:userinfo, :host, :port,
|
|
29
|
+
:path,
|
|
30
|
+
:query,
|
|
31
|
+
:fragment
|
|
32
|
+
].freeze
|
|
33
|
+
|
|
34
|
+
=begin
|
|
35
|
+
|
|
36
|
+
=== Class Methods
|
|
37
|
+
|
|
38
|
+
--- URI::HTTP::build
|
|
39
|
+
Create a new URI::HTTP object from components of URI::HTTP with
|
|
40
|
+
check. It is scheme, userinfo, host, port, path, query and
|
|
41
|
+
fragment. It provided by an Array of a Hash.
|
|
42
|
+
|
|
43
|
+
--- URI::HTTP::new
|
|
44
|
+
Create a new URI::HTTP object from ``generic'' components with no
|
|
45
|
+
check.
|
|
46
|
+
|
|
47
|
+
=end
|
|
48
|
+
|
|
49
|
+
def self.build(args)
|
|
50
|
+
tmp = Util::make_components_hash(self, args)
|
|
51
|
+
return super(tmp)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def initialize(*arg)
|
|
55
|
+
super(*arg)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
=begin
|
|
59
|
+
|
|
60
|
+
=== Instance Methods
|
|
61
|
+
|
|
62
|
+
--- URI::HTTP#request_uri
|
|
63
|
+
|
|
64
|
+
=end
|
|
65
|
+
def request_uri
|
|
66
|
+
r = path_query
|
|
67
|
+
if r[0] != ?/
|
|
68
|
+
r = '/' + r
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
r
|
|
72
|
+
end
|
|
73
|
+
end # HTTP
|
|
74
|
+
|
|
75
|
+
@@schemes['HTTP'] = HTTP
|
|
76
|
+
end # URI
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#
|
|
2
|
+
# $Id: https.rb,v 1.1.1.1 2002/11/29 04:34:25 patsplat Exp $
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2001 akira yamada <akira@ruby-lang.org>
|
|
5
|
+
# You can redistribute it and/or modify it under the same term as Ruby.
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
require 'uri/http'
|
|
9
|
+
|
|
10
|
+
module URI
|
|
11
|
+
|
|
12
|
+
=begin
|
|
13
|
+
|
|
14
|
+
== URI::HTTPS
|
|
15
|
+
|
|
16
|
+
=== Super Class
|
|
17
|
+
|
|
18
|
+
((<URI::HTTP>))
|
|
19
|
+
|
|
20
|
+
=end
|
|
21
|
+
|
|
22
|
+
class HTTPS < HTTP
|
|
23
|
+
DEFAULT_PORT = 443
|
|
24
|
+
end
|
|
25
|
+
@@schemes['HTTPS'] = HTTPS
|
|
26
|
+
end # URI
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
#
|
|
2
|
+
# $Id: ldap.rb,v 1.1.1.1 2002/11/29 04:34:25 patsplat Exp $
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
require 'uri/generic'
|
|
6
|
+
|
|
7
|
+
module URI
|
|
8
|
+
|
|
9
|
+
=begin
|
|
10
|
+
|
|
11
|
+
== URI::LDAP
|
|
12
|
+
|
|
13
|
+
URI::LDAP is copyrighted free software by Takaaki Tateishi and akira yamada.
|
|
14
|
+
|
|
15
|
+
Copyright (c) 2001 Takaaki Tateishi <ttate@jaist.ac.jp> and
|
|
16
|
+
akira yamada <akira@ruby-lang.org>.
|
|
17
|
+
You can redistribute it and/or modify it under the same term as Ruby.
|
|
18
|
+
|
|
19
|
+
=== Super Class
|
|
20
|
+
|
|
21
|
+
((<URI::Generic>))
|
|
22
|
+
|
|
23
|
+
=end
|
|
24
|
+
|
|
25
|
+
# LDAP URI SCHEMA (described in RFC2255)
|
|
26
|
+
# ldap://<host>/<dn>[?<attrs>[?<scope>[?<filter>[?<extensions>]]]]
|
|
27
|
+
class LDAP < Generic
|
|
28
|
+
|
|
29
|
+
DEFAULT_PORT = 389
|
|
30
|
+
|
|
31
|
+
COMPONENT = [
|
|
32
|
+
:scheme,
|
|
33
|
+
:host, :port,
|
|
34
|
+
:dn,
|
|
35
|
+
:attributes,
|
|
36
|
+
:scope,
|
|
37
|
+
:filter,
|
|
38
|
+
:extensions,
|
|
39
|
+
].freeze
|
|
40
|
+
|
|
41
|
+
SCOPE = [
|
|
42
|
+
SCOPE_ONE = 'one',
|
|
43
|
+
SCOPE_SUB = 'sub',
|
|
44
|
+
SCOPE_BASE = 'base',
|
|
45
|
+
].freeze
|
|
46
|
+
|
|
47
|
+
=begin
|
|
48
|
+
|
|
49
|
+
=== Class Methods
|
|
50
|
+
|
|
51
|
+
--- URI::LDAP::build
|
|
52
|
+
|
|
53
|
+
--- URI::LDAP::new
|
|
54
|
+
|
|
55
|
+
=end
|
|
56
|
+
|
|
57
|
+
def self.build(args)
|
|
58
|
+
tmp = Util::make_components_hash(self, args)
|
|
59
|
+
|
|
60
|
+
if tmp[:dn]
|
|
61
|
+
tmp[:path] = tmp[:dn]
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
query = []
|
|
65
|
+
[:extensions, :filter, :scope, :attributes].collect do |x|
|
|
66
|
+
next if !tmp[x] && query.size == 0
|
|
67
|
+
query.unshift(tmp[x])
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
tmp[:query] = query.join('?')
|
|
71
|
+
|
|
72
|
+
return super(tmp)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def initialize(*arg)
|
|
76
|
+
super(*arg)
|
|
77
|
+
|
|
78
|
+
if @fragment
|
|
79
|
+
raise InvalidURIError, 'bad LDAP URL'
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
parse_dn
|
|
83
|
+
parse_query
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def parse_dn
|
|
87
|
+
@dn = @path[1..-1]
|
|
88
|
+
end
|
|
89
|
+
private :parse_dn
|
|
90
|
+
|
|
91
|
+
def parse_query
|
|
92
|
+
@attributes = nil
|
|
93
|
+
@scope = nil
|
|
94
|
+
@filter = nil
|
|
95
|
+
@extensions = nil
|
|
96
|
+
|
|
97
|
+
if @query
|
|
98
|
+
attrs, scope, filter, extensions = @query.split('?')
|
|
99
|
+
|
|
100
|
+
@attributes = attrs if attrs && attrs.size > 0
|
|
101
|
+
@scope = scope if scope && scope.size > 0
|
|
102
|
+
@filter = filter if filter && filter.size > 0
|
|
103
|
+
@extensions = extensions if extensions && extensions.size > 0
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
private :parse_query
|
|
107
|
+
|
|
108
|
+
def build_path_query
|
|
109
|
+
@path = '/' + @dn
|
|
110
|
+
|
|
111
|
+
query = []
|
|
112
|
+
[@extensions, @filter, @scope, @attributes].each do |x|
|
|
113
|
+
next if !x && query.size == 0
|
|
114
|
+
query.unshift(x)
|
|
115
|
+
end
|
|
116
|
+
@query = query.join('?')
|
|
117
|
+
end
|
|
118
|
+
private :build_path_query
|
|
119
|
+
|
|
120
|
+
=begin
|
|
121
|
+
|
|
122
|
+
=== Instance Methods
|
|
123
|
+
|
|
124
|
+
--- URI::LDAP#dn
|
|
125
|
+
|
|
126
|
+
--- URI::LDAP#dn=(v)
|
|
127
|
+
|
|
128
|
+
=end
|
|
129
|
+
|
|
130
|
+
def dn
|
|
131
|
+
@dn
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def set_dn(val)
|
|
135
|
+
@dn = val
|
|
136
|
+
build_path_query
|
|
137
|
+
end
|
|
138
|
+
protected :set_dn
|
|
139
|
+
|
|
140
|
+
def dn=(val)
|
|
141
|
+
set_dn(val)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
=begin
|
|
145
|
+
|
|
146
|
+
--- URI::LDAP#attributes
|
|
147
|
+
|
|
148
|
+
--- URI::LDAP#attributes=(v)
|
|
149
|
+
|
|
150
|
+
=end
|
|
151
|
+
|
|
152
|
+
def attributes
|
|
153
|
+
@attributes
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def set_attributes(val)
|
|
157
|
+
@attributes = val
|
|
158
|
+
build_path_query
|
|
159
|
+
end
|
|
160
|
+
protected :set_attributes
|
|
161
|
+
|
|
162
|
+
def attributes=(val)
|
|
163
|
+
set_attributes(val)
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
=begin
|
|
167
|
+
|
|
168
|
+
--- URI::LDAP#scope
|
|
169
|
+
|
|
170
|
+
--- URI::LDAP#scope=(v)
|
|
171
|
+
|
|
172
|
+
=end
|
|
173
|
+
|
|
174
|
+
def scope
|
|
175
|
+
@scope
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def set_scope(val)
|
|
179
|
+
@scope = val
|
|
180
|
+
build_path_query
|
|
181
|
+
end
|
|
182
|
+
protected :set_scope
|
|
183
|
+
|
|
184
|
+
def scope=(val)
|
|
185
|
+
set_scope(val)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
=begin
|
|
189
|
+
|
|
190
|
+
--- URI::LDAP#filter
|
|
191
|
+
|
|
192
|
+
--- URI::LDAP#filter=(v)
|
|
193
|
+
|
|
194
|
+
=end
|
|
195
|
+
|
|
196
|
+
def filter
|
|
197
|
+
@filter
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def set_filter(val)
|
|
201
|
+
@filter = val
|
|
202
|
+
build_path_query
|
|
203
|
+
end
|
|
204
|
+
protected :set_filter
|
|
205
|
+
|
|
206
|
+
def filter=(val)
|
|
207
|
+
set_filter(val)
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
=begin
|
|
211
|
+
|
|
212
|
+
--- URI::LDAP#extensions
|
|
213
|
+
|
|
214
|
+
--- URI::LDAP#extensions=(v)
|
|
215
|
+
|
|
216
|
+
=end
|
|
217
|
+
|
|
218
|
+
def extensions
|
|
219
|
+
@extensions
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def set_extensions(val)
|
|
223
|
+
@extensions = val
|
|
224
|
+
build_path_query
|
|
225
|
+
end
|
|
226
|
+
protected :set_extensions
|
|
227
|
+
|
|
228
|
+
def extensions=(val)
|
|
229
|
+
set_extensions(val)
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
def hierarchical?
|
|
234
|
+
false
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
@@schemes['LDAP'] = LDAP
|
|
238
|
+
end
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
#
|
|
2
|
+
# $Id: mailto.rb,v 1.1.1.1 2002/11/29 04:34:25 patsplat Exp $
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2001 akira yamada <akira@ruby-lang.org>
|
|
5
|
+
# You can redistribute it and/or modify it under the same term as Ruby.
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
require 'uri/generic'
|
|
9
|
+
|
|
10
|
+
module URI
|
|
11
|
+
|
|
12
|
+
=begin
|
|
13
|
+
|
|
14
|
+
== URI::MailTo
|
|
15
|
+
|
|
16
|
+
=== Super Class
|
|
17
|
+
|
|
18
|
+
((<URI::Generic>))
|
|
19
|
+
|
|
20
|
+
=end
|
|
21
|
+
|
|
22
|
+
# RFC2368, The mailto URL scheme
|
|
23
|
+
class MailTo < Generic
|
|
24
|
+
include REGEXP
|
|
25
|
+
|
|
26
|
+
DEFAULT_PORT = nil
|
|
27
|
+
|
|
28
|
+
COMPONENT = [
|
|
29
|
+
:scheme,
|
|
30
|
+
:to, :headers
|
|
31
|
+
].freeze
|
|
32
|
+
|
|
33
|
+
# "hname" and "hvalue" are encodings of an RFC 822 header name and
|
|
34
|
+
# value, respectively. As with "to", all URL reserved characters must
|
|
35
|
+
# be encoded.
|
|
36
|
+
#
|
|
37
|
+
# "#mailbox" is as specified in RFC 822 [RFC822]. This means that it
|
|
38
|
+
# consists of zero or more comma-separated mail addresses, possibly
|
|
39
|
+
# including "phrase" and "comment" components. Note that all URL
|
|
40
|
+
# reserved characters in "to" must be encoded: in particular,
|
|
41
|
+
# parentheses, commas, and the percent sign ("%"), which commonly occur
|
|
42
|
+
# in the "mailbox" syntax.
|
|
43
|
+
#
|
|
44
|
+
# Within mailto URLs, the characters "?", "=", "&" are reserved.
|
|
45
|
+
|
|
46
|
+
# hname = *urlc
|
|
47
|
+
# hvalue = *urlc
|
|
48
|
+
# header = hname "=" hvalue
|
|
49
|
+
HEADER_REGEXP = "(?:[^?=&]*=[^?=&]*)".freeze
|
|
50
|
+
# headers = "?" header *( "&" header )
|
|
51
|
+
# to = #mailbox
|
|
52
|
+
# mailtoURL = "mailto:" [ to ] [ headers ]
|
|
53
|
+
MAILBOX_REGEXP = "(?:[^(),%?=&]|#{PATTERN::ESCAPED})".freeze
|
|
54
|
+
MAILTO_REGEXP = Regexp.new("
|
|
55
|
+
\\A
|
|
56
|
+
(#{MAILBOX_REGEXP}*?) (?# 1: to)
|
|
57
|
+
(?:
|
|
58
|
+
\\?
|
|
59
|
+
(#{HEADER_REGEXP}(?:\\&#{HEADER_REGEXP})*) (?# 2: headers)
|
|
60
|
+
)?
|
|
61
|
+
\\z
|
|
62
|
+
", Regexp::EXTENDED, 'N').freeze
|
|
63
|
+
|
|
64
|
+
=begin
|
|
65
|
+
|
|
66
|
+
=== Class Methods
|
|
67
|
+
|
|
68
|
+
--- URI::MailTo::build
|
|
69
|
+
Create a new URI::MailTo object from components of URI::MailTo
|
|
70
|
+
with check. It is to and headers. It provided by an Array of a
|
|
71
|
+
Hash. You can provide headers as an String like
|
|
72
|
+
"subject=subscribe&cc=addr" or an Array like [["subject",
|
|
73
|
+
"subscribe"], ["cc", "addr"]]
|
|
74
|
+
|
|
75
|
+
--- URI::MailTo::new
|
|
76
|
+
Create a new URI::MailTo object from ``generic'' components with
|
|
77
|
+
no check. Because, this method is usually called from URI::parse
|
|
78
|
+
and the method checks validity of each components.
|
|
79
|
+
|
|
80
|
+
=end
|
|
81
|
+
|
|
82
|
+
def self.build(args)
|
|
83
|
+
tmp = Util::make_components_hash(self, args)
|
|
84
|
+
|
|
85
|
+
if tmp[:to]
|
|
86
|
+
tmp[:opaque] = tmp[:to]
|
|
87
|
+
else
|
|
88
|
+
tmp[:opaque] = ''
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
if tmp[:headers]
|
|
92
|
+
tmp[:opaque] << '?'
|
|
93
|
+
|
|
94
|
+
if tmp[:headers].kind_of?(Array)
|
|
95
|
+
tmp[:opaque] << tmp[:headers].collect { |x|
|
|
96
|
+
if x.kind_of?(Array)
|
|
97
|
+
x[0] + '=' + x[1..-1].to_s
|
|
98
|
+
else
|
|
99
|
+
x.to_s
|
|
100
|
+
end
|
|
101
|
+
}.join('&')
|
|
102
|
+
|
|
103
|
+
elsif tmp[:headers].kind_of?(Hash)
|
|
104
|
+
tmp[:opaque] << tmp[:headers].collect { |h,v|
|
|
105
|
+
h + '=' + v
|
|
106
|
+
}.join('&')
|
|
107
|
+
|
|
108
|
+
else
|
|
109
|
+
tmp[:opaque] << tmp[:headers].to_s
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
return super(tmp)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def initialize(*arg)
|
|
117
|
+
super(*arg)
|
|
118
|
+
|
|
119
|
+
@to = nil
|
|
120
|
+
@headers = []
|
|
121
|
+
|
|
122
|
+
if MAILTO_REGEXP =~ @opaque
|
|
123
|
+
if arg[-1]
|
|
124
|
+
self.to = $1
|
|
125
|
+
self.headers = $2
|
|
126
|
+
else
|
|
127
|
+
set_to($1)
|
|
128
|
+
set_headers($2)
|
|
129
|
+
end
|
|
130
|
+
elsif arg[-1]
|
|
131
|
+
raise InvalidComponentError,
|
|
132
|
+
"unrecognised opaque part for mailtoURL: #{@opaque}"
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
attr_reader :to
|
|
136
|
+
attr_reader :headers
|
|
137
|
+
|
|
138
|
+
=begin
|
|
139
|
+
|
|
140
|
+
=== Instance Methods
|
|
141
|
+
|
|
142
|
+
--- URI::MailTo#to
|
|
143
|
+
|
|
144
|
+
--- URI::MailTo#to=(v)
|
|
145
|
+
|
|
146
|
+
=end
|
|
147
|
+
|
|
148
|
+
#
|
|
149
|
+
# methods for to
|
|
150
|
+
#
|
|
151
|
+
|
|
152
|
+
def check_to(v)
|
|
153
|
+
return true unless v
|
|
154
|
+
return true if v.size == 0
|
|
155
|
+
|
|
156
|
+
if OPAQUE !~ v || /\A#{MAILBOX_REGEXP}*\z/o !~ v
|
|
157
|
+
raise InvalidComponentError,
|
|
158
|
+
"bad component(expected opaque component): #{v}"
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
return true
|
|
162
|
+
end
|
|
163
|
+
private :check_to
|
|
164
|
+
|
|
165
|
+
def set_to(v)
|
|
166
|
+
@to = v
|
|
167
|
+
end
|
|
168
|
+
protected :set_to
|
|
169
|
+
|
|
170
|
+
def to=(v)
|
|
171
|
+
check_to(v)
|
|
172
|
+
set_to(v)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
=begin
|
|
176
|
+
|
|
177
|
+
--- URI::MailTo#headers
|
|
178
|
+
|
|
179
|
+
--- URI::MailTo#headers=(v)
|
|
180
|
+
|
|
181
|
+
=end
|
|
182
|
+
|
|
183
|
+
#
|
|
184
|
+
# methods for headers
|
|
185
|
+
#
|
|
186
|
+
|
|
187
|
+
def check_headers(v)
|
|
188
|
+
return true unless v
|
|
189
|
+
return true if v.size == 0
|
|
190
|
+
|
|
191
|
+
if OPAQUE !~ v ||
|
|
192
|
+
/\A(#{HEADER_REGEXP}(?:\&#{HEADER_REGEXP})*)\z/o !~ v
|
|
193
|
+
raise InvalidComponentError,
|
|
194
|
+
"bad component(expected opaque component): #{v}"
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
return true
|
|
198
|
+
end
|
|
199
|
+
private :check_headers
|
|
200
|
+
|
|
201
|
+
def set_headers(v)
|
|
202
|
+
@headers = []
|
|
203
|
+
if v
|
|
204
|
+
v.scan(HEADER_REGEXP) do |x|
|
|
205
|
+
@headers << x.split(/=/o, 2)
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
protected :set_headers
|
|
210
|
+
|
|
211
|
+
def headers=(v)
|
|
212
|
+
check_headers(v)
|
|
213
|
+
set_headers(v)
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def to_str
|
|
217
|
+
@scheme + ':' +
|
|
218
|
+
if @to
|
|
219
|
+
@to
|
|
220
|
+
else
|
|
221
|
+
''
|
|
222
|
+
end +
|
|
223
|
+
if @headers.size > 0
|
|
224
|
+
'?' + @headers.collect{|x| x.join('=')}.join('&')
|
|
225
|
+
else
|
|
226
|
+
''
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
=begin
|
|
231
|
+
|
|
232
|
+
--- URI::MailTo#to_mailtext
|
|
233
|
+
|
|
234
|
+
=end
|
|
235
|
+
def to_mailtext
|
|
236
|
+
to = URI::unescape(@to)
|
|
237
|
+
head = ''
|
|
238
|
+
body = ''
|
|
239
|
+
@headers.each do |x|
|
|
240
|
+
case x[0]
|
|
241
|
+
when 'body'
|
|
242
|
+
body = URI::unescape(x[1])
|
|
243
|
+
when 'to'
|
|
244
|
+
to << ', ' + URI::unescape(x[1])
|
|
245
|
+
else
|
|
246
|
+
head << URI::unescape(x[0]).capitalize + ': ' +
|
|
247
|
+
URI::unescape(x[1]) + "\n"
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
return "To: #{to}
|
|
252
|
+
#{head}
|
|
253
|
+
#{body}
|
|
254
|
+
"
|
|
255
|
+
end
|
|
256
|
+
alias to_rfc822text to_mailtext
|
|
257
|
+
end # MailTo
|
|
258
|
+
|
|
259
|
+
@@schemes['MAILTO'] = MailTo
|
|
260
|
+
end # URI
|