uwa 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  module UWA
2
2
  NAME = 'UWA'
3
- VERSION = '0.3'
3
+ VERSION = '0.4'
4
4
  DESC = 'Widget server for UWA specs by Netvibes (http://dev.netvibes.com/doc/universal_widget_api)'
5
5
  AUTHOR = 'Florent Solt'
6
6
  EMAIL = 'florent@solt.biz'
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
 
3
3
  module UWA
4
4
  class Handler < Mongrel::HttpHandler
5
- attr_accessor :css, :script
5
+ attr_accessor :css, :script, :base
6
6
 
7
7
  def initialize
8
8
  super
@@ -17,7 +17,9 @@ class Handler < Mongrel::HttpHandler
17
17
  @keywords = self.class.name.downcase
18
18
  @css = []
19
19
  @script = []
20
+ @base = nil
20
21
  @cache = {:css => nil, :script => nil}
22
+ @autoRefresh = nil
21
23
 
22
24
  @query = nil
23
25
  @out = nil
@@ -31,7 +33,10 @@ class Handler < Mongrel::HttpHandler
31
33
  UWA::Server.log(@request.params['REQUEST_METHOD'], @request.params['REQUEST_URI'])
32
34
  @query = query_string(req.params['QUERY_STRING'])
33
35
  UWA::Server.log(:QUERY, @query.inspect)
34
- if @request.params['REQUEST_PATH'].split('/', 3)[2].nil? and @query['url'].nil?
36
+
37
+ method = @request.params['PATH_INFO'].split('/')[1]
38
+
39
+ if method.nil?
35
40
  @response.start(200) do |head, out|
36
41
  head["Content-Type"] = "text/html"
37
42
  xml = Builder::XmlMarkup.new(:indent => 4, :target => out)
@@ -48,6 +53,7 @@ class Handler < Mongrel::HttpHandler
48
53
  xml.meta(:name => 'inline', :content => @inline.to_s)
49
54
  xml.meta(:name => 'debugMode', :content => @debugMode.to_s)
50
55
  xml.meta(:name => 'keywords', :content => @keywords)
56
+ xml.meta(:name => 'autoRefresh', :content => @autoRefresh) unless @autoRefresh.nil?
51
57
  xml.link(:rel => :stylesheet, :type => 'text/css',
52
58
  :href => 'http://www.netvibes.com/themes/uwa/style.css')
53
59
  xml.script("", :type => 'text/javascript',
@@ -61,8 +67,8 @@ class Handler < Mongrel::HttpHandler
61
67
  xml.link(:rel => :icon, :type => 'image/png', :href => @icon)
62
68
  css.each { |c| xml.style("\n" + c, :type => 'text/css') }
63
69
  xml.script(:type => 'text/javascript') do |xml|
64
- url = 'http://' + req.params['HTTP_HOST'] + req.params['REQUEST_PATH'] + '/'
65
- xml << "widget.remoteUrl = '#{url}'\n"
70
+ url = 'http://' + req.params['HTTP_HOST'] + req.params['SCRIPT_NAME']
71
+ xml << "widget.remoteUrl = '#{url}/'\n"
66
72
  ['Text', 'Json', 'Xml', 'Feed'].each do |m|
67
73
  xml << "widget.remote#{m} = function(uri, cb) {
68
74
  UWA.Data.get#{m}(widget.remoteUrl + uri, cb); };\n"
@@ -70,9 +76,11 @@ class Handler < Mongrel::HttpHandler
70
76
  script.each do |s|
71
77
  xml << "\n#{s}\n"
72
78
  end
73
- xml << "if (document.location && document.location.hostname == 'localhost') {
79
+ xml << "if (document.location && (document.location.hostname == 'localhost'
80
+ || document.location.href.match('^#{url}'))) {
74
81
  UWA.proxies.ajax = '/proxy';
75
- UWA.Data.useJsonRequest = false; }\n"
82
+ UWA.Data.useJsonRequest = false;
83
+ }\n"
76
84
  end
77
85
  end
78
86
  xml.body do |xml|
@@ -82,21 +90,23 @@ class Handler < Mongrel::HttpHandler
82
90
  xml.target!
83
91
  end
84
92
  else
