libisi 0.3.0

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.
Files changed (91) hide show
  1. data/LICENSE +677 -0
  2. data/Manifest +89 -0
  3. data/Rakefile +34 -0
  4. data/lib/inifile.rb +119 -0
  5. data/lib/libisi.rb +948 -0
  6. data/lib/libisi/attribute.rb +32 -0
  7. data/lib/libisi/attribute/activerecord.rb +34 -0
  8. data/lib/libisi/attribute/base.rb +33 -0
  9. data/lib/libisi/base.rb +109 -0
  10. data/lib/libisi/bridge.rb +21 -0
  11. data/lib/libisi/bridge/base.rb +23 -0
  12. data/lib/libisi/bridge/java.rb +71 -0
  13. data/lib/libisi/bridge/python.rb +37 -0
  14. data/lib/libisi/cache.rb +21 -0
  15. data/lib/libisi/cache/base.rb +67 -0
  16. data/lib/libisi/cache/file_cache.rb +24 -0
  17. data/lib/libisi/chart.rb +21 -0
  18. data/lib/libisi/chart/base.rb +320 -0
  19. data/lib/libisi/chart/jfreechart.rb +682 -0
  20. data/lib/libisi/chart/jfreechart_generator.rb +206 -0
  21. data/lib/libisi/color.rb +21 -0
  22. data/lib/libisi/color/base.rb +66 -0
  23. data/lib/libisi/color/colortools.rb +92 -0
  24. data/lib/libisi/color/java.rb +44 -0
  25. data/lib/libisi/concept.rb +33 -0
  26. data/lib/libisi/concept/activerecord.rb +39 -0
  27. data/lib/libisi/concept/base.rb +58 -0
  28. data/lib/libisi/doc.rb +35 -0
  29. data/lib/libisi/doc/base.rb +414 -0
  30. data/lib/libisi/doc/html.rb +85 -0
  31. data/lib/libisi/doc/text.rb +98 -0
  32. data/lib/libisi/doc/wiki.rb +55 -0
  33. data/lib/libisi/environment.rb +21 -0
  34. data/lib/libisi/environment/base.rb +36 -0
  35. data/lib/libisi/environment/http.rb +105 -0
  36. data/lib/libisi/environment/rails.rb +27 -0
  37. data/lib/libisi/environment/root.rb +23 -0
  38. data/lib/libisi/fake_logger/logger.rb +61 -0
  39. data/lib/libisi/function/base.rb +30 -0
  40. data/lib/libisi/hal.rb +558 -0
  41. data/lib/libisi/instance.rb +27 -0
  42. data/lib/libisi/instance/activerecord.rb +21 -0
  43. data/lib/libisi/instance/base.rb +42 -0
  44. data/lib/libisi/log.rb +237 -0
  45. data/lib/libisi/mail/base.rb +32 -0
  46. data/lib/libisi/mail/tmail.rb +120 -0
  47. data/lib/libisi/parameter/base.rb +41 -0
  48. data/lib/libisi/property.rb +27 -0
  49. data/lib/libisi/property/base.rb +28 -0
  50. data/lib/libisi/reciever/base.rb +31 -0
  51. data/lib/libisi/reciever/socket.rb +31 -0
  52. data/lib/libisi/relation.rb +23 -0
  53. data/lib/libisi/request.rb +22 -0
  54. data/lib/libisi/request/base.rb +29 -0
  55. data/lib/libisi/request/http.rb +129 -0
  56. data/lib/libisi/response/base.rb +27 -0
  57. data/lib/libisi/task/base.rb +27 -0
  58. data/lib/libisi/task/http.rb +90 -0
  59. data/lib/libisi/tee.rb +296 -0
  60. data/lib/libisi/ui/base.rb +116 -0
  61. data/lib/libisi/ui/console.rb +238 -0
  62. data/lib/libisi/ui/kde.rb +94 -0
  63. data/lib/libisi/ui/nobody.rb +29 -0
  64. data/lib/libisi/ui/rails.rb +150 -0
  65. data/lib/libisi/ui/x11.rb +55 -0
  66. data/lib/libisi/uri.rb +42 -0
  67. data/lib/libisi/uri/activerecord.rb +152 -0
  68. data/lib/libisi/uri/base.rb +115 -0
  69. data/lib/libisi/uri/file.rb +43 -0
  70. data/lib/libisi/uri/ldap.rb +72 -0
  71. data/lib/libisi/uri/mysql.rb +98 -0
  72. data/lib/libisi/value.rb +31 -0
  73. data/lib/libisi/value/attribute_value.rb +19 -0
  74. data/lib/libisi/value/base.rb +55 -0
  75. data/lib/libisi/value/property_value.rb +19 -0
  76. data/lib/libisi/value/relation_value.rb +19 -0
  77. data/lib/ordered_hash.rb +228 -0
  78. data/libisi.gemspec +31 -0
  79. data/test/bridge_test.rb +77 -0
  80. data/test/cache_test.rb +65 -0
  81. data/test/chart_test.rb +179 -0
  82. data/test/color_test.rb +64 -0
  83. data/test/concept_test.rb +56 -0
  84. data/test/doc_test.rb +172 -0
  85. data/test/fixtures/test.db +0 -0
  86. data/test/ordered_hash_test.rb +39 -0
  87. data/test/profile_test.rb +36 -0
  88. data/test/request_test.rb +121 -0
  89. data/test/test +0 -0
  90. data/test/ui_test.rb +62 -0
  91. metadata +244 -0
