rsence 2.0.0.6.pre → 2.0.0.7.pre
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/INSTALL.rdoc +39 -25
- data/VERSION +1 -1
- data/conf/default_conf.yaml +0 -3
- data/lib/conf/default.rb +59 -60
- data/lib/daemon/daemon.rb +269 -280
- data/lib/http/broker.rb +47 -14
- data/lib/http/rackup.rb +4 -0
- data/lib/http/request.rb +47 -49
- data/lib/http/response.rb +47 -45
- data/lib/plugins/gui_plugin.rb +22 -21
- data/lib/plugins/guiparser.rb +95 -94
- data/lib/plugins/plugin.rb +300 -295
- data/lib/plugins/plugin_plugins.rb +64 -40
- data/lib/plugins/plugin_sqlite_db.rb +63 -63
- data/lib/plugins/plugin_util.rb +95 -104
- data/lib/plugins/pluginmanager.rb +373 -414
- data/lib/plugins/plugins.rb +11 -4
- data/lib/plugins/servlet.rb +10 -9
- data/lib/session/msg.rb +249 -248
- data/lib/session/sessionmanager.rb +364 -373
- data/lib/session/sessionstorage.rb +265 -272
- data/lib/transporter/transporter.rb +164 -169
- data/lib/util/gzstring.rb +2 -0
- data/lib/values/hvalue.rb +224 -224
- data/lib/values/valuemanager.rb +98 -98
- data/plugins/index_html/index_html.rb +1 -32
- metadata +4 -4
data/lib/plugins/plugins.rb
CHANGED
@@ -23,8 +23,9 @@ require 'plugins/plugin_plugins'
|
|
23
23
|
module ::RSence
|
24
24
|
module Plugins
|
25
25
|
|
26
|
-
# plugin.rb contains the Plugin skeleton class
|
27
26
|
require 'plugins/plugin'
|
27
|
+
|
28
|
+
# The PluginMaker mimic class creates the Plugin class from PluginTemplate
|
28
29
|
def self.PluginMaker
|
29
30
|
lambda do |ns|
|
30
31
|
klass = Class.new( PluginTemplate ) do
|
@@ -39,9 +40,9 @@ module ::RSence
|
|
39
40
|
end
|
40
41
|
end
|
41
42
|
|
42
|
-
# gui_plugin.rb is an extension of Plugin that uses
|
43
|
-
# GUIParser to init the gui automatically.
|
44
43
|
require 'plugins/gui_plugin'
|
44
|
+
|
45
|
+
# The GUIPluginMaker mimic class creates the GUIPlugin class from GUIPluginTemplate
|
45
46
|
def self.GUIPluginMaker
|
46
47
|
lambda do |ns|
|
47
48
|
klass = Class.new( GUIPluginTemplate ) do
|
@@ -56,8 +57,9 @@ module ::RSence
|
|
56
57
|
end
|
57
58
|
end
|
58
59
|
|
59
|
-
# servlet includes the Servlet class, for handling any requests / responses
|
60
60
|
require 'plugins/servlet'
|
61
|
+
|
62
|
+
# The ServletMaker mimic class creates the Servlet class from ServletTemplate
|
61
63
|
def self.ServletMaker
|
62
64
|
lambda do |ns|
|
63
65
|
klass = Class.new( ServletTemplate ) do
|
@@ -72,6 +74,11 @@ module ::RSence
|
|
72
74
|
end
|
73
75
|
end
|
74
76
|
|
77
|
+
# Loads bundle according to the +params+ hash.
|
78
|
+
# Some essential params:
|
79
|
+
# :src_path => '/path/of/the_plugin/the_plugin.rb'
|
80
|
+
# :bundle_path => '/path/of/the_plugin'
|
81
|
+
# :bundle_name => :the_plugin
|
75
82
|
def self.bundle_loader( params )
|
76
83
|
src_path = params[:src_path]
|
77
84
|
begin
|
data/lib/plugins/servlet.rb
CHANGED
@@ -6,15 +6,16 @@
|
|
6
6
|
# with this software package. If not, contact licensing@riassence.com
|
7
7
|
##
|
8
8
|
|
9
|
-
## Register the Servlet with a regular expression that
|
10
|
-
## should match its uri. Alternatively just a string, but
|
11
|
-
## that needs to be an exact match.
|
12
9
|
module ::RSence
|
13
10
|
module Plugins
|
11
|
+
|
12
|
+
## Use the Servlet class to create responders for urls and methods.
|
14
13
|
class ServletTemplate
|
14
|
+
|
15
15
|
include PluginUtil
|
16
|
+
|
16
17
|
def self.bundle_type; :Servlet; end
|
17
|
-
|
18
|
+
|
18
19
|
def initialize( bundle_name, bundle_info, bundle_path, plugin_manager )
|
19
20
|
@info = bundle_info
|
20
21
|
@name = bundle_name
|
@@ -24,8 +25,8 @@ module ::RSence
|
|
24
25
|
@inited = false
|
25
26
|
end
|
26
27
|
|
27
|
-
# Servlet ID
|
28
28
|
attr_reader :name, :path, :info, :inited
|
29
|
+
|
29
30
|
def register # :nodoc
|
30
31
|
@plugins.register_bundle( self, @name )
|
31
32
|
@inited = true
|
@@ -44,15 +45,15 @@ module ::RSence
|
|
44
45
|
def score
|
45
46
|
return 100
|
46
47
|
end
|
47
|
-
|
48
|
+
|
48
49
|
# Extend to do any GET request processing. Not doing anything by default.
|
49
50
|
def get( req, res, ses )
|
50
|
-
|
51
|
+
|
51
52
|
end
|
52
|
-
|
53
|
+
|
53
54
|
# Extend to do any POST request processing. Not doing anything by default.
|
54
55
|
def post( req, res, ses )
|
55
|
-
|
56
|
+
|
56
57
|
end
|
57
58
|
end
|
58
59
|
end
|
data/lib/session/msg.rb
CHANGED
@@ -7,285 +7,286 @@
|
|
7
7
|
##
|
8
8
|
|
9
9
|
module RSence
|
10
|
-
require 'util/gzstring'
|
10
|
+
require 'util/gzstring'
|
11
11
|
|
12
|
-
## Due to the single instance architecture of +Plugin+, instances of Message
|
13
|
-
## class are used for communication between sessions and +Plugin+ instance.
|
14
|
-
## The +Message+ instance contains session and request-response related
|
15
|
-
## mappings and utility methods.
|
16
|
-
##
|
17
|
-
## The Message object is initialized as 'msg' in SessionManager.
|
18
|
-
## It's passed around the system as the user/session -object namespace,
|
19
|
-
## much like 'self' is passed around in python methods.
|
20
|
-
##
|
21
|
-
## Using the msg object saves considerate amounts of CPU cycles and memory,
|
22
|
-
## because it allows single instances of any classes that handle user data.
|
23
|
-
##
|
24
|
-
## == HValue Initialization Example
|
25
|
-
## +HValue+ is closely related to +Message+ as instances of +HValue+ are
|
26
|
-
## used to send data between sessions and the server. This is a small
|
27
|
-
## code snippet about how to initialize several HValues as the session
|
28
|
-
## is initialized.
|
29
|
-
##
|
30
|
-
## def init_ses( msg )
|
31
|
-
## msg.session[:session_name] = {
|
32
|
-
## :hvalue1 => HValue.new( msg, @firstvalue ),
|
33
|
-
## :hvalue2 => HValue.new( msg, @secondvalue ),
|
34
|
-
## :hvalue3 => HValue.new( msg, @thirdvalue )
|
35
|
-
## }
|
36
|
-
## end
|
37
|
-
##
|
38
|
-
|
39
|
-
class Message
|
40
|
-
|
41
|
-
# Session data placeholder, assigned by SessionManager.
|
42
|
-
attr_accessor :session
|
43
|
-
|
44
|
-
# New session flag, check it in your code to decide
|
45
|
-
# what to do, when a new session is encountered.
|
46
|
-
# In plugins, this usually means that some Values
|
47
|
-
# need to be created and bound or possibly that a
|
48
|
-
# user_id mapping needs to be done.
|
49
|
-
attr_accessor :new_session
|
50
|
-
|
51
|
-
# Old session first xhr flag, check it in your code
|
52
|
-
# to decide what to do, when a restored session is
|
53
|
-
# encountered. The old Values are automatically present,
|
54
|
-
# so you should at least not re-create or re-bind them.
|
55
|
-
attr_accessor :restored_session
|
56
|
-
|
57
|
-
# Contains the source ses on the first request after this
|
58
|
-
# session was cloned from another session.
|
59
|
-
attr_accessor :cloned_source
|
60
|
-
|
61
|
-
# Contains the target sessions packed in an array on
|
62
|
-
# the first request after another session was cloned
|
63
|
-
# from this session.
|
64
|
-
attr_accessor :cloned_targets
|
65
|
-
|
66
|
-
# The session is not valid by default, it's set
|
67
|
-
# by SessionManager, if everything seems ok.
|
68
|
-
attr_accessor :ses_valid
|
69
|
-
|
70
|
-
# The http request object.
|
71
|
-
attr_accessor :request
|
72
|
-
|
73
|
-
# The http response object.
|
74
|
-
attr_accessor :response
|
75
|
-
|
76
|
-
# Response output.
|
77
|
-
attr_accessor :buffer
|
78
|
-
|
79
|
-
attr_accessor :value_buffer
|
80
|
-
|
81
|
-
# The request success flag.
|
82
|
-
attr_accessor :response_success
|
83
|
-
|
84
|
-
# Reference to Transporter
|
85
|
-
attr_accessor :transporter
|
86
|
-
|
87
|
-
# Reference to ValueManager
|
88
|
-
attr_accessor :valuemanager
|
89
|
-
|
90
|
-
# Reference to SessionManager
|
91
|
-
attr_accessor :sessions
|
92
|
-
|
93
|
-
# Reference to PluginManager
|
94
|
-
attr_accessor :plugins
|
95
|
-
|
96
|
-
# Message is initialized with a valid +Request+ and +Response+ objects.
|
97
|
-
def initialize( transporter, request, response, options )
|
12
|
+
## Due to the single instance architecture of +Plugin+, instances of Message
|
13
|
+
## class are used for communication between sessions and +Plugin+ instance.
|
14
|
+
## The +Message+ instance contains session and request-response related
|
15
|
+
## mappings and utility methods.
|
16
|
+
##
|
17
|
+
## The Message object is initialized as 'msg' in SessionManager.
|
18
|
+
## It's passed around the system as the user/session -object namespace,
|
19
|
+
## much like 'self' is passed around in python methods.
|
20
|
+
##
|
21
|
+
## Using the msg object saves considerate amounts of CPU cycles and memory,
|
22
|
+
## because it allows single instances of any classes that handle user data.
|
23
|
+
##
|
24
|
+
## == HValue Initialization Example
|
25
|
+
## +HValue+ is closely related to +Message+ as instances of +HValue+ are
|
26
|
+
## used to send data between sessions and the server. This is a small
|
27
|
+
## code snippet about how to initialize several HValues as the session
|
28
|
+
## is initialized.
|
29
|
+
##
|
30
|
+
## def init_ses( msg )
|
31
|
+
## msg.session[:session_name] = {
|
32
|
+
## :hvalue1 => HValue.new( msg, @firstvalue ),
|
33
|
+
## :hvalue2 => HValue.new( msg, @secondvalue ),
|
34
|
+
## :hvalue3 => HValue.new( msg, @thirdvalue )
|
35
|
+
## }
|
36
|
+
## end
|
37
|
+
##
|
38
|
+
class Message
|
98
39
|
|
99
|
-
|
40
|
+
# Session data placeholder, assigned by SessionManager.
|
41
|
+
attr_accessor :session
|
100
42
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
43
|
+
# New session flag, check it in your code to decide
|
44
|
+
# what to do, when a new session is encountered.
|
45
|
+
# In plugins, this usually means that some Values
|
46
|
+
# need to be created and bound or possibly that a
|
47
|
+
# user_id mapping needs to be done.
|
48
|
+
attr_accessor :new_session
|
106
49
|
|
107
|
-
|
50
|
+
# Old session first xhr flag, check it in your code
|
51
|
+
# to decide what to do, when a restored session is
|
52
|
+
# encountered. The old Values are automatically present,
|
53
|
+
# so you should at least not re-create or re-bind them.
|
54
|
+
attr_accessor :restored_session
|
108
55
|
|
109
|
-
#
|
110
|
-
|
56
|
+
# Contains the source ses on the first request after this
|
57
|
+
# session was cloned from another session.
|
58
|
+
attr_accessor :cloned_source
|
111
59
|
|
112
|
-
#
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
@cloned_source = false
|
117
|
-
@cloned_targets = false
|
118
|
-
@ses_valid = false
|
119
|
-
@error_js = ''
|
60
|
+
# Contains the target sessions packed in an array on
|
61
|
+
# the first request after another session was cloned
|
62
|
+
# from this session.
|
63
|
+
attr_accessor :cloned_targets
|
120
64
|
|
121
|
-
#
|
122
|
-
|
123
|
-
|
124
|
-
@sessions = @transporter.sessions
|
125
|
-
@plugins = @transporter.plugins
|
65
|
+
# The session is not valid by default, it's set
|
66
|
+
# by SessionManager, if everything seems ok.
|
67
|
+
attr_accessor :ses_valid
|
126
68
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
69
|
+
# The http request object.
|
70
|
+
attr_accessor :request
|
71
|
+
|
72
|
+
# The http response object.
|
73
|
+
attr_accessor :response
|
74
|
+
|
75
|
+
# Response output.
|
76
|
+
attr_accessor :buffer
|
77
|
+
|
78
|
+
attr_accessor :value_buffer
|
79
|
+
|
80
|
+
# The request success flag.
|
81
|
+
attr_accessor :response_success
|
82
|
+
|
83
|
+
# Reference to Transporter
|
84
|
+
attr_accessor :transporter
|
85
|
+
|
86
|
+
# Reference to ValueManager
|
87
|
+
attr_accessor :valuemanager
|
88
|
+
|
89
|
+
# Reference to SessionManager
|
90
|
+
attr_accessor :sessions
|
91
|
+
|
92
|
+
# Reference to PluginManager
|
93
|
+
attr_accessor :plugins
|
94
|
+
|
95
|
+
# Message is initialized with a valid +Request+ and +Response+ objects.
|
96
|
+
def initialize( transporter, request, response, options )
|
97
|
+
|
98
|
+
@config = ::RSence.config
|
99
|
+
|
100
|
+
@request = request
|
101
|
+
@response_success = false
|
102
|
+
@response = response
|
103
|
+
@session = nil
|
104
|
+
@buffer = []
|
105
|
+
|
106
|
+
@options = options
|
107
|
+
|
108
|
+
# Value response output.
|
109
|
+
@value_buffer = []
|
110
|
+
|
111
|
+
# The session key placeholder.
|
112
|
+
@ses_key = false
|
113
|
+
@new_session = false
|
114
|
+
@restored_session = false
|
115
|
+
@cloned_source = false
|
116
|
+
@cloned_targets = false
|
117
|
+
@ses_valid = false
|
118
|
+
@error_js = ''
|
119
|
+
|
120
|
+
# global instances
|
121
|
+
@transporter = transporter
|
122
|
+
@valuemanager = @transporter.valuemanager
|
123
|
+
@sessions = @transporter.sessions
|
124
|
+
@plugins = @transporter.plugins
|
125
|
+
|
126
|
+
if options[:servlet]
|
138
127
|
@do_gzip = false
|
128
|
+
else
|
129
|
+
@response.content_type = 'text/javascript; charset=utf-8'
|
130
|
+
@response['cache-control'] = 'no-cache'
|
131
|
+
|
132
|
+
# gnu-zipped responses:
|
133
|
+
if @request.header['accept-encoding'] and @request.header['accept-encoding'].include?('gzip') and not @config[:no_gzip]
|
134
|
+
@response['content-encoding'] = 'gzip'
|
135
|
+
@do_gzip = true
|
136
|
+
else
|
137
|
+
@do_gzip = false
|
138
|
+
end
|
139
139
|
end
|
140
|
-
end
|
141
140
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
# Returns true for Internet Explorer 6.0
|
146
|
-
def ie6;
|
147
|
-
(request.header.has_key?('user-agent') and request.header['user-agent'].include?('MSIE 6.0'))
|
148
|
-
end
|
149
|
-
|
150
|
-
# Expire the session.
|
151
|
-
def expire_session
|
152
|
-
@sessions.expire_session( @ses_id )
|
153
|
-
end
|
154
|
-
|
155
|
-
# Define the session key.
|
156
|
-
def ses_key=(ses_key)
|
157
|
-
@ses_key = ses_key
|
158
|
-
end
|
159
|
-
|
160
|
-
# Getter for session key.
|
161
|
-
def ses_key
|
162
|
-
@ses_key
|
163
|
-
end
|
141
|
+
@response_sent = false
|
142
|
+
end
|
164
143
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
144
|
+
# Returns true for Internet Explorer 6.0
|
145
|
+
def ie6;
|
146
|
+
(request.header.has_key?('user-agent') and request.header['user-agent'].include?('MSIE 6.0'))
|
147
|
+
end
|
169
148
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
149
|
+
# Expire the session.
|
150
|
+
def expire_session
|
151
|
+
@sessions.expire_session( @ses_id )
|
152
|
+
end
|
174
153
|
|
175
|
-
|
176
|
-
|
177
|
-
|
154
|
+
# Define the session key.
|
155
|
+
def ses_key=(ses_key)
|
156
|
+
@ses_key = ses_key
|
157
|
+
end
|
178
158
|
|
179
|
-
|
180
|
-
|
181
|
-
|
159
|
+
# Getter for session key.
|
160
|
+
def ses_key
|
161
|
+
@ses_key
|
162
|
+
end
|
182
163
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
164
|
+
# Returns the user id
|
165
|
+
def user_id
|
166
|
+
@session[:user_id]
|
167
|
+
end
|
187
168
|
|
188
|
-
|
189
|
-
|
190
|
-
|
169
|
+
# Setter for the user id
|
170
|
+
def user_id=(user_id)
|
171
|
+
@session[:user_id] = user_id
|
172
|
+
end
|
173
|
+
|
174
|
+
# Returns the session id
|
175
|
+
def ses_id
|
176
|
+
@session[:ses_id]
|
177
|
+
end
|
178
|
+
|
179
|
+
# Sets the session id
|
180
|
+
def ses_id=(ses_id)
|
181
|
+
@session[:ses_id] = ses_id
|
182
|
+
end
|
183
|
+
|
184
|
+
# Sets the error message
|
185
|
+
def error_msg( error_js )
|
186
|
+
@error_js = error_js
|
187
|
+
# response_done
|
188
|
+
end
|
189
|
+
|
190
|
+
# Converts the buffer to JSON
|
191
|
+
def buf_json(buffer)
|
192
|
+
buffer.to_json
|
193
|
+
end
|
191
194
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
195
|
+
# Called to flush buffer.
|
196
|
+
def response_done
|
197
|
+
return if @response_sent
|
198
|
+
if not @response_success
|
199
|
+
@response.status = 200
|
200
|
+
#@response.status = 503
|
201
|
+
|
202
|
+
buffer = [
|
203
|
+
"" # empty session key will stop the syncing
|
204
|
+
] + @error_js
|
205
|
+
else
|
206
|
+
## The response status should always be 200 (OK)
|
207
|
+
@response.status = 200
|
198
208
|
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
## The response status should always be 200 (OK)
|
204
|
-
@response.status = 200
|
209
|
+
buffer = @value_buffer + @buffer
|
210
|
+
if @ses_key
|
211
|
+
buffer.unshift( @ses_key )
|
212
|
+
end
|
205
213
|
|
206
|
-
buffer = @value_buffer + @buffer
|
207
|
-
if @ses_key
|
208
|
-
buffer.unshift( @ses_key )
|
209
214
|
end
|
210
|
-
|
211
|
-
end
|
212
215
|
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
216
|
+
# flush the output
|
217
|
+
if @do_gzip
|
218
|
+
outp = GZString.new('')
|
219
|
+
gzwriter = Zlib::GzipWriter.new(outp,Zlib::BEST_SPEED)
|
220
|
+
gzwriter.write( buf_json(buffer) )
|
221
|
+
gzwriter.close
|
222
|
+
else
|
223
|
+
outp = buf_json(buffer)
|
224
|
+
end
|
222
225
|
|
223
|
-
|
224
|
-
|
226
|
+
@response['content-length'] = outp.size
|
227
|
+
@response.body = outp
|
225
228
|
|
226
|
-
|
227
|
-
|
229
|
+
@response_sent = true
|
230
|
+
end
|
228
231
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
232
|
+
# Sends data to the client, usually
|
233
|
+
# javascript, but is valid for any data.
|
234
|
+
def reply(data,dont_squeeze=false)
|
235
|
+
data.strip!
|
236
|
+
data = @plugins[:client_pkg].squeeze( data ) unless dont_squeeze
|
237
|
+
puts data if @config[:trace]
|
238
|
+
@buffer.push( data )
|
239
|
+
end
|
237
240
|
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
241
|
+
# For value manager; insert changed values BEFORE other js.
|
242
|
+
def reply_value(data)
|
243
|
+
puts data if @config[:trace]
|
244
|
+
@value_buffer.push( data )
|
245
|
+
end
|
243
246
|
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
247
|
+
# Sends data to the client's console.
|
248
|
+
def console(data)
|
249
|
+
reply( "console.log(#{data.to_json});" )
|
250
|
+
end
|
248
251
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
252
|
+
# Serves an image object +img_obj+ by returning its disposable URL. The
|
253
|
+
# second optional parameter +img_format+ defaults to 'PNG' and defines
|
254
|
+
# the format of served picture.
|
255
|
+
def serve_img( img_obj, img_format='PNG' )
|
256
|
+
call(:ticket,:serve_img, self, img_obj, img_format )
|
257
|
+
end
|
255
258
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
259
|
+
# Sends any binary to be served, returns a disposable uri. First parameter
|
260
|
+
# defines the file data, second optional defines content type and defaults
|
261
|
+
# to 'text/plain' and third, also optional defines the filename which
|
262
|
+
# defaults to 'untitled.txt'.
|
263
|
+
def serve_file( file_data, content_type='text/plain', filename='untitled.txt' )
|
264
|
+
call(:ticket,:serve_file, self, file_data, content_type, filename )
|
265
|
+
end
|
263
266
|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
267
|
+
# Sends any binary to be served, returns a static uri.
|
268
|
+
#
|
269
|
+
# IMPORTANT: PLEASE call +release_rsrc+ manually, when you
|
270
|
+
# don't need the resource anymore! Otherwise TicketServe will
|
271
|
+
# keep on chugging more memory every time you serve something.
|
272
|
+
#
|
273
|
+
# HINT: Usually, it's a better idea to use serve_img or
|
274
|
+
# serve_file instead.
|
275
|
+
def serve_rsrc( rsrc_data, content_type='text/plain' )
|
276
|
+
call(:ticket,:serve_rsrc,self, rsrc_data, content_type )
|
277
|
+
end
|
275
278
|
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
279
|
+
# Removes the uri served, you HAVE TO call this manually when
|
280
|
+
# you are done serving something! Takes the uri as its only parameter.
|
281
|
+
def release_rsrc( uri )
|
282
|
+
run(:ticket,:del_rsrc, uri[3..-1] )
|
283
|
+
end
|
284
|
+
alias unserve_rsrc release_rsrc
|
282
285
|
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
+
# Calls registered plugin +plugin+ method +plugin_method+ with any +args+
|
287
|
+
def call( plugin_name, plug_method, *args )
|
288
|
+
@plugins.call( plugin_name, plug_method, *args)
|
289
|
+
end
|
290
|
+
alias run call
|
286
291
|
end
|
287
|
-
alias run call
|
288
|
-
|
289
|
-
end
|
290
|
-
|
291
292
|
end
|