maveric 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/maveric.rb +311 -451
- data/lib/maveric/extensions.rb +20 -17
- data/lib/maveric/fastcgi.rb +14 -10
- data/lib/maveric/mongrel.rb +10 -30
- data/lib/maveric/sessions.rb +19 -16
- data/lib/maveric/webrick.rb +0 -3
- metadata +7 -15
data/lib/maveric/extensions.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
class Module
|
2
2
|
## Build a string akin to the absolute path of the nesting structure.
|
3
|
-
def
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
downcase
|
3
|
+
def to_path flatten=false
|
4
|
+
path = '/'+self.to_s.gsub(/::+/, '/') # '^/' as absolute path.
|
5
|
+
path = path.gsub(/([a-z])([A-Z])/,'\1_\2').sub(/\/Index$/,'/').downcase if flatten
|
6
|
+
path
|
8
7
|
end
|
9
8
|
|
10
|
-
# ::nodoc::
|
11
9
|
# Still deving this.
|
12
10
|
def self.nesting_path_to_constant path
|
13
11
|
dig = proc{|c,n| c.const_get(n) }
|
@@ -45,31 +43,36 @@ end
|
|
45
43
|
|
46
44
|
##
|
47
45
|
# Extensions to StandardError to enable their usage in Maveric as responses.
|
46
|
+
# The default response is 500 and content-type of text/plain.
|
48
47
|
class StandardError
|
49
48
|
DEFAULT_STATUS = 500
|
50
49
|
DEFAULT_HEADERS = {'Content-Type'=>'text/plain'}
|
51
|
-
|
50
|
+
|
51
|
+
## Returns @status or DEFAULT_STATUS if unset.
|
52
52
|
def status
|
53
|
-
@status
|
53
|
+
defined?(@status)? @status : DEFAULT_STATUS
|
54
54
|
end
|
55
55
|
|
56
|
+
## Returns @headers or DEFAULT_HEADERS if unset.
|
56
57
|
def headers
|
57
|
-
@headers
|
58
|
+
defined?(@headers)? @headers : DEFAULT_HEADERS
|
58
59
|
end
|
59
60
|
|
60
61
|
## Unless @body is defined, a self inspect and backtrace is output.
|
61
62
|
def body
|
62
|
-
@body
|
63
|
+
defined?(@body)? @body : [inspect, *backtrace]*"\n"
|
63
64
|
end
|
64
65
|
|
65
|
-
## See
|
66
|
-
def to_http
|
67
|
-
response =
|
68
|
-
|
69
|
-
|
66
|
+
## See Maveric::Controller#to_http
|
67
|
+
def to_http(raw=true)
|
68
|
+
response = if not raw then 'Status:'
|
69
|
+
elsif defined? @env and @env.key? 'HTTP_VERSION' then @env['HTTP_VERSION']
|
70
|
+
else 'HTTP/1.1'end
|
71
|
+
response += " #{self.status}" + ::Maveric::EOL # Status message? :/
|
72
|
+
response << self.headers.map{|k,v| "#{k}: #{v}" }*::Maveric::EOL
|
73
|
+
response << ::Maveric::EOL*2 + self.body
|
70
74
|
end
|
71
75
|
|
72
|
-
alias_method :old_init, :initialize
|
73
76
|
##
|
74
77
|
# After a bit of experimenting with Exception and raise I determined a fun
|
75
78
|
# and simple way to generate fast HTTP response error thingies. As long as
|
@@ -103,6 +106,6 @@ class StandardError
|
|
103
106
|
@body << "\n\n#{data.compact.map{|e|e.inspect}*"\n"}" unless data.empty?
|
104
107
|
data = msg
|
105
108
|
end
|
106
|
-
|
109
|
+
super data
|
107
110
|
end
|
108
111
|
end
|
data/lib/maveric/fastcgi.rb
CHANGED
@@ -1,14 +1,18 @@
|
|
1
1
|
%w~fcgi~.each{|m|require m}
|
2
|
-
|
3
|
-
class Maveric
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
req.
|
2
|
+
##
|
3
|
+
# Opening arguments are a Maveric class and options. Plz, don't pass a Maveric
|
4
|
+
# instance. The options of +opts+ are passed to the Maveric on instantiation.
|
5
|
+
#
|
6
|
+
# Maveric::FCGI(MyMaveric.new)
|
7
|
+
def Maveric.FCGI maveric, opts={}
|
8
|
+
::FCGI.each do |req|
|
9
|
+
req.out << "Status: 200 OK" + ::Maveric::EOL*2 if $DEBUG
|
10
|
+
req.out << response = begin
|
11
|
+
maveric.dispatch(req.in, req.env).to_http
|
12
|
+
rescue
|
13
|
+
"Status: 500 Server Error omgwtf!"+::Maveric::EOL*2+
|
14
|
+
"#{$!}\n#{$!.backtrace*"\n"}"
|
12
15
|
end
|
16
|
+
req.finish
|
13
17
|
end
|
14
18
|
end
|
data/lib/maveric/mongrel.rb
CHANGED
@@ -1,44 +1,24 @@
|
|
1
1
|
%w~mongrel~.each{|m|require m}
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
@request_notify = true
|
9
|
-
@maveric = maveric.new opts
|
10
|
-
end
|
3
|
+
##
|
4
|
+
# Includes Mongrel::HttpHandlerPlugin into Maveric, allowing the use of Maveric
|
5
|
+
# subclasses as HttpHandlers in the context of Mongrel.
|
6
|
+
class Maveric
|
7
|
+
include Mongrel::HttpHandlerPlugin
|
11
8
|
|
12
9
|
##
|
13
|
-
#
|
10
|
+
# Runs #dispatch on the request and filters the resulting Controller instance
|
11
|
+
# to the +response+ object.
|
14
12
|
def process request, response
|
15
|
-
|
16
|
-
reply = @maveric.process request.body, request.params
|
17
|
-
# output the result
|
13
|
+
reply = dispatch request.body, request.params
|
18
14
|
response.start reply.status do |head,out|
|
19
15
|
reply.headers.each {|k,v| head[k] = v }
|
20
16
|
out.write reply.body
|
21
17
|
end
|
22
18
|
end
|
23
19
|
|
24
|
-
##
|
20
|
+
## Runs #prepare_enviroment on the env to get things moving.
|
25
21
|
def request_begins params
|
26
|
-
|
27
|
-
Maveric.log.info "Mongrel+#{self.class}#request_begins"
|
28
|
-
@maveric.prepare_environment params
|
29
|
-
rescue
|
30
|
-
Maveric.log.fatal "#{$!.inspect}\n#{$@[0..5]*"\n"}"
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
## Does nothing yet. Yet.
|
35
|
-
def request_progess params, clen, total
|
36
|
-
begin
|
37
|
-
Maveric.log.info "Mongrel+#{self.class}#request_progess"+
|
38
|
-
": #{clen}/#{total}"
|
39
|
-
Maveric.log.debug params
|
40
|
-
rescue
|
41
|
-
Maveric.log.fatal "#{$!.inspect}\n#{$@[0..5]*"\n"}"
|
42
|
-
end
|
22
|
+
prepare_environment params
|
43
23
|
end
|
44
24
|
end
|
data/lib/maveric/sessions.rb
CHANGED
@@ -4,7 +4,10 @@ class Maveric
|
|
4
4
|
##
|
5
5
|
# Contains session data and provides conveniance in generating an appropriate
|
6
6
|
# cookie.
|
7
|
-
|
7
|
+
#
|
8
|
+
# This is a simple session implementation. Data is kept in a self maintaining
|
9
|
+
# Set persisting in memory. Noot good if yoou're dealing with oodles of sets.
|
10
|
+
class SimpleSessions < Set
|
8
11
|
COOKIE_NAME = 'SESSIONID'
|
9
12
|
|
10
13
|
##
|
@@ -12,17 +15,18 @@ class Maveric
|
|
12
15
|
# a hex number. (num.to_s(16) If id is not found a new Session is created
|
13
16
|
# and its Session#id is returned.
|
14
17
|
def session id #wants stringed hex num
|
15
|
-
::Maveric.type_check :id, id, String
|
16
18
|
|
17
19
|
#ensure crusty old sessions don't linger
|
18
|
-
@__i
|
19
|
-
|
20
|
+
@__i = 0 unless defined? @__i
|
21
|
+
@__i += 1
|
22
|
+
reject!{|s| s.expires < Time.now-3 } if (@__i%=10) == 0 # 3 second grace
|
20
23
|
|
21
|
-
# now get the session
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
if id # now get the session if we have something to search for
|
25
|
+
session = find{|s| id.casecmp(s.id)==0 }
|
26
|
+
else # there isn't one? then make a new one!
|
27
|
+
add session=Session.new
|
28
|
+
end
|
29
|
+
return session
|
26
30
|
end
|
27
31
|
|
28
32
|
##
|
@@ -33,10 +37,8 @@ class Maveric
|
|
33
37
|
DURATION = 15*60
|
34
38
|
## The default session length is 15 minutes. Simple to change.
|
35
39
|
def initialize duration=DURATION
|
36
|
-
::Maveric.type_check :duration, duration, Integer
|
37
40
|
@duration, @data = duration, {}
|
38
41
|
touch
|
39
|
-
::Maveric.log.debug self
|
40
42
|
end
|
41
43
|
|
42
44
|
attr_reader :expires, :data, :duration
|
@@ -63,7 +65,7 @@ class Maveric
|
|
63
65
|
## Perhaps better named as #to_cookie for clarity?
|
64
66
|
def to_s env=nil
|
65
67
|
touch
|
66
|
-
c = "#{::Maveric::
|
68
|
+
c = "#{::Maveric::SimpleSessions::COOKIE_NAME}=#{id}" #required
|
67
69
|
c << "; expires=#{expires.httpdate}"
|
68
70
|
return c unless env
|
69
71
|
c << "; domain=#{env['SERVER_NAME']};"
|
@@ -75,7 +77,7 @@ class Maveric
|
|
75
77
|
end
|
76
78
|
end
|
77
79
|
|
78
|
-
@sessions =
|
80
|
+
@sessions = SimpleSessions.new
|
79
81
|
|
80
82
|
## Return the standard session set.
|
81
83
|
def self.sessions
|
@@ -88,18 +90,19 @@ class Maveric
|
|
88
90
|
end
|
89
91
|
|
90
92
|
##
|
91
|
-
# Uses env[:
|
93
|
+
# Uses env[:cookies] to find the session_id, and retrives the data to set the
|
92
94
|
# values or env[:session].
|
93
95
|
def set_session env
|
94
|
-
session_id = env[:cookies][::Maveric::
|
96
|
+
session_id = env[:cookies][::Maveric::SimpleSessions::COOKIE_NAME].first
|
95
97
|
env[:session] = ::Maveric.session session_id
|
96
98
|
end
|
97
99
|
|
98
|
-
|
100
|
+
prepare_env :set_session
|
99
101
|
|
100
102
|
class Controller
|
101
103
|
## Touches the session and includes it into the http headers.
|
102
104
|
def session_cleanup controller
|
105
|
+
return unless @env[:session]
|
103
106
|
@env[:session].touch
|
104
107
|
@headers['Set-Cookie'] = [@env[:session].to_s(@env)]
|
105
108
|
end
|
data/lib/maveric/webrick.rb
CHANGED
@@ -8,7 +8,6 @@ class Maveric::WEBrickServlet < WEBrick::HTTPServlet::AbstractServlet
|
|
8
8
|
# initialization. The Maveric (not an instance) is expected as the first
|
9
9
|
# option.
|
10
10
|
def initialize server, maveric, *opts
|
11
|
-
::Maveric.type_check :maveric, maveric do |k| k <= ::Maveric end
|
12
11
|
@maveric = maveric.new *@options
|
13
12
|
super server, *opts
|
14
13
|
end
|
@@ -16,8 +15,6 @@ class Maveric::WEBrickServlet < WEBrick::HTTPServlet::AbstractServlet
|
|
16
15
|
## We don't need no stinkin' do_* methods.
|
17
16
|
def service req, res
|
18
17
|
begin
|
19
|
-
::Maveric.log.warn req.inspect
|
20
|
-
req_body = StringIO.new(req.body || '')
|
21
18
|
env = req.meta_vars
|
22
19
|
env['REQUEST_URI'] = req.unparsed_uri
|
23
20
|
result = @maveric.dispatch req_body, env, req
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.2
|
3
3
|
specification_version: 1
|
4
4
|
name: maveric
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.4.0
|
7
|
+
date: 2007-02-13 00:00:00 -08:00
|
8
8
|
summary: A simple, non-magical, framework.
|
9
9
|
require_paths:
|
10
10
|
- lib/
|
@@ -30,11 +30,11 @@ authors:
|
|
30
30
|
- blink
|
31
31
|
files:
|
32
32
|
- lib/maveric.rb
|
33
|
-
- lib/maveric/mongrel.rb
|
34
33
|
- lib/maveric/fastcgi.rb
|
34
|
+
- lib/maveric/extensions.rb
|
35
35
|
- lib/maveric/webrick.rb
|
36
|
+
- lib/maveric/mongrel.rb
|
36
37
|
- lib/maveric/sessions.rb
|
37
|
-
- lib/maveric/extensions.rb
|
38
38
|
test_files: []
|
39
39
|
|
40
40
|
rdoc_options: []
|
@@ -47,13 +47,5 @@ extensions: []
|
|
47
47
|
|
48
48
|
requirements: []
|
49
49
|
|
50
|
-
dependencies:
|
51
|
-
|
52
|
-
name: log4r
|
53
|
-
version_requirement:
|
54
|
-
version_requirements: !ruby/object:Gem::Version::Requirement
|
55
|
-
requirements:
|
56
|
-
- - ">"
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
version: 0.0.0
|
59
|
-
version:
|
50
|
+
dependencies: []
|
51
|
+
|