@@ -0,0 +1,41 @@
1
+ # Copyright (C) 2007-2010 Logintas AG Switzerland
2
+ #
3
+ # This file is part of Libisi.
4
+ #
5
+ # Libisi is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Libisi is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Libisi. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ # object:
19
+ # Object to work on
20
+ # * a Class: For class methods
21
+ # * a Object: For instance methods
22
+ # * a Hash of Attributes: For pseudo instance functions
23
+ # * nil: For normal functions without context (default)
24
+ #
25
+ # arguments:
26
+ # Array of arguments (ARGV?)
27
+ # default: []
28
+ #
29
+ # parameters:
30
+ # Hash of options
31
+ # default: {}
32
+ class BaseParameter
33
+
34
+ attr_accessor :object, :arguments, :options
35
+ def initialize
36
+ @object = nil
37
+ @arguments = []
38
+ @options = {}
39
+ end
40
+
41
+ end
@@ -0,0 +1,27 @@
1
+ # Copyright (C) 2007-2010 Logintas AG Switzerland
2
+ #
3
+ # This file is part of Libisi.
4
+ #
5
+ # Libisi is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Libisi is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Libisi. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require "libisi/base.rb"
19
+ require "libisi/concept/base.rb"
20
+ require "libisi/property/base.rb"
21
+ class Property < Base
22
+
23
+ def self.create(concept, val, options = {})
24
+ BaseProperty.new(concept, val)
25
+ end
26
+
27
+ end
@@ -0,0 +1,28 @@
1
+ # Copyright (C) 2007-2010 Logintas AG Switzerland
2
+ #
3
+ # This file is part of Libisi.
4
+ #
5
+ # Libisi is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Libisi is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Libisi. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ class BaseProperty
19
+
20
+ attr_reader :base_class, :name
21
+
22
+ def initialize(base_class, name, options = {})
23
+ @base_class = base_class
24
+ @name = name
25
+ end
26
+
27
+
28
+ end
@@ -0,0 +1,31 @@
1
+ # Copyright (C) 2007-2010 Logintas AG Switzerland
2
+ #
3
+ # This file is part of Libisi.
4
+ #
5
+ # Libisi is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Libisi is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Libisi. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ class BaseReciever
19
+
20
+ attr_accessor :create_block
21
+
22
+ def initialize(recieving_concept, options = {}, &block)
23
+ raise "No create block given" unless block
24
+ @create_block = block
25
+ end
26
+
27
+ def get
28
+ @create_block.call(self.get_io)
29
+ end
30
+
31
+ end
@@ -0,0 +1,31 @@
1
+ # Copyright (C) 2007-2010 Logintas AG Switzerland
2
+ #
3
+ # This file is part of Libisi.
4
+ #
5
+ # Libisi is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Libisi is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Libisi. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require "libisi/reciever/base"
19
+ require "socket"
20
+ class SocketReciever < BaseReciever
21
+
22
+ def initialize(port, options = {}, &block)
23
+ super
24
+ @server = TCPServer.new(port)
25
+ end
26
+
27
+ def get_io
28
+ @server.accept
29
+ end
30
+
31
+ end
@@ -0,0 +1,23 @@
1
+ # Copyright (C) 2007-2010 Logintas AG Switzerland
2
+ #
3
+ # This file is part of Libisi.
4
+ #
5
+ # Libisi is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Libisi is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Libisi. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require "libisi/base.rb"
19
+ require "libisi/concept/base.rb"
20
+ class Relation < Base
21
+
22
+
23
+ end
@@ -0,0 +1,22 @@
1
+ # Copyright (C) 2007-2010 Logintas AG Switzerland
2
+ #
3
+ # This file is part of Libisi.
4
+ #
5
+ # Libisi is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Libisi is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Libisi. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require "libisi/base.rb"
19
+
20
+ class Request < Base
21
+
22
+ end
@@ -0,0 +1,29 @@
1
+ # Copyright (C) 2007-2010 Logintas AG Switzerland
2
+ #
3
+ # This file is part of Libisi.
4
+ #
5
+ # Libisi is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Libisi is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Libisi. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ class BaseRequest
19
+
20
+ attr_accessor :environment, :task
21
+
22
+ def initialize(env, task, options = {})
23
+ @environment = env
24
+ @task = task
25
+ end
26
+
27
+ def execute; environment.execute(task); end
28
+
29
+ end
@@ -0,0 +1,129 @@
1
+ # Copyright (C) 2007-2010 Logintas AG Switzerland
2
+ #
3
+ # This file is part of Libisi.
4
+ #
5
+ # Libisi is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Libisi is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Libisi. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require "libisi/request/base"
19
+ require "libisi/environment/http"
20
+ require "libisi/function/base"
21
+ require "libisi/task/base"
22
+ require "libisi/parameter/base"
23
+ require "uri"
24
+ require "cgi"
25
+
26
+ class HttpRequest < BaseRequest
27
+
28
+
29
+ # Splits a ordinary http url into
30
+ # * HttpEnvironment
31
+ # * Task(Function and Parameters)
32
+ def HttpRequest.from_uri(uri, options = {})
33
+ raise "Unexpected uri provided #{uri.parse}" unless uri.class == URI::HTTP
34
+ options = {
35
+ :root => URI::HTTP.build(:scheme => uri.scheme,
36
+ :userinfo => uri.userinfo,
37
+ :host => uri.host,
38
+ :port => uri.port,
39
+ :path => "/")
40
+ }.merge(options)
41
+
42
+ unless uri.to_s.starts_with?(options[:root].to_s)
43
+ raise "URI #{uri.to_s} does not start with root #{options[:root].to_s}"
44
+ end
45
+
46
+ # take the rest of the path as context, function name and arguments
47
+ path_rest = uri.path[options[:root].path.length..-1]
48
+
49
+ # environment
50
+ env = HttpEnvironment.new(options[:root])
51
+
52
+ # task
53
+ task = HttpTask.from_path_with_parameters(path_rest + "?" + uri.query)
54
+
55
+ HttpRequest.new(env, task)
56
+ end
57
+
58
+ end
59
+ =begin
60
+ #!/usr/bin/ruby
61
+
62
+ # hello.pl -- my first perl script!
63
+
64
+
65
+ cgi = CGI.new('html4')
66
+
67
+ page = nil
68
+ page = $1 if cgi["old_link"] =~ /([^\/]+\.cgi)/
69
+
70
+ NEW_ROOT = "https://todo.kapozh.imsec.ch/kapozilla/"
71
+ unless page
72
+ uri = NEW_ROOT
73
+ else
74
+ uri = URI.parse("#{NEW_ROOT}#{page}")
75
+
76
+ ps = cgi.params.map {|name, vals|
77
+ next if name == "old_link"
78
+ vals.map {|val| "#{name}=#{CGI.escape(val)}"}
79
+ }.compact.flatten.join("&")
80
+ uri = uri.to_s + "?" + ps
81
+ end
82
+
83
+ uri = uri.to_s
84
+
85
+ # Ask the cgi object to send some text out to the browser.
86
+ cgi.out {
87
+ cgi.html {
88
+ cgi.body {
89
+ cgi.h1 { 'KapoZilla ist umgezogen' } +
90
+ cgi.p { 'Die von Ihnen gew&auml;hlte URL ist nicht mehr g&uuml;ltig. Sie zeigt auf eine fr&uuml;here Instanz von KapoZilla.'} +
91
+ cgi.p {
92
+ if page
93
+ 'Der neue, richtige Link lautet: ' +
94
+ cgi.a(uri) { uri }
95
+ else
96
+ 'Die neue Instanz befindet sich hier: ' + cgi.a(uri) {uri}
97
+ end +
98
+ '<br><br>Bitte passen Sie Ihre URL entsprechend an.'
99
+ }
100
+ }
101
+ }
102
+ }
103
+
104
+ exit 0
105
+
106
+ print "Content-type: text/html\n\n"
107
+
108
+ print <<EOF
109
+ <HTML>
110
+ <HEAD>
111
+ <TITLE>KapoZilla Moved</TITLE>
112
+ </HEAD>
113
+
114
+ <BODY>
115
+ <H1>KapoZilla ist umgezogen</H1>
116
+
117
+ <P>
118
+ Die von Ihnen gew&auml;hlte URL ist nicht mehr g&uuml;ltig. Sie zeigt auf eine f&uuml;hrere
119
+ Instaz von KapoZilla.
120
+
121
+ Der neue, richtige Link ist<br>
122
+ #{URI.parse(ARGV[0]).inspect}<br>
123
+ Bitte passen Sie Ihre URL entsprechend an.
124
+ </P>
125
+
126
+ </BODY>
127
+ </HTML>
128
+ EOF
129
+ =end
@@ -0,0 +1,27 @@
1
+ # Copyright (C) 2007-2010 Logintas AG Switzerland
2
+ #
3
+ # This file is part of Libisi.
4
+ #
5
+ # Libisi is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Libisi is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Libisi. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ class BaseResponse
19
+
20
+ attr_accessor :task, :request
21
+
22
+ def initialize(task, request, options = {})
23
+ @task = task
24
+ @request = request
25
+ end
26
+
27
+ end
@@ -0,0 +1,27 @@
1
+ # Copyright (C) 2007-2010 Logintas AG Switzerland
2
+ #
3
+ # This file is part of Libisi.
4
+ #
5
+ # Libisi is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Libisi is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Libisi. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ class BaseTask
19
+
20
+ attr_accessor :function, :parameter
21
+
22
+ def initialize(function, parameter)
23
+ @function = function
24
+ @parameter = parameter
25
+ end
26
+
27
+ end
@@ -0,0 +1,90 @@
1
+ # Copyright (C) 2007-2010 Logintas AG Switzerland
2
+ #
3
+ # This file is part of Libisi.
4
+ #
5
+ # Libisi is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Libisi is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Libisi. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require "libisi/task/base"
19
+ require "libisi/function/base"
20
+ require "libisi/parameter/base"
21
+ require "cgi"
22
+ class HttpTask < BaseTask
23
+
24
+ # Splits the rest of the uri path into context,
25
+ # function name and arguments.
26
+ #
27
+ # First regular expression match as context
28
+ # Second regular expression match as function name
29
+ # the rest of the matches as arguments
30
+ DEFAULT_CONTEXT_NAME_ARG_REGEXP =
31
+ /^\/?([^\/]+)\/([^\/]+)\/(.+)$/
32
+
33
+ def HttpTask.from_path(path, options = {})
34
+ unless path =~ DEFAULT_CONTEXT_NAME_ARG_REGEXP
35
+ raise "context name arg regular expression did not match #{path.inspect}"
36
+ end
37
+ context = $1
38
+ function_name = $2
39
+ arguments = $3.split("/")
40
+
41
+ # function
42
+ func = BaseFunction.new(context, function_name)
43
+
44
+ # parameter
45
+ params = BaseParameter.new
46
+ params.arguments = arguments
47
+
48
+ HttpTask.new(func, params)
49
+ end
50
+
51
+ def HttpTask.from_path_with_parameters(full_path, options = {})
52
+ path, query = full_path.split("?",2)
53
+ task = HttpTask.from_path(path, options)
54
+ if query
55
+ n_opts = {}
56
+ CGI::parse(query).each {|key,val|
57
+ n_opts[key.to_sym] = val
58
+ }
59
+ task.parameter.options = task.parameter.options.merge(n_opts)
60
+ end
61
+
62
+ task
63
+ end
64
+
65
+ def HttpTask.from_browser(io, options = {})
66
+ p "gets"
67
+ request_line = io.gets
68
+ p "request_line: #{request_line}"
69
+ # base from webrick/httprequest.rb read_request_line(socket)
70
+ if /^(\S+)\s+(\S+)(?:\s+HTTP\/(\d+\.\d+))?\r?\n/mo =~ request_line
71
+ request_method = $1
72
+ unparsed_uri = $2
73
+ http_version = ($3 ? $3 : "0.9")
74
+
75
+ request = HttpTask.from_path_with_parameters(unparsed_uri)
76
+ request.parameter.options[:http_version] = http_version
77
+ request.parameter.options[:request_method] = $1
78
+ request.parameter.options[:input_stream] = io
79
+ request.parameter.options[:output_stream] = io
80
+ request
81
+
82
+ # TODO: read parameters
83
+ else
84
+ rl = request_line.sub(/\x0d?\x0a\z/o, '')
85
+ raise "Bad request #{rl.inspect}"
86
+ end
87
+ end
88
+
89
+
90
+ end