rsence-pre 2.1.0.21 → 2.1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/INSTALL.rdoc +61 -46
- data/README.rdoc +17 -1
- data/VERSION +1 -1
- data/conf/rsence_command_strings.yaml +16 -16
- data/js/comm/sessionwatcher/sessionwatcher.js +5 -4
- data/js/comm/transporter/transporter.js +62 -4
- data/js/comm/values/values.js +62 -0
- data/js/controls/button/themes/default/button.css +7 -7
- data/js/controls/imageview/imageview.js +15 -6
- data/js/controls/stringview/stringview.js +16 -2
- data/js/controls/textcontrol/textcontrol.js +56 -3
- data/js/core/elem/elem.js +38 -12
- data/js/datetime/timesheet/timesheet.js +141 -32
- data/js/datetime/timesheet_item/timesheet_item.js +82 -22
- data/js/foundation/application/application.js +10 -4
- data/js/foundation/control/control.js +5 -3
- data/js/foundation/control/dyncontrol/dyncontrol.js +17 -3
- data/js/foundation/control/eventresponder/eventresponder.js +31 -2
- data/js/foundation/eventmanager/eventmanager.js +202 -74
- data/js/foundation/json_renderer/json_renderer.js +5 -2
- data/js/foundation/system/system.js +13 -11
- data/js/foundation/view/morphanimation/morphanimation.js +9 -5
- data/js/foundation/view/view.js +22 -10
- data/js/lists/propertylist/propertylist.js +5 -0
- data/js/menus/minimenu/minimenu.js +3 -8
- data/lib/conf/default.rb +0 -3
- data/lib/http/broker.rb +6 -5
- data/lib/http/rackup.rb +3 -3
- data/lib/http/response.rb +28 -2
- data/lib/session/msg.rb +30 -18
- data/lib/transporter/transporter.rb +4 -0
- data/lib/values/hvalue.rb +4 -134
- data/lib/values/valuemanager.rb +36 -22
- data/plugins/client_pkg/lib/client_pkg_serve.rb +195 -152
- data/plugins/main/main.rb +8 -10
- data/plugins/ticket/lib/common.rb +4 -4
- data/plugins/ticket/lib/favicon.rb +1 -1
- data/plugins/ticket/lib/rsrc.rb +1 -1
- data/plugins/ticket/lib/upload.rb +2 -2
- data/plugins/ticket/ticket.rb +3 -3
- data/setup/welcome/gui/welcome.yaml +1 -1
- metadata +10 -11
- data/lib/util/ruby19_fixes.rb +0 -18
@@ -21,195 +21,238 @@ module ClientPkgServe
|
|
21
21
|
return time.gmtime.strftime('%a, %d %b %Y %H:%M:%S %Z')
|
22
22
|
end
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
def build_busy_wait
|
25
|
+
while @build_busy
|
26
|
+
puts "-- build not finished, waiting.. --"
|
27
|
+
sleep 0.1
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def set_headers( response )
|
27
32
|
# Sets the response date header to the current time:
|
28
33
|
response['Date'] = httime( Time.now )
|
29
34
|
|
30
35
|
# Controls caching with headers based on the configuration
|
31
36
|
if ::RSence.config[:cache_maximize]
|
32
37
|
response['Expires'] = httime(Time.now+::RSence.config[:cache_expire])
|
33
|
-
|
34
38
|
else
|
35
39
|
response['Cache-Control'] = 'no-cache'
|
36
40
|
end
|
37
|
-
|
38
|
-
|
41
|
+
end
|
42
|
+
|
43
|
+
def check_ua( request )
|
44
|
+
support_gzip = (request.header.has_key?('Accept-Encoding') and request.header['Accept-Encoding'].include?('gzip'))
|
39
45
|
support_gzip = false if ::RSence.config[:no_gzip]
|
40
|
-
if request.header.has_key?('
|
41
|
-
ua = request.header['
|
46
|
+
if request.header.has_key?('User-Agent')
|
47
|
+
ua = request.header['User-Agent']
|
42
48
|
is_symbian = ua.include?("SymbianOS")
|
43
49
|
is_safari = ((not is_symbian) and ua.include?("WebKit"))
|
44
50
|
is_msie = ((not ua.include?("Opera")) and ua.include?("MSIE"))
|
45
51
|
is_msie6 = ((not ua.include?("Opera")) and ua.include?("MSIE 6.0"))
|
46
52
|
end
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
request_path = request_uri.split( '/' )
|
52
|
-
|
53
|
-
## Requested type of client resource (js/themes)
|
54
|
-
req_type = request_path[2]
|
55
|
-
|
56
|
-
if not ['js','themes'].include? req_type
|
57
|
-
req_rev = req_type
|
58
|
-
req_type = request_path[3]
|
59
|
-
request_path.delete_at(2)
|
53
|
+
if is_safari
|
54
|
+
version = ua.split( 'WebKit/' )[1].split('.')[0].to_i
|
55
|
+
else
|
56
|
+
version = 0 # not used for others
|
60
57
|
end
|
58
|
+
return {
|
59
|
+
:symbian => is_symbian,
|
60
|
+
:safari => is_safari,
|
61
|
+
:msie => is_msie,
|
62
|
+
:msie6 => is_msie6,
|
63
|
+
:version => version
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
def support_gzip?( ua )
|
68
|
+
doesnt_support = ( ua[:msie6] or ua[:symbian] or (ua[:safari] and ua[:version] < 533) )
|
69
|
+
return ( not doesnt_support )
|
70
|
+
end
|
71
|
+
|
72
|
+
def serve_htc( request, response, request_path )
|
73
|
+
req_file = request_path[3]
|
61
74
|
|
62
|
-
|
63
|
-
|
64
|
-
|
75
|
+
# this file is a part of iefix, it injects calls to
|
76
|
+
# the ie rendering engine to override stupid behavior
|
77
|
+
# when changing element properties
|
78
|
+
if request_path.include?('ie_css_element.htc')
|
79
|
+
response.status = 200
|
80
|
+
response['Content-Type'] = 'text/x-component'
|
81
|
+
## Usually, we don't need it, because the client framework does calls when needed
|
82
|
+
response.body = %{<PUBLIC:COMPONENT lightWeight="true"></PUBLIC:COMPONENT>}
|
65
83
|
|
66
|
-
|
67
|
-
#
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
## Enable it to call iefix automatically whenever element properties are changed
|
76
|
-
#response.body = %{<PUBLIC:COMPONENT lightWeight="true">\r\n<script type="text/javascript">\r\ntry{element.attachEvent("onpropertychange",iefix.htcElementEntry);}catch(e){}\r\n</script>\r\n</PUBLIC:COMPONENT>}
|
84
|
+
## Enable it to call iefix automatically whenever element properties are changed
|
85
|
+
#response.body = %{<PUBLIC:COMPONENT lightWeight="true">\r\n<script type="text/javascript">\r\ntry{element.attachEvent("onpropertychange",iefix.htcElementEntry);}catch(e){}\r\n</script>\r\n</PUBLIC:COMPONENT>}
|
86
|
+
|
87
|
+
# this file is a part of iefix, it injects calls to
|
88
|
+
# the ie rendering engine to override stupid behavior
|
89
|
+
# when changing style properties
|
90
|
+
elsif request_path.include?('ie_css_style.htc')
|
91
|
+
response.status = 200
|
92
|
+
response['Content-Type'] = 'text/x-component'
|
77
93
|
|
78
|
-
|
79
|
-
|
80
|
-
# when changing style properties
|
81
|
-
elsif request_path.include?('ie_css_style.htc')
|
82
|
-
response.status = 200
|
83
|
-
response['Content-Type'] = 'text/x-component'
|
84
|
-
|
85
|
-
## Usually, we don't need it, because the client framework does calls when needed
|
86
|
-
response.body = %{<PUBLIC:COMPONENT lightWeight="true"></PUBLIC:COMPONENT>}
|
87
|
-
|
88
|
-
## Enable it to call iefix automatically whenever element properties are changed
|
89
|
-
#response.body = %{<PUBLIC:COMPONENT lightWeight="true">\r\n<script type="text/javascript">\r\ntry{element.attachEvent("onreadystatechange",iefix.htcStyleEntry);}catch(e){}\r\n</script>\r\n</PUBLIC:COMPONENT>}
|
94
|
+
## Usually, we don't need it, because the client framework does calls when needed
|
95
|
+
response.body = %{<PUBLIC:COMPONENT lightWeight="true"></PUBLIC:COMPONENT>}
|
90
96
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
97
|
+
## Enable it to call iefix automatically whenever element properties are changed
|
98
|
+
#response.body = %{<PUBLIC:COMPONENT lightWeight="true">\r\n<script type="text/javascript">\r\ntry{element.attachEvent("onreadystatechange",iefix.htcStyleEntry);}catch(e){}\r\n</script>\r\n</PUBLIC:COMPONENT>}
|
99
|
+
|
100
|
+
# Other htc requests are invalid
|
101
|
+
else
|
102
|
+
response.status = 503
|
103
|
+
response.body = '503 - Invalid Request'
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def serve_js( request, response, request_path, ua )
|
108
|
+
# the file-specific identifier ('core', 'basic' etc)
|
109
|
+
req_file = request_path[3][0..-4]
|
110
|
+
|
111
|
+
if not @client_cache.js_cache.has_key?( req_file )
|
112
|
+
response.status = 404
|
113
|
+
response.body = '/* 404 - Not Found */'
|
114
|
+
else
|
99
115
|
|
116
|
+
response.status = 200
|
117
|
+
response['Content-Type'] = 'text/javascript; charset=utf-8'
|
100
118
|
|
101
|
-
#
|
102
|
-
|
119
|
+
# these browsers have issues with gzipped js content
|
120
|
+
support_gzip = support_gzip?( ua )
|
103
121
|
|
104
|
-
if
|
105
|
-
response
|
106
|
-
response
|
122
|
+
if support_gzip
|
123
|
+
#response['Transfer-Encoding'] = 'chunked,gzip'
|
124
|
+
response['Last-Modified'] = @client_cache.last_modified
|
125
|
+
body = @client_cache.gz_cache[ req_file ]+"\r\n\r\n"
|
126
|
+
response['Content-Length'] = body.bytesize.to_s
|
127
|
+
response['Content-Encoding'] = 'gzip'
|
128
|
+
response.body = body
|
107
129
|
else
|
108
130
|
|
109
|
-
response
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
support_gzip = false if (is_safari or is_msie or is_symbian)
|
131
|
+
response['Last-Modified'] = @client_cache.last_modified
|
132
|
+
body = @client_cache.js_cache[ req_file ]
|
133
|
+
response['Content-Length'] = body.bytesize.to_s
|
134
|
+
response.body = body
|
114
135
|
|
115
|
-
if support_gzip
|
116
|
-
#response['Transfer-Encoding'] = 'chunked,gzip'
|
117
|
-
response['Last-Modified'] = @client_cache.last_modified
|
118
|
-
body = @client_cache.gz_cache[ req_file ]+"\r\n\r\n"
|
119
|
-
response['Content-Length'] = body.length.to_s
|
120
|
-
response['Content-Encoding'] = 'gzip'
|
121
|
-
response.body = body
|
122
|
-
else
|
123
|
-
|
124
|
-
response['Last-Modified'] = @client_cache.last_modified
|
125
|
-
body = @client_cache.js_cache[ req_file ]
|
126
|
-
response['Content-Length'] = body.length.to_s
|
127
|
-
response.body = body
|
128
|
-
|
129
|
-
end
|
130
136
|
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def serve_theme( request, response, request_path, ua )
|
141
|
+
# Get the name of the theme
|
142
|
+
theme_name = request_path[3]
|
131
143
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
144
|
+
# Get the theme resource type (html/css/gfx)
|
145
|
+
theme_part = request_path[4].to_sym
|
146
|
+
|
147
|
+
# Get the theme resource identifier
|
148
|
+
req_file = request_path[5]
|
149
|
+
|
150
|
+
# checks for theme name
|
151
|
+
has_theme = @client_cache.theme_cache.has_key?( theme_name )
|
152
|
+
|
153
|
+
# checks for theme part (css/html/gfx)
|
154
|
+
has_theme_part = ( has_theme and @client_cache.theme_cache[theme_name].has_key?( theme_part ) )
|
155
|
+
|
156
|
+
# checks for theme file
|
157
|
+
has_theme_file = ( has_theme_part and @client_cache.theme_cache[theme_name][theme_part].has_key?( req_file ) )
|
158
|
+
|
159
|
+
if not has_theme_file and req_file == 'common.css'
|
160
|
+
response.status = 200
|
161
|
+
response['Content-Type'] = 'text/css'
|
162
|
+
response.body = ''
|
163
|
+
end
|
164
|
+
|
165
|
+
if not has_theme
|
166
|
+
response.status = 404
|
167
|
+
response.body = '404 - Theme Not Found'
|
168
|
+
puts "Theme #{theme_name} not found, avail: #{@client_cache.theme_cache.keys.join(', ')}" if RSence.args[:verbose]
|
169
|
+
elsif not has_theme_part
|
170
|
+
response.status = 503
|
171
|
+
response.body = '503 - Invalid Theme Part Request'
|
172
|
+
elsif not has_theme_file
|
173
|
+
response.status = 404
|
174
|
+
response.body = '404 - Theme Resource Not Found'
|
175
|
+
puts "File not found, avail: #{@client_cache.theme_cache[theme_name][theme_part].keys.join(', ')}" if RSence.args[:verbose]
|
176
|
+
else
|
150
177
|
|
151
|
-
|
152
|
-
# checks for theme file
|
153
|
-
has_theme_file = has_theme_part and @client_cache.theme_cache[theme_name][theme_part].has_key?( req_file )
|
178
|
+
response.status = 200
|
154
179
|
|
180
|
+
file_ext = req_file.split('.')[-1]
|
181
|
+
response['Content-Type'] = {
|
182
|
+
'html' => 'text/html; charset=utf-8',
|
183
|
+
'css' => 'text/css; charset=utf-8',
|
184
|
+
'png' => 'image/png',
|
185
|
+
'jpg' => 'image/jpeg',
|
186
|
+
'gif' => 'image/gif',
|
187
|
+
'swf' => 'application/x-shockwave-flash'
|
188
|
+
}[file_ext]
|
155
189
|
|
156
|
-
if
|
157
|
-
|
158
|
-
|
159
|
-
|
190
|
+
if theme_part == :gfx
|
191
|
+
support_gzip = false
|
192
|
+
else
|
193
|
+
support_gzip = support_gzip?( ua )
|
160
194
|
end
|
161
195
|
|
162
|
-
if
|
163
|
-
response
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
response.
|
168
|
-
response.body = '503 - Invalid Theme Part Request'
|
169
|
-
elsif not has_theme_file
|
170
|
-
response.status = 404
|
171
|
-
response.body = '404 - Theme Resource Not Found'
|
172
|
-
puts "File not found, avail: #{@client_cache.theme_cache[theme_name][theme_part].keys.join(', ')}" if RSence.args[:verbose]
|
196
|
+
if support_gzip
|
197
|
+
response['Last-Modified'] = @client_cache.last_modified
|
198
|
+
body = @client_cache.theme_cache[theme_name][theme_part][ req_file+'.gz' ]
|
199
|
+
response['Content-Length'] = body.bytesize.to_s
|
200
|
+
response['Content-Encoding'] = 'gzip'
|
201
|
+
response.body = body
|
173
202
|
else
|
174
203
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
'css' => 'text/css; charset=utf-8',
|
181
|
-
'png' => 'image/png',
|
182
|
-
'jpg' => 'image/jpeg',
|
183
|
-
'gif' => 'image/gif',
|
184
|
-
'swf' => 'application/x-shockwave-flash'
|
185
|
-
}[file_ext]
|
186
|
-
|
187
|
-
support_gzip = false if theme_part == :gfx
|
188
|
-
support_gzip = false if (is_safari or is_msie or is_symbian)
|
189
|
-
|
190
|
-
if support_gzip
|
191
|
-
response['Last-Modified'] = @client_cache.last_modified
|
192
|
-
body = @client_cache.theme_cache[theme_name][theme_part][ req_file+'.gz' ]
|
193
|
-
response['Content-Length'] = body.length.to_s
|
194
|
-
response['Content-Encoding'] = 'gzip'
|
195
|
-
response.body = body
|
196
|
-
else
|
197
|
-
|
198
|
-
# Special IE6 condition to serve gifs instead of png's, because it works much better
|
199
|
-
# than using the ActiveX alpha filter hack
|
200
|
-
if is_msie6 and req_file[-4..-1] == '.png'
|
201
|
-
ie6_req_png2gif = req_file.gsub('.png','-ie6.gif')
|
202
|
-
req_file = ie6_req_png2gif if @client_cache.theme_cache[theme_name][theme_part].include?(ie6_req_png2gif)
|
203
|
-
end
|
204
|
-
|
205
|
-
response['Last-Modified'] = @client_cache.last_modified
|
206
|
-
body = @client_cache.theme_cache[theme_name][theme_part][ req_file ]
|
207
|
-
response['Content-Length'] = body.length.to_s
|
208
|
-
response.body = body
|
209
|
-
|
204
|
+
# Special IE6 condition to serve gifs instead of png's, because it works much better
|
205
|
+
# than using the ActiveX alpha filter hack
|
206
|
+
if ua[:msie6] and req_file[-4..-1] == '.png'
|
207
|
+
ie6_req_png2gif = req_file.gsub('.png','-ie6.gif')
|
208
|
+
req_file = ie6_req_png2gif if @client_cache.theme_cache[theme_name][theme_part].include?(ie6_req_png2gif)
|
210
209
|
end
|
211
|
-
end
|
212
210
|
|
211
|
+
response['Last-Modified'] = @client_cache.last_modified
|
212
|
+
body = @client_cache.theme_cache[theme_name][theme_part][ req_file ]
|
213
|
+
if body.nil?
|
214
|
+
warn "ClientPkgServe#get: empty body for #{request.path}"
|
215
|
+
body = ''
|
216
|
+
end
|
217
|
+
response['Content-Length'] = body.bytesize.to_s
|
218
|
+
response.body = body
|
219
|
+
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
## Responds to get-requests
|
225
|
+
def get( request, response, session )
|
226
|
+
|
227
|
+
build_busy_wait
|
228
|
+
|
229
|
+
ua = check_ua( request )
|
230
|
+
|
231
|
+
set_headers( response )
|
232
|
+
|
233
|
+
## Split path into an array for determining what to serve
|
234
|
+
request_uri = '/'+request.path.match( /^#{::RSence.config[:broker_urls][:h]}(.*)$/ )[1]
|
235
|
+
|
236
|
+
request_path = request_uri.split( '/' )
|
237
|
+
|
238
|
+
## Requested type of client resource (js/themes)
|
239
|
+
req_type = request_path[2]
|
240
|
+
|
241
|
+
unless ['js','themes'].include? req_type
|
242
|
+
req_rev = req_type
|
243
|
+
req_type = request_path[3]
|
244
|
+
request_path.delete_at(2)
|
245
|
+
end
|
246
|
+
|
247
|
+
## Special rules for the special browser
|
248
|
+
if request.path.end_with?('.htc')
|
249
|
+
serve_htc( request, response, request_path )
|
250
|
+
## Serve compiled client javascript component files:
|
251
|
+
elsif req_type == 'js'
|
252
|
+
serve_js( request, response, request_path, ua )
|
253
|
+
## Serve client theme files
|
254
|
+
elsif req_type == 'themes'
|
255
|
+
serve_theme( request, response, request_path, ua )
|
213
256
|
end
|
214
257
|
|
215
258
|
end
|
data/plugins/main/main.rb
CHANGED
@@ -154,11 +154,11 @@ class MainPlugin < Plugin
|
|
154
154
|
gzwriter = Zlib::GzipWriter.new( index_gzip, 9 )
|
155
155
|
gzwriter.write( index_html )
|
156
156
|
gzwriter.close
|
157
|
-
response['Content-Length'] = index_gzip.
|
157
|
+
response['Content-Length'] = index_gzip.bytesize.to_s
|
158
158
|
response['Content-Encoding'] = 'gzip'
|
159
159
|
response.body = index_gzip
|
160
160
|
else
|
161
|
-
response['Content-Length'] = index_html.
|
161
|
+
response['Content-Length'] = index_html.bytesize.to_s
|
162
162
|
response.body = index_html
|
163
163
|
end
|
164
164
|
end
|
@@ -229,14 +229,14 @@ class MainPlugin < Plugin
|
|
229
229
|
|
230
230
|
|
231
231
|
# New session initialization, called just once per session.
|
232
|
-
def init_ses(msg)
|
232
|
+
def init_ses( msg )
|
233
233
|
super
|
234
234
|
restore_ses( msg )
|
235
235
|
end
|
236
236
|
|
237
237
|
|
238
238
|
# Called once when a session is restored or cloned using the cookie's ses_key
|
239
|
-
def restore_ses(msg)
|
239
|
+
def restore_ses( msg )
|
240
240
|
super
|
241
241
|
## Resets session data to defaults
|
242
242
|
ses = get_ses( msg )
|
@@ -282,16 +282,15 @@ class MainPlugin < Plugin
|
|
282
282
|
## url_responder is bound in the client-space
|
283
283
|
## to tell the server its status by updating its value
|
284
284
|
location_href_id = ses[:location_href].val_id.to_json
|
285
|
-
msg.reply "COMM.Values.values[#{location_href_id}].bind(COMM.urlResponder);"
|
285
|
+
msg.reply "try{COMM.Values.values[#{location_href_id}].bind(COMM.urlResponder);}catch(e){console.log('urlResponder failed, reason:',e);}"
|
286
286
|
|
287
|
-
## This enables SesWatcher that changes :client_time every
|
288
|
-
## It makes the client to poll the server on regular intervals, when polling mode
|
289
|
-
## is disabled.
|
287
|
+
## This enables SesWatcher that changes :client_time every n seconds, which depends on the server_poll_interval configuration setting.
|
288
|
+
## It makes the client to poll the server on regular intervals, when polling mode is disabled.
|
290
289
|
# 5000ms = 5secs
|
291
290
|
|
292
291
|
client_time_id = ses[:client_time].val_id.to_json
|
293
292
|
poll_interval = ::RSence.config[:main_plugin][:server_poll_interval]
|
294
|
-
msg.reply "sesWatcher
|
293
|
+
msg.reply "try{window.sesWatcher=COMM.SessionWatcher.nu(#{poll_interval},#{client_time_id});}catch(e){console.log('sesWatcher failed, reason:',e);}"
|
295
294
|
|
296
295
|
end
|
297
296
|
|
@@ -392,7 +391,6 @@ class MainPlugin < Plugin
|
|
392
391
|
def idle(msg)
|
393
392
|
|
394
393
|
ses = get_ses( msg )
|
395
|
-
|
396
394
|
if ses[:boot] == 0
|
397
395
|
boot0( msg, ses )
|
398
396
|
elsif ses[:boot] == 1
|
@@ -156,7 +156,7 @@ module Common
|
|
156
156
|
(content_type, filename) = format
|
157
157
|
|
158
158
|
# content size for the header
|
159
|
-
content_size = content.
|
159
|
+
content_size = content.bytesize.to_s
|
160
160
|
|
161
161
|
storage_hash = @files
|
162
162
|
storage_arr = [content_type,content_size,content,msg.ses_id,filename]
|
@@ -270,7 +270,7 @@ module Common
|
|
270
270
|
}
|
271
271
|
|
272
272
|
# content size for the header
|
273
|
-
content_size = content.
|
273
|
+
content_size = content.bytesize.to_s
|
274
274
|
|
275
275
|
# content type for the header
|
276
276
|
content_type = @content_types[format]
|
@@ -335,12 +335,12 @@ module Common
|
|
335
335
|
end
|
336
336
|
if @raw_uris.include?(blobobj_id)
|
337
337
|
content_type = @raw_uris[blobobj_id].mime
|
338
|
-
content_size = @raw_uris[blobobj_id].
|
338
|
+
content_size = @raw_uris[blobobj_id].bytesize
|
339
339
|
content = @raw_uris[blobobj_id].data
|
340
340
|
elsif @blob_objs[:by_id].include?(blobobj_id)
|
341
341
|
(ses_id, blobobj) = @blob_objs[:by_id][blobobj_id]
|
342
342
|
content_type = blobobj.mime
|
343
|
-
content_size = blobobj.
|
343
|
+
content_size = blobobj.bytesize
|
344
344
|
content = blobobj.data
|
345
345
|
if req.header.has_key?('keep-alive') and req.header['keep-alive'].size > 0
|
346
346
|
keep_alive = req.header['keep-alive'][0].to_i
|
@@ -30,7 +30,7 @@ module Favicon
|
|
30
30
|
# Sets favicon. First parameter is favicon data and the second one is content type which defaults to false.
|
31
31
|
def set_favicon( ico_data, content_type=false )
|
32
32
|
@raw_uris['favicon.ico'][0] = content_type if content_type
|
33
|
-
@raw_uris['favicon.ico'][1] = ico_data.
|
33
|
+
@raw_uris['favicon.ico'][1] = ico_data.bytesize.to_s
|
34
34
|
@raw_uris['favicon.ico'][2] = ico_data
|
35
35
|
|
36
36
|
end
|
data/plugins/ticket/lib/rsrc.rb
CHANGED
@@ -176,8 +176,8 @@ create table rsence_uploads (
|
|
176
176
|
}
|
177
177
|
|
178
178
|
response.status = 200
|
179
|
-
response['
|
180
|
-
response['
|
179
|
+
response['Content-Type'] = 'text/html; charset=UTF-8'
|
180
|
+
response['Content-Length'] = response_body.bytesize.to_s
|
181
181
|
response.body = response_body
|
182
182
|
end
|
183
183
|
|
data/plugins/ticket/ticket.rb
CHANGED
@@ -110,8 +110,8 @@ class TicketPlugin < Plugin
|
|
110
110
|
puts "/U/iframe_html: #{uri.inspect}" if RSence.args[:verbose]
|
111
111
|
res.status = 200
|
112
112
|
http_body = '<html><head><title>Empty Iframe for Uploading</title></head><body></body></html>'
|
113
|
-
res['
|
114
|
-
res['
|
113
|
+
res['Content-Type'] = 'text/html; charset=UTF-8'
|
114
|
+
res['Content-Length'] = http_body.bytesize.to_s
|
115
115
|
res.body = http_body
|
116
116
|
end
|
117
117
|
end
|
@@ -158,7 +158,7 @@ class TicketPlugin < Plugin
|
|
158
158
|
|
159
159
|
# @return [Number] The size (in bytes) of the data
|
160
160
|
def size
|
161
|
-
return @data.
|
161
|
+
return @data.bytesize
|
162
162
|
end
|
163
163
|
|
164
164
|
# Implement, if you need to do cleanup before destructing
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
class: RSence.GUIApp
|
19
19
|
# Each class takes a number of options for its constructor.
|
20
20
|
options:
|
21
|
-
|
21
|
+
label: Welcome App
|
22
22
|
# The subviews use the class defined above as their parent component.
|
23
23
|
subviews:
|
24
24
|
# The sheet is used as the main visual container for the gui in this app.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rsence-pre
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 71
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 1
|
9
|
+
- 8
|
9
10
|
- 0
|
10
|
-
|
11
|
-
version: 2.1.0.21
|
11
|
+
version: 2.1.8.0
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- Riassence Inc.
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date:
|
19
|
+
date: 2011-01-18 00:00:00 +02:00
|
20
20
|
default_executable: rsence-pre
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -27,14 +27,14 @@ dependencies:
|
|
27
27
|
requirements:
|
28
28
|
- - "="
|
29
29
|
- !ruby/object:Gem::Version
|
30
|
-
hash:
|
30
|
+
hash: 1925
|
31
31
|
segments:
|
32
|
-
-
|
33
|
-
version: "
|
32
|
+
- 963
|
33
|
+
version: "963"
|
34
34
|
type: :runtime
|
35
35
|
version_requirements: *id001
|
36
36
|
description: |
|
37
|
-
RSence is a RIA framework designed for responsive GUI applications on the web.
|
37
|
+
RSence is a RIA ("HTML5" or "Ajax" if you like those terms better) framework designed for responsive GUI applications on the web.
|
38
38
|
|
39
39
|
RSence is a flexible and high-performance RIA framework aimed on building responsive, scalable and over-all as high-performance GUI Applications as possible with the chosen technologies.
|
40
40
|
|
@@ -77,7 +77,6 @@ files:
|
|
77
77
|
- lib/session/sessionstorage.rb
|
78
78
|
- lib/transporter/transporter.rb
|
79
79
|
- lib/util/gzstring.rb
|
80
|
-
- lib/util/ruby19_fixes.rb
|
81
80
|
- lib/values/hvalue.rb
|
82
81
|
- lib/values/valuemanager.rb
|
83
82
|
- setup/welcome/gui/welcome.yaml
|
@@ -408,7 +407,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
408
407
|
requirements: []
|
409
408
|
|
410
409
|
rubyforge_project: rsence-
|
411
|
-
rubygems_version: 1.
|
410
|
+
rubygems_version: 1.4.1
|
412
411
|
signing_key:
|
413
412
|
specification_version: 3
|
414
413
|
summary: Pre-Release 2.1 version of the RSence framework.
|
data/lib/util/ruby19_fixes.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
|
2
|
-
# NOTE: Ruby 1.9 isn't fully supported yet.
|
3
|
-
# There are some encoding handlers and some of the dependencies are not fully working yet.
|
4
|
-
# One should wait for Ruby 2.0 for production use anyway.
|
5
|
-
|
6
|
-
# Ruby 1.9 encoding defaults.
|
7
|
-
# This is clearly not enough but a good start for fixing the encoding madness.
|
8
|
-
Encoding.default_external = Encoding::BINARY
|
9
|
-
Encoding.default_internal = Encoding::BINARY
|
10
|
-
|
11
|
-
# Ruby 1.9 doesn't have String#each anymore.
|
12
|
-
# This is a backwards-compatible work-around.
|
13
|
-
class String
|
14
|
-
def each
|
15
|
-
self.split($/).each { |e| yield e }
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|