85
- method = @request.params['REQUEST_PATH'].split('/', 3)[2].to_sym
86
- if self.respond_to?(method)
87
- res.start(200) do |head, out|
88
- begin
89
- @headers = head
90
- @out = out
91
- self.send(method)
92
- rescue Exception
93
- UWA::Server.log(:error, "#{$!.message} <#{$!.class.name}>")
94
- UWA::Server.log(:error, $!.backtrace)
95
- end
93
+ if method == 'ressource'
94
+ file = @request.params['PATH_INFO'].gsub(/\.\./, '').split('/')[2..-1].join($/)
95
+ file = File.join(@base, 'ressources', file)
96
+ send_file(file)
97
+ elsif self.respond_to?(method.to_sym)
98
+ begin
99
+ @response.header["Content-Type"] = "text/html"
100
+ @response.status = 200
101
+ self.send(method.to_sym)
102
+ @response.finished
103
+ rescue Exception
104
+ UWA::Server.log(:error, "#{$!.message} <#{$!.class.name}>")
105
+ UWA::Server.log(:error, $!.backtrace)
96
106
  end
97
107
  else
98
- res.start(404) do |head, out|
99
- out.write("Method \"#{method}\" not found")
108
+ @response.start(404) do |head, out|
109
+ out.write("Method #{method.inspect} not found")
100
110
  end
101
111
  end
102
112
  end
@@ -105,7 +115,25 @@ class Handler < Mongrel::HttpHandler
105
115
  protected
106
116
 
107
117
  def <<(buf)
108
- @out.write(buf)
118
+ @response.body.write(buf)
119
+ end
120
+
121
+ def send_file(file, content_type = nil)
122
+ if File.exists?(file)
123
+ file_status = File.stat(file)
124
+ @response.status = 200
125
+ @response.header[Mongrel::Const::LAST_MODIFIED] = file_status.mtime.httpdate
126
+ @response.header[Mongrel::Const::ETAG] = Mongrel::Const::ETAG_FORMAT %
127
+ [file_status.mtime.to_i, file_status.size, file_status.ino]
128
+ @response.header[Mongrel::Const::CONTENT_TYPE] = content_type unless content_type.nil?
129
+ @response.send_status(file_status.size)
130
+ @response.send_header
131
+ @response.send_file(file)
132
+ else
133
+ @response.start(404) do |head, out|
134
+ out.write("File #{file} not found")
135
+ end
136
+ end
109
137
  end
110
138
 
111
139
  def script
@@ -5,6 +5,11 @@ require 'uri'
5
5
  module UWA
6
6
  class Proxy < Mongrel::HttpHandler
7
7
 
8
+ @@ALLOWED_IP = [ '127.0.0.1' ]
9
+ def self.allow(ip)
10
+ @@ALLOWED_IP << ip
11
+ end
12
+
8
13
  def process(req,res)
9
14
  query = CGI::parse(req.params['QUERY_STRING'].to_s)
10
15
  url = query['url'].to_a.first
@@ -12,7 +17,7 @@ class Proxy < Mongrel::HttpHandler
12
17
  UWA::Server.log :ignore, req.params['REQUEST_URI']
13
18
  else
14
19
  url = URI.parse(query['url'].to_a.first.to_s.strip)
15
- if req.params['REMOTE_ADDR'] == '127.0.0.1'
20
+ if @@ALLOWED_IP.include? req.params['REMOTE_ADDR']
16
21
  res.start(200) do |head, out|
17
22
  head["Content-Type"] = "text/xml"
18
23
  unless url.nil?
@@ -34,9 +34,9 @@ class Server
34
34
  begin
35
35
  $mongrel_debug_client = @debug
36
36
  m = Mongrel::HttpServer.new(@host, @port) if m.nil?
37
- m.register('/', UWA::Proxy.new)
38
37
  @widgets.each do |widget|
39
38
  object = widget[:class].new
39
+ object.base = widget[:base]
40
40
  object.script = widget[:script]
41
41
  object.css = widget[:css]
42
42
  widget[:params].to_a.each do |name, value|
@@ -44,6 +44,7 @@ class Server
44
44
  end
45
45
  m.register(widget[:path], object)
46
46
  end
47
+ m.register('/proxy', UWA::Proxy.new)
47
48
  m.run.join
48
49
  rescue
49
50
  m.graceful_shutdown unless m.nil?
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: uwa
5
5
  version: !ruby/object:Gem::Version
6
- version: "0.3"
7
- date: 2007-03-29 00:00:00 +02:00
6
+ version: "0.4"
7
+ date: 2007-04-02 00:00:00 +02:00
8
8
  summary: Widget server for UWA specs by Netvibes (http://dev.netvibes.com/doc/universal_widget_api)
9
9
  require_paths:
10
10
  - lib