webfx 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/webfx.rb +104 -127
  2. metadata +5 -5
@@ -1,89 +1,7 @@
1
+ require 'zlib'
2
+ require 'stringio'
1
3
  require 'json'
2
4
 
3
- class Request
4
- attr_reader :user, :params, :body, :path, :method
5
-
6
- def initialize(env)
7
- request = Rack::Request.new(env)
8
- params = request.params
9
-
10
- if params['_method']
11
- method = params['_method']
12
- else
13
- method = request.request_method
14
- end
15
-
16
- @user = @@authenticate ? @@authenticate.call(params) : nil
17
- @params = params
18
- @body = params['file'] ? '' : (request.post? or request.put?) ? request.body.read : ''
19
- @path = request.path
20
- @method = method.downcase
21
- end
22
- end
23
-
24
-
25
- class Response
26
- attr_writer :status, :header
27
-
28
- class DeferrableBody
29
- include EM::Deferrable
30
-
31
- def call(body)
32
- body.each do |chunk|
33
- @body_callback.call(chunk)
34
- end
35
- end
36
-
37
- def each &blk
38
- @body_callback = blk
39
- end
40
- end
41
-
42
- def initialize(env)
43
- @env = env
44
- @body = DeferrableBody.new
45
- @status = nil
46
- @header = nil
47
- end
48
-
49
- def fail(message)
50
- @status = 500 if @status.nil?
51
- @header = {'Content-Type' => 'text/plain'} if @header.nil?
52
- @env['async.callback'].call [@status, @header, @body]
53
- @body.call [message]
54
- @body.fail
55
- end
56
-
57
- def succeed(body)
58
- @status = 200 if @status.nil?
59
- @header = {'Content-Type' => 'application/json'} if @header.nil?
60
- @env['async.callback'].call [@status, @header, @body]
61
-
62
- if @header['Content-Type'] == 'application/json' and
63
- not ((body.kind_of? String) and (['{', '['].include? body.slice(0, 1)))
64
- body = body.to_json
65
- end
66
-
67
- @body.call [body]
68
- @body.succeed
69
- end
70
-
71
- def deleted
72
- @status = 200 if @status.nil?
73
- @header = {'Content-Type' => 'text/plain'} if @header.nil?
74
- @env['async.callback'].call [@status, @header, @body]
75
- @body.succeed
76
- end
77
-
78
- def updated
79
- @status = 200 if @status.nil?
80
- @header = {'Content-Type' => 'text/plain'} if @header.nil?
81
- @env['async.callback'].call [@status, @header, @body]
82
- @body.succeed
83
- end
84
- end
85
-
86
-
87
5
  @@routes = {'get' => [], 'post' => [], 'put' => [], 'delete' => []}
88
6
  @@authenticate = false
89
7
 
@@ -111,56 +29,115 @@ def authenticate(&fn)
111
29
  @@authenticate = fn
112
30
  end
113
31
 
32
+ class MyResult
33
+ attr_reader :env
34
+
35
+ def initialize(env)
36
+ @env = env
37
+ end
38
+ end
114
39
 
115
- class WebFx
116
- AsyncResponse = [-1, {}, []].freeze
117
-
118
- def call(env)
119
- request = Request.new(env)
120
- response = Response.new(env)
121
-
122
- EM::next_tick do
123
- found = false
40
+ def gzip(data)
41
+ s = StringIO.new
42
+ gz = Zlib::GzipWriter.new(s, 0, nil)
43
+ gz.write data
44
+ gz.close
45
+ s.string
46
+ end
47
+
48
+
49
+ def index_html
50
+ @@index_html ||= gzip(File.read('public/index.html').gsub(/<!--(.|\s)*?-->/, ''))
51
+ end
52
+
53
+
54
+ def run_app(env)
55
+ begin
56
+ request = Rack::Request.new(env)
124
57
 
