ebb 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ebb.rb +52 -20
- data/lib/ebb/version.rb +1 -1
- metadata +2 -2
data/lib/ebb.rb
CHANGED
@@ -10,12 +10,16 @@ module Ebb
|
|
10
10
|
def self.running?
|
11
11
|
FFI::server_open?
|
12
12
|
end
|
13
|
+
|
14
|
+
def self.ssl?
|
15
|
+
@@secure
|
16
|
+
end
|
13
17
|
|
14
18
|
def self.stop_server()
|
15
19
|
@running = false
|
16
20
|
end
|
17
21
|
|
18
|
-
def self.
|
22
|
+
def self.set_options(options)
|
19
23
|
if options.has_key?(:fileno)
|
20
24
|
fd = options[:fileno].to_i
|
21
25
|
FFI::server_listen_on_fd(fd)
|
@@ -31,6 +35,7 @@ module Ebb
|
|
31
35
|
log.puts "Ebb is listening at http://0.0.0.0:#{port}/"
|
32
36
|
end
|
33
37
|
|
38
|
+
@@secure = false
|
34
39
|
if options.has_key?(:ssl_cert) and options.has_key?(:ssl_key)
|
35
40
|
unless FFI.respond_to?(:server_set_secure)
|
36
41
|
log.puts "ebb compiled without ssl support. get gnutls"
|
@@ -39,16 +44,25 @@ module Ebb
|
|
39
44
|
key_file = options[:ssl_key]
|
40
45
|
if FileTest.readable?(cert_file) and FileTest.readable?(cert_file)
|
41
46
|
FFI::server_set_secure(cert_file, key_file);
|
47
|
+
@@secure = true
|
42
48
|
else
|
43
49
|
log.puts "error opening certificate or key file"
|
44
50
|
end
|
45
51
|
end
|
46
52
|
end
|
47
53
|
|
54
|
+
unless options[:docroot].nil?
|
55
|
+
@@docroot = options[:docroot]
|
56
|
+
raise "#{@@docroot} not a directory"unless File.directory?(@@docroot)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.start_server(app, options={})
|
61
|
+
set_options(options)
|
48
62
|
log.puts "Ebb PID #{Process.pid}"
|
49
63
|
|
50
|
-
@running = true
|
51
64
|
Connection.reset_responses
|
65
|
+
@running = true
|
52
66
|
trap('INT') { stop_server }
|
53
67
|
|
54
68
|
while @running
|
@@ -68,7 +82,6 @@ module Ebb
|
|
68
82
|
res = req.response
|
69
83
|
req.connection.responses << res
|
70
84
|
|
71
|
-
# p req.env
|
72
85
|
status = headers = body = nil
|
73
86
|
catch(:async) do
|
74
87
|
status, headers, body = app.call(req.env)
|
@@ -157,16 +170,26 @@ module Ebb
|
|
157
170
|
|
158
171
|
def call(status, headers, body)
|
159
172
|
@head = "HTTP/1.1 #{status} #{HTTP_STATUS_CODES[status.to_i]}\r\n"
|
160
|
-
|
161
|
-
|
173
|
+
|
174
|
+
# Hack to be compatible with frameworks who return Strings.
|
175
|
+
if body.kind_of?(String)
|
176
|
+
headers["Content-Length"] = body.length.to_s
|
177
|
+
body = [body]
|
178
|
+
end
|
162
179
|
|
163
180
|
# XXX i would prefer to do
|
164
181
|
# @chunked = true unless body.respond_to?(:length)
|
165
|
-
|
182
|
+
if headers["Transfer-Encoding"] == "chunked" or
|
183
|
+
!headers.has_key?("Content-Length")
|
184
|
+
then
|
185
|
+
headers["Transfer-Encoding"] = "chunked"
|
186
|
+
@chunked = true
|
187
|
+
end
|
166
188
|
# I also don't like this
|
167
189
|
@last = true if headers["Connection"] == "close"
|
168
190
|
|
169
|
-
|
191
|
+
headers.each { |field, value| @head << "#{field}: #{value}\r\n" }
|
192
|
+
@head << "\r\n"
|
170
193
|
|
171
194
|
body.each do |chunk|
|
172
195
|
write(chunk)
|
@@ -257,25 +280,34 @@ module Ebb
|
|
257
280
|
|
258
281
|
class Request
|
259
282
|
attr_accessor :connection
|
283
|
+
|
284
|
+
BASE_ENV = {
|
285
|
+
'SERVER_NAME' => '0.0.0.0',
|
286
|
+
'SCRIPT_NAME' => '',
|
287
|
+
'SERVER_SOFTWARE' => Ebb::VERSION_STRING,
|
288
|
+
'SERVER_PROTOCOL' => 'HTTP/1.1',
|
289
|
+
'rack.version' => [0, 1],
|
290
|
+
'rack.errors' => STDERR,
|
291
|
+
'rack.multiprocess' => false,
|
292
|
+
'rack.run_once' => false
|
293
|
+
}
|
260
294
|
|
261
295
|
def env
|
262
296
|
@env ||= begin
|
263
|
-
@env_ffi
|
264
|
-
|
265
|
-
'SCRIPT_NAME' => '',
|
266
|
-
'SERVER_SOFTWARE' => Ebb::VERSION_STRING,
|
267
|
-
'SERVER_PROTOCOL' => 'HTTP/1.1',
|
268
|
-
'rack.version' => [0, 1],
|
269
|
-
'rack.errors' => STDERR,
|
270
|
-
'rack.url_scheme' => 'http',
|
271
|
-
'rack.multiprocess' => false,
|
272
|
-
'rack.run_once' => false,
|
273
|
-
|
297
|
+
env = BASE_ENV.merge(@env_ffi)
|
298
|
+
env.update(
|
274
299
|
'rack.input' => self,
|
275
300
|
'async.callback' => response,
|
276
|
-
'
|
277
|
-
'CONTENT_TYPE' => @env_ffi.delete('HTTP_CONTENT_TYPE')
|
301
|
+
'rack.url_scheme' => Ebb.ssl? ? 'https' : 'http'
|
278
302
|
)
|
303
|
+
env["HTTP_HOST"] ||= BASE_ENV["SERVER_NAME"]
|
304
|
+
if env.has_key?('HTTP_CONTENT_LENGTH')
|
305
|
+
env['CONTENT_LENGTH'] = env.delete('HTTP_CONTENT_LENGTH')
|
306
|
+
end
|
307
|
+
if env.has_key?('HTTP_CONTENT_TYPE')
|
308
|
+
env['CONTENT_TYPE'] = env.delete('HTTP_CONTENT_TYPE')
|
309
|
+
end
|
310
|
+
env
|
279
311
|
end
|
280
312
|
end
|
281
313
|
|
data/lib/ebb/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ebb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ry dahl
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-08-
|
12
|
+
date: 2008-08-20 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|