125
- @@routes[request.method].each do |item|
126
- if request.path[1..-1].match(item[:regexp])
127
- found = true
128
- case $~.length
129
- when 1 then item[:fn].call(request, response)
130
- when 2 then item[:fn].call($1, request, response)
131
- when 3 then item[:fn].call($1, $2, request, response)
132
- when 4 then item[:fn].call($1, $2, $3, request, response)
133
- when 5 then item[:fn].call($1, $2, $3, $4, request, response)
134
- else item[:fn].call($~, request, response)
135
- end
136
- end
58
+ def static(type, file)
59
+ [200, { 'Content-Type' => type, 'Cache-Control' => 'public, max-age=86400' }, File.read(file)]
60
+ end
61
+
62
+ if request.path == '/'
63
+ return [200, { 'Content-Type' => 'text/html', 'Content-Encoding' => 'gzip' }, index_html]
64
+ end
65
+
66
+ if request.path.match(/(.*).js$/)
67
+ return static('text/javascript', "public/#{$1}.js")
68
+ end
69
+
70
+ if request.path.match(/(.*).css$/)
71
+ return static('text/css', "public/#{$1}.css")
72
+ end
73
+
74
+ if request.path.match(/(images\/.*).png$/)
75
+ return static('image/png', "public/#{$1}.png")
76
+ end
77
+
78
+ if request.path.match(/(images\/.*).jpg$/)
79
+ return static('image/jpg', "public/#{$1}.jpg")
80
+ end
81
+
82
+ params = request.params
83
+
84
+ if request.post?
85
+ if not params['file']
86
+ body = request.body.read
87
+ params.merge!(JSON.parse(body)) if body != ''
137
88
  end
89
+ end
90
+
91
+ force_method = params['_method']
92
+ if force_method
93
+ method = force_method
94
+ params.delete('_method')
95
+ else
96
+ method = request.request_method
97
+ end
98
+ method.downcase!
138
99
 
139
- if not found
140
- def static(type, file, response)
141
- begin
142
- response.header = {'Content-Type' => type, 'Cache-Control' => 'public, max-age=86400'}
143
- response.succeed(File.read(file))
144
- rescue => e
145
- response.fail(e.message)
146
- end
100
+ @@routes[method].each do |item|
101
+ if request.path[1..-1].match(item[:regexp])
102
+ me = @@authenticate ? @@authenticate.call(params) : nil
103
+
104
+ case $~.length
105
+ when 1 then result = item[:fn].call(params, me)
106
+ when 2 then result = item[:fn].call($1, params, me)
107
+ when 3 then result = item[:fn].call($1, $2, params, me)
108
+ when 4 then result = item[:fn].call($1, $2, $3, params, me)
109
+ when 5 then result = item[:fn].call($1, $2, $3, $4, params, me)
110
+ else result = item[:fn].call($~, params, me)
147
111
  end
148
-
149
- if request.path == '/'
150
- static('text/html', 'public/index.html', response)
151
- elsif request.path.match(/(.*).js$/)
152
- static('text/javascript', "public#{$1}.js", response)
153
- elsif request.path.match(/(.*).css$/)
154
- static('text/css', "public#{$1}.css", response)
155
- elsif request.path.match(/(.*).jpg$/)
156
- static('image/jpg', ".#{$1}.jpg", response)
157
- else
158
- response.status = 404
159
- response.fail('Not found.')
112
+
113
+ return result.env if result.kind_of? MyResult
114
+
115
+ case method
116
+ when 'get', 'post'
117
+ if result.kind_of? String and ['{', '['].include? result.slice(0, 1)
118
+ json = result
119
+ else
120
+ json = result.to_json
121
+ end
122
+ return [200, {'Content-Type' => 'application/json', 'Content-Encoding' => 'gzip'}, gzip(json)]
123
+ else
124
+ return [200, {'Content-Type' => 'application/json', 'Content-Encoding' => 'gzip'}, gzip({:result => :success}.to_json)]
160
125
  end
161
126
  end
162
127
  end
128
+ [404, {'Content-Type' => 'text/plain'}, 'Not found.']
129
+
130
+ rescue => e
131
+ result = {:message => e.message, :callstack => e.backtrace.join("\n")}
132
+ [500, {'Content-Type' => 'text/plain' }, e.message]
133
+ end
134
+ end
135
+
163
136
 
164
- AsyncResponse
165
- end
137
+ module WebFx
138
+ class Application
139
+ def self.call(env)
140
+ run_app(env)
141
+ end
142
+ end
166
143
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webfx
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 7
10
- version: 0.0.7
9
+ - 8
10
+ version: 0.0.8
11
11
  platform: ruby
12
12
  authors: []
13
13
 
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-08 00:00:00 -08:00
18
+ date: 2011-02-02 00:00:00 -08:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -62,6 +62,6 @@ rubyforge_project:
62
62
  rubygems_version: 1.3.7
63
63
  signing_key:
64
64
  specification_version: 3
65
- summary: Async for thin, EventMachine, heroku, very minimal, RESTful, json, sinatra-inspired framework.
65
+ summary: Minimal, RESTful, json, sinatra-inspired framework.
66
66
  test_files: []
67
67