picnic 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +10 -0
- data/Manifest.txt +30 -13
- data/Rakefile +2 -0
- data/lib/picnic.rb +5 -120
- data/lib/picnic/authentication.rb +40 -4
- data/lib/picnic/cli.rb +86 -43
- data/lib/picnic/conf.rb +45 -43
- data/lib/picnic/logger.rb +41 -0
- data/lib/picnic/server.rb +99 -0
- data/lib/picnic/version.rb +2 -2
- data/picnic.gemspec +44 -0
- data/vendor/{camping-1.5.180 → camping-2.0.20090212}/CHANGELOG +17 -10
- data/vendor/{camping-1.5.180 → camping-2.0.20090212}/COPYING +0 -0
- data/vendor/{camping-1.5.180 → camping-2.0.20090212}/README +2 -2
- data/vendor/{camping-1.5.180 → camping-2.0.20090212}/Rakefile +62 -5
- data/vendor/camping-2.0.20090212/bin/camping +99 -0
- data/vendor/camping-2.0.20090212/doc/camping.1.gz +0 -0
- data/vendor/camping-2.0.20090212/examples/README +5 -0
- data/vendor/camping-2.0.20090212/examples/blog.rb +375 -0
- data/vendor/camping-2.0.20090212/examples/campsh.rb +629 -0
- data/vendor/camping-2.0.20090212/examples/tepee.rb +242 -0
- data/vendor/camping-2.0.20090212/extras/Camping.gif +0 -0
- data/vendor/camping-2.0.20090212/extras/flipbook_rdoc.rb +491 -0
- data/vendor/camping-2.0.20090212/extras/permalink.gif +0 -0
- data/vendor/{camping-1.5.180 → camping-2.0.20090212}/lib/camping-unabridged.rb +168 -294
- data/vendor/camping-2.0.20090212/lib/camping.rb +54 -0
- data/vendor/{camping-1.5.180/lib/camping/db.rb → camping-2.0.20090212/lib/camping/ar.rb} +4 -4
- data/vendor/{camping-1.5.180/lib/camping → camping-2.0.20090212/lib/camping/ar}/session.rb +23 -14
- data/vendor/camping-2.0.20090212/lib/camping/mab.rb +26 -0
- data/vendor/camping-2.0.20090212/lib/camping/reloader.rb +163 -0
- data/vendor/camping-2.0.20090212/lib/camping/server.rb +158 -0
- data/vendor/camping-2.0.20090212/lib/camping/session.rb +74 -0
- data/vendor/camping-2.0.20090212/setup.rb +1551 -0
- data/vendor/camping-2.0.20090212/test/apps/env_debug.rb +65 -0
- data/vendor/camping-2.0.20090212/test/apps/forms.rb +95 -0
- data/vendor/camping-2.0.20090212/test/apps/misc.rb +86 -0
- data/vendor/camping-2.0.20090212/test/apps/sessions.rb +38 -0
- data/vendor/camping-2.0.20090212/test/test_camping.rb +54 -0
- metadata +43 -16
- data/lib/picnic/postambles.rb +0 -292
- data/lib/picnic/utils.rb +0 -36
- data/vendor/camping-1.5.180/lib/camping.rb +0 -57
- data/vendor/camping-1.5.180/lib/camping/fastcgi.rb +0 -244
- data/vendor/camping-1.5.180/lib/camping/reloader.rb +0 -163
- data/vendor/camping-1.5.180/lib/camping/webrick.rb +0 -65
@@ -0,0 +1,65 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
begin require "rubygems" rescue LoadError end
|
4
|
+
require "camping"
|
5
|
+
|
6
|
+
Camping.goes :EnvDebug
|
7
|
+
|
8
|
+
module EnvDebug
|
9
|
+
module Controllers
|
10
|
+
class ShowEnv < R '/', '/(.*)'
|
11
|
+
def get(extra = nil)
|
12
|
+
@extra = extra
|
13
|
+
render :show_env
|
14
|
+
end
|
15
|
+
alias post get
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module Views
|
20
|
+
def layout
|
21
|
+
html do
|
22
|
+
head{ title C }
|
23
|
+
body do
|
24
|
+
ul do
|
25
|
+
li{ a "show env", :href=>R(ShowEnv)}
|
26
|
+
end
|
27
|
+
p { yield }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def _print_hash(hash)
|
33
|
+
hash.keys.sort.each do |key|
|
34
|
+
value = hash[key]
|
35
|
+
pre "%30s: %s" % [key.inspect, value.inspect]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def show_env
|
40
|
+
b "extra: #{@extra.inspect}"
|
41
|
+
h2 "@status : #{@status.inspect}"
|
42
|
+
h2 "@method : #{@method.inspect}"
|
43
|
+
h2 "@root : #{@root.inspect}"
|
44
|
+
h2 "@env :"
|
45
|
+
_print_hash @env
|
46
|
+
h2 "@input : "
|
47
|
+
_print_hash @input
|
48
|
+
h2 "@headers :"
|
49
|
+
_print_hash @headers
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# For CGI
|
56
|
+
if $0 == __FILE__
|
57
|
+
EnvDebug.create if EnvDebug.respond_to? :create
|
58
|
+
if ARGV.any?
|
59
|
+
require 'camping/fastcgi'
|
60
|
+
#Dir.chdir('/var/camping/blog/')
|
61
|
+
Camping::FastCGI.start(EnvDebug)
|
62
|
+
else
|
63
|
+
puts EnvDebug.run
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require "camping"
|
2
|
+
|
3
|
+
Camping.goes :Forms
|
4
|
+
|
5
|
+
module Forms
|
6
|
+
module Controllers
|
7
|
+
class Index < R '/'
|
8
|
+
def get; render :index end
|
9
|
+
end
|
10
|
+
class GetForm
|
11
|
+
def get; render :get_form; end
|
12
|
+
end
|
13
|
+
class GetFormResult
|
14
|
+
def get; render :form_result; end
|
15
|
+
end
|
16
|
+
class PostForm
|
17
|
+
def get; render :post_form; end
|
18
|
+
def post; render :form_result; end
|
19
|
+
end
|
20
|
+
class FileForm
|
21
|
+
def get; render :file_form; end
|
22
|
+
def post; render :form_result; end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
module Views
|
27
|
+
def layout
|
28
|
+
html do
|
29
|
+
head{ title C }
|
30
|
+
body do
|
31
|
+
ul do
|
32
|
+
li{ a "index", :href=>R(Index)}
|
33
|
+
li{ a "get form", :href=>R(GetForm)}
|
34
|
+
li{ a "post form", :href=>R(PostForm)}
|
35
|
+
li{ a "file form", :href=>R(FileForm)}
|
36
|
+
end
|
37
|
+
p { yield }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def form_result
|
43
|
+
p @input.inspect
|
44
|
+
end
|
45
|
+
|
46
|
+
def index
|
47
|
+
h1 "Welcome on the Camping test app"
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_form
|
51
|
+
form :action=>R(GetFormResult), :method=>:get do
|
52
|
+
label "Give me your name!", :for=>:name
|
53
|
+
input :type=>:text, :name=>:name; br
|
54
|
+
input :type=>:text, :name=>"arr[]"; br
|
55
|
+
input :type=>:text, :name=>"arr[]"; br
|
56
|
+
input :type=>:text, :name=>"hash[x]"; br
|
57
|
+
input :type=>:text, :name=>"hash[y]"; br
|
58
|
+
|
59
|
+
input :type=>:submit
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def post_form
|
64
|
+
form :action=>R(PostForm), :method=>:post do
|
65
|
+
label "Give me your name!", :for=>:name
|
66
|
+
input :type=>:text, :name=>:name; br
|
67
|
+
input :type=>:text, :name=>"arr[]"; br
|
68
|
+
input :type=>:text, :name=>"arr[]"; br
|
69
|
+
input :type=>:text, :name=>"hash[x]"; br
|
70
|
+
input :type=>:text, :name=>"hash[y]"; br
|
71
|
+
|
72
|
+
input :type=>:submit
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def file_form
|
77
|
+
form :action=>R(FileForm), :method=>:post, :enctype=>"multipart/form-data" do
|
78
|
+
input :type=>:text, :name=>"arr"
|
79
|
+
input :type=>:text, :name=>"arr"; br
|
80
|
+
input :type=>:file, :name=>"first_file"; br
|
81
|
+
input :type=>:file, :name=>"files[]"; br
|
82
|
+
input :type=>:file, :name=>"files[]"; br
|
83
|
+
input :type=>:submit
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# For CGI
|
92
|
+
if $0 == __FILE__
|
93
|
+
Forms.create
|
94
|
+
Forms.run
|
95
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require "camping"
|
2
|
+
|
3
|
+
Camping.goes :Misc
|
4
|
+
|
5
|
+
module Misc
|
6
|
+
module Controllers
|
7
|
+
class Index < R '/'
|
8
|
+
def get; render :index end
|
9
|
+
end
|
10
|
+
class RenderPartial
|
11
|
+
def get; render :_partial; end
|
12
|
+
end
|
13
|
+
class Xsendfile
|
14
|
+
def get
|
15
|
+
@headers["X-Sendfile"] = File.expand_path(__FILE__)
|
16
|
+
"You shouldn't get this text"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
class Links < R '/links', '/links/(\w+)/with/(\d+)/args'
|
20
|
+
def get(*args); render :links; end
|
21
|
+
end
|
22
|
+
class Redirect
|
23
|
+
def get; redirect(RR) end
|
24
|
+
end
|
25
|
+
class RR
|
26
|
+
def get; render :rr; end
|
27
|
+
end
|
28
|
+
class BadLinks
|
29
|
+
def get; render :bad_links; end
|
30
|
+
end
|
31
|
+
class BadMethod; end
|
32
|
+
end
|
33
|
+
|
34
|
+
module Views
|
35
|
+
def layout
|
36
|
+
html do
|
37
|
+
head{ title C }
|
38
|
+
body do
|
39
|
+
ul do
|
40
|
+
li{ a "index", :href=>R(Index)}
|
41
|
+
li{ a "render partial", :href=>R(RenderPartial)}
|
42
|
+
li{ a "X-Sendfile", :href=>R(Xsendfile)}
|
43
|
+
li{ a "Links", :href=>R(Links)}
|
44
|
+
li{ a "BadLinks", :href=>R(BadLinks)}
|
45
|
+
li{ a "Redirect", :href=>R(Redirect)}
|
46
|
+
li{ a "BadMethod", :href=>R(BadMethod)}
|
47
|
+
end
|
48
|
+
p { yield }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def _partial
|
54
|
+
a "go back to index", :href=>R(Index)
|
55
|
+
end
|
56
|
+
|
57
|
+
def index
|
58
|
+
h1 "Welcome on the Camping test app"
|
59
|
+
end
|
60
|
+
|
61
|
+
def links
|
62
|
+
a "plain", :href=>R(Links); br
|
63
|
+
a "with args and hash", :href=>R(Links, "moo", 3, :with=>"Hash"); br
|
64
|
+
a "with args and mult. hash", :href=>R(Links, "hoi", 8, :with=>"multiple", 3=>"hash"); br
|
65
|
+
# TODO : with <AR::Base object
|
66
|
+
end
|
67
|
+
|
68
|
+
def bad_links
|
69
|
+
a "null controller", :href=>R(nil)
|
70
|
+
a "bad arity", :href=>R(RR, :moo)
|
71
|
+
a "bad args", :href=>R(Links, 3, "moo")
|
72
|
+
end
|
73
|
+
|
74
|
+
def rr
|
75
|
+
p "got redirected"
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# For CGI
|
83
|
+
if $0 == __FILE__
|
84
|
+
Misc.create
|
85
|
+
Misc.run
|
86
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "rubygems"
|
4
|
+
require "camping"
|
5
|
+
|
6
|
+
Camping.goes :Sessions
|
7
|
+
require 'camping/session'
|
8
|
+
|
9
|
+
module Sessions
|
10
|
+
include Camping::Session
|
11
|
+
module Controllers
|
12
|
+
class One < R('/')
|
13
|
+
def get
|
14
|
+
@state = C::H['one',rand(100)]
|
15
|
+
puts "1:" + @state.inspect
|
16
|
+
redirect R(Two)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Two < R('/steptwo')
|
21
|
+
def get
|
22
|
+
@state['two'] = "This is in two"
|
23
|
+
puts "2:" + @state.inspect
|
24
|
+
redirect R(Three)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class Three < R('/stepthree')
|
29
|
+
def get
|
30
|
+
@state['three'] = "This is in three"
|
31
|
+
puts "3:" + @state.inspect
|
32
|
+
return "Accumulated state across redirects: #{@state.inspect}"
|
33
|
+
redirect R(Three)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
$:.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')))
|
3
|
+
require "camping"
|
4
|
+
|
5
|
+
class Test_Camping_class_methods < Test::Unit::TestCase
|
6
|
+
def test_escape_from_the_doc
|
7
|
+
assert_equal "I%27d+go+to+the+museum+straightway%21", Camping.escape("I'd go to the museum straightway!")
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_utf8_escape
|
11
|
+
assert_equal "%E6%97%A5%E6%9C%AC%E5%9B%BD", Camping.escape("\346\227\245\346\234\254\345\233\275")
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_unescape_from_the_doc
|
15
|
+
assert_equal "I'd go to the museum straightway!", Camping.un("I%27d+go+to+the+museum+straightway%21")
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_utf8_unescape
|
19
|
+
assert_equal "\346\227\245\346\234\254\345\233\275", Camping.un("%E6%97%A5%E6%9C%AC%E5%9B%BD")
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_qsp_from_the_doc
|
23
|
+
input = Camping.qsp("name=Philarp+Tremain&hair=sandy+blonde")
|
24
|
+
assert_equal "Philarp Tremain", input.name
|
25
|
+
assert_equal "sandy blonde", input.hair
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_qsp_with_array
|
29
|
+
input = Camping.qsp("users[]=why&users[]=rambo")
|
30
|
+
assert_equal ["why", "rambo"], input.users
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_qsp_with_hash
|
34
|
+
input = Camping.qsp("post[id]=1&post[user]=_why")
|
35
|
+
hash = {'post' => {'id' => '1', 'user' => '_why'}}
|
36
|
+
assert_equal hash, input
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_qsp_malformed1
|
40
|
+
input = Camping.qsp("name=Philarp+Tremain&&hair=sandy+blonde")
|
41
|
+
assert_equal "Philarp Tremain", input.name
|
42
|
+
assert_equal "sandy blonde", input.hair
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_qsp_malformed2
|
46
|
+
input = Camping.qsp("morta==del")
|
47
|
+
assert_equal "=del", input.morta
|
48
|
+
end
|
49
|
+
|
50
|
+
# TODO : Test Camping.kp
|
51
|
+
# TODO : Test Camping.run
|
52
|
+
|
53
|
+
end
|
54
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: picnic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Zukowski
|
@@ -9,9 +9,19 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-03-18 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rack
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
15
25
|
- !ruby/object:Gem::Dependency
|
16
26
|
name: markaby
|
17
27
|
type: :runtime
|
@@ -40,7 +50,7 @@ dependencies:
|
|
40
50
|
requirements:
|
41
51
|
- - ">="
|
42
52
|
- !ruby/object:Gem::Version
|
43
|
-
version: 1.
|
53
|
+
version: 1.8.2
|
44
54
|
version:
|
45
55
|
description: Camping for sissies
|
46
56
|
email: matt@roughest.net
|
@@ -66,24 +76,41 @@ files:
|
|
66
76
|
- lib/picnic/cli.rb
|
67
77
|
- lib/picnic/conf.rb
|
68
78
|
- lib/picnic/controllers.rb
|
69
|
-
- lib/picnic/
|
79
|
+
- lib/picnic/logger.rb
|
80
|
+
- lib/picnic/server.rb
|
70
81
|
- lib/picnic/service_control.rb
|
71
|
-
- lib/picnic/utils.rb
|
72
82
|
- lib/picnic/version.rb
|
83
|
+
- picnic.gemspec
|
73
84
|
- setup.rb
|
74
85
|
- test/picnic_test.rb
|
75
86
|
- test/test_helper.rb
|
76
|
-
- vendor/camping-
|
77
|
-
- vendor/camping-
|
78
|
-
- vendor/camping-
|
79
|
-
- vendor/camping-
|
80
|
-
- vendor/camping-
|
81
|
-
- vendor/camping-
|
82
|
-
- vendor/camping-
|
83
|
-
- vendor/camping-
|
84
|
-
- vendor/camping-
|
85
|
-
- vendor/camping-
|
86
|
-
- vendor/camping-
|
87
|
+
- vendor/camping-2.0.20090212/CHANGELOG
|
88
|
+
- vendor/camping-2.0.20090212/COPYING
|
89
|
+
- vendor/camping-2.0.20090212/README
|
90
|
+
- vendor/camping-2.0.20090212/Rakefile
|
91
|
+
- vendor/camping-2.0.20090212/bin/camping
|
92
|
+
- vendor/camping-2.0.20090212/doc/camping.1.gz
|
93
|
+
- vendor/camping-2.0.20090212/examples/README
|
94
|
+
- vendor/camping-2.0.20090212/examples/blog.rb
|
95
|
+
- vendor/camping-2.0.20090212/examples/campsh.rb
|
96
|
+
- vendor/camping-2.0.20090212/examples/tepee.rb
|
97
|
+
- vendor/camping-2.0.20090212/extras/Camping.gif
|
98
|
+
- vendor/camping-2.0.20090212/extras/flipbook_rdoc.rb
|
99
|
+
- vendor/camping-2.0.20090212/extras/permalink.gif
|
100
|
+
- vendor/camping-2.0.20090212/lib/camping-unabridged.rb
|
101
|
+
- vendor/camping-2.0.20090212/lib/camping.rb
|
102
|
+
- vendor/camping-2.0.20090212/lib/camping/ar.rb
|
103
|
+
- vendor/camping-2.0.20090212/lib/camping/ar/session.rb
|
104
|
+
- vendor/camping-2.0.20090212/lib/camping/mab.rb
|
105
|
+
- vendor/camping-2.0.20090212/lib/camping/reloader.rb
|
106
|
+
- vendor/camping-2.0.20090212/lib/camping/server.rb
|
107
|
+
- vendor/camping-2.0.20090212/lib/camping/session.rb
|
108
|
+
- vendor/camping-2.0.20090212/setup.rb
|
109
|
+
- vendor/camping-2.0.20090212/test/apps/env_debug.rb
|
110
|
+
- vendor/camping-2.0.20090212/test/apps/forms.rb
|
111
|
+
- vendor/camping-2.0.20090212/test/apps/misc.rb
|
112
|
+
- vendor/camping-2.0.20090212/test/apps/sessions.rb
|
113
|
+
- vendor/camping-2.0.20090212/test/test_camping.rb
|
87
114
|
has_rdoc: true
|
88
115
|
homepage: http://picnic.rubyforge.org
|
89
116
|
post_install_message:
|
data/lib/picnic/postambles.rb
DELETED
@@ -1,292 +0,0 @@
|
|
1
|
-
module Picnic
|
2
|
-
# In Camping, "postambles" are wrappers used to make your application run under
|
3
|
-
# some given web server. They are called "postambles" because traditionally this
|
4
|
-
# was a piece of code included at the bottom of your Camping script. Picnic
|
5
|
-
# provides postambles for two popular Ruby-based web servers: webrick and mongrel.
|
6
|
-
# These postambles take care of all the complications of launching and managing
|
7
|
-
# the web server for you.
|
8
|
-
module Postambles
|
9
|
-
|
10
|
-
# Launches your Camping application using a webrick server.
|
11
|
-
#
|
12
|
-
# It is possible to run using SSL by providing an <tt>:ssl_cert</tt> path in your
|
13
|
-
# app's configuration file, pointing to a valid SSL certificate file.
|
14
|
-
#
|
15
|
-
# If $DAEMONIZE is true, the webrick server will be forked to a background process.
|
16
|
-
# Note that this may have some strange effects, since any open IOs or threads will not
|
17
|
-
# be carried over to the forked daemon process.
|
18
|
-
#
|
19
|
-
# Module#start_picnic automatically calls this method to launch your Picnic app if
|
20
|
-
# your app's <tt>:server</tt> configuration option is set to <tt>'webrick'</tt>.
|
21
|
-
#
|
22
|
-
# Usage example:
|
23
|
-
#
|
24
|
-
# require 'picnic/postambles'
|
25
|
-
# self.extend self::Postambles
|
26
|
-
# webrick
|
27
|
-
#
|
28
|
-
def webrick
|
29
|
-
require 'webrick/httpserver'
|
30
|
-
require 'webrick/https'
|
31
|
-
require 'camping/webrick'
|
32
|
-
|
33
|
-
# TODO: verify the certificate's validity
|
34
|
-
# example of how to do this is here: http://pablotron.org/download/ruri-20050331.rb
|
35
|
-
|
36
|
-
cert_path = Picnic::Conf.ssl_cert
|
37
|
-
key_path = Picnic::Conf.ssl_key || Picnic::Conf.ssl_cert
|
38
|
-
# look for the key in the ssl_cert if no ssl_key is specified
|
39
|
-
|
40
|
-
webrick_options = {
|
41
|
-
:BindAddress => Picnic::Conf.bind_address || "0.0.0.0",
|
42
|
-
:Port => Picnic::Conf.port
|
43
|
-
}
|
44
|
-
|
45
|
-
unless cert_path.nil? && key_path.nil?
|
46
|
-
raise "The specified certificate file #{cert_path.inspect} does not exist. " +
|
47
|
-
" Your 'ssl_cert' configuration setting must be a path to a valid " +
|
48
|
-
" ssl certificate." unless
|
49
|
-
File.exists? cert_path
|
50
|
-
|
51
|
-
raise "The specified key file #{key_path.inspect} does not exist. " +
|
52
|
-
" Your 'ssl_key' configuration setting must be a path to a valid " +
|
53
|
-
" ssl private key." unless
|
54
|
-
File.exists? key_path
|
55
|
-
|
56
|
-
require 'openssl'
|
57
|
-
|
58
|
-
cert = OpenSSL::X509::Certificate.new(File.read(cert_path))
|
59
|
-
key = OpenSSL::PKey::RSA.new(File.read(key_path))
|
60
|
-
|
61
|
-
webrick_options[:SSLEnable] = true
|
62
|
-
webrick_options[:SSLVerifyClient] = ::OpenSSL::SSL::VERIFY_NONE
|
63
|
-
webrick_options[:SSLCertificate] = cert
|
64
|
-
webrick_options[:SSLPrivateKey] = key
|
65
|
-
end
|
66
|
-
|
67
|
-
begin
|
68
|
-
s = WEBrick::HTTPServer.new(webrick_options)
|
69
|
-
rescue Errno::EACCES
|
70
|
-
puts "\nThe server could not launch. Are you running on a privileged port? (e.g. port 443) If so, you must run the server as root."
|
71
|
-
exit 2
|
72
|
-
end
|
73
|
-
|
74
|
-
self.create
|
75
|
-
s.mount "#{Picnic::Conf.uri_path}", WEBrick::CampingHandler, self
|
76
|
-
|
77
|
-
public_dirs = Picnic::Conf.public_dirs || Picnic::Conf.public_dir
|
78
|
-
if public_dirs
|
79
|
-
public_dirs = [public_dirs] unless public_dirs.kind_of? Array
|
80
|
-
|
81
|
-
public_dirs.each do |d|
|
82
|
-
dir = d[:dir]
|
83
|
-
path = "#{Picnic::Conf.uri_path}/#{d[:path]}".gsub(/\/\/+/,'/')
|
84
|
-
$LOG.debug("Mounting public directory #{dir.inspect} to path #{path.inspect}.")
|
85
|
-
s.mount(path, WEBrick::HTTPServlet::FileHandler, dir)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
# This lets Ctrl+C shut down your server
|
90
|
-
trap(:INT) do
|
91
|
-
s.shutdown
|
92
|
-
end
|
93
|
-
trap(:TERM) do
|
94
|
-
s.shutdown
|
95
|
-
end
|
96
|
-
|
97
|
-
server_url = "http#{webrick_options[:SSLEnable] ? 's' : ''}://#{ENV['HOSTNAME'] || 'localhost'}:#{Picnic::Conf.port}#{Picnic::Conf.uri_path}"
|
98
|
-
|
99
|
-
if $DAEMONIZE
|
100
|
-
puts "\n** #{self} will run at #{server_url} and log to #{Picnic::Conf.log[:file].inspect}. "
|
101
|
-
puts "** Check the log file for further messages!\n\n"
|
102
|
-
|
103
|
-
logdev = $LOG.instance_variable_get(:@logdev).instance_variable_get(:@filename)
|
104
|
-
if logdev == 'STDOUT' || logdev == nil
|
105
|
-
puts "\n!!! Warning !!!\nLogging to the console (STDOUT) is not possible once the server daemonizes. "+
|
106
|
-
"You should change the logger configuration to point to a real file."
|
107
|
-
end
|
108
|
-
|
109
|
-
WEBrick::Daemon.start do
|
110
|
-
begin
|
111
|
-
#self.init_db_logger
|
112
|
-
write_pid_file if $PID_FILE
|
113
|
-
$LOG.info "Starting #{self} as a WEBrick daemon with process id #{Process.pid}."
|
114
|
-
self.prestart if self.respond_to? :prestart
|
115
|
-
s.start
|
116
|
-
$LOG.info "Stopping #{self} WEBrick daemon with process id #{Process.pid}."
|
117
|
-
clear_pid_file
|
118
|
-
rescue => e
|
119
|
-
$LOG.error e
|
120
|
-
raise e
|
121
|
-
end
|
122
|
-
end
|
123
|
-
else
|
124
|
-
puts "\n** #{self} is running at #{server_url} and logging to #{Picnic::Conf.log[:file].inspect}\n\n"
|
125
|
-
self.prestart if self.respond_to? :prestart
|
126
|
-
s.start
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
# Launches your Camping application using a mongrel server.
|
131
|
-
#
|
132
|
-
# Mongrel is much faster than webrick, but has two limitations:
|
133
|
-
# 1. You must install the mongrel gem before you can run your server using mongrel.
|
134
|
-
# This is not necessary with webrick, since webrick is included by default with Ruby.
|
135
|
-
# 2. Unlike webrick, mongrel can't be run using SSL. You will have to use a reverse
|
136
|
-
# proxy like Pound or Apache if you want to use mongrel with SSL.
|
137
|
-
#
|
138
|
-
# If $DAEMONIZE is true, the mongrel server will be forked to a background process.
|
139
|
-
# Note that this may have some strange effects, since any open IOs or threads will not
|
140
|
-
# be carried over to the forked daemon process.
|
141
|
-
#
|
142
|
-
# Module#start_picnic automatically calls this method to launch your Picnic app if
|
143
|
-
# your app's <tt>:server</tt> configuration option is set to <tt>'mongrel'</tt>.
|
144
|
-
#
|
145
|
-
# Usage example:
|
146
|
-
#
|
147
|
-
# require 'picnic/postambles'
|
148
|
-
# self.extend self::Postambles
|
149
|
-
# mongrel
|
150
|
-
#
|
151
|
-
def mongrel
|
152
|
-
require 'rubygems'
|
153
|
-
require 'mongrel/camping'
|
154
|
-
|
155
|
-
if $DAEMONIZE
|
156
|
-
# check if log and pid are writable before daemonizing, otherwise we won't be able to notify
|
157
|
-
# the user if we run into trouble later (since once daemonized, we can't write to stdout/stderr)
|
158
|
-
check_pid_writable if $PID_FILE
|
159
|
-
check_log_writable
|
160
|
-
end
|
161
|
-
|
162
|
-
self.create
|
163
|
-
|
164
|
-
puts "\n** #{self} is starting. Look in #{Picnic::Conf.log[:file].inspect} for further notices."
|
165
|
-
|
166
|
-
settings = {
|
167
|
-
:host => Picnic::Conf.bind_address || "0.0.0.0",
|
168
|
-
:log_file => Picnic::Conf.log[:file],
|
169
|
-
:cwd => $APP_PATH
|
170
|
-
}
|
171
|
-
|
172
|
-
begin
|
173
|
-
# need to close all IOs before daemonizing
|
174
|
-
$LOG.close if $DAEMONIZE
|
175
|
-
|
176
|
-
public_dirs = Picnic::Conf.public_dirs || Picnic::Conf.public_dir
|
177
|
-
public_dirs = [public_dirs] unless
|
178
|
-
public_dirs.kind_of? Array || public_dirs.nil?
|
179
|
-
|
180
|
-
begin
|
181
|
-
app_mod = self
|
182
|
-
mongrel = Mongrel::Configurator.new settings do
|
183
|
-
daemonize :log_file => Picnic::Conf.log[:file], :cwd => $APP_PATH if $DAEMONIZE
|
184
|
-
app_mod.init_logger
|
185
|
-
#app_mod.init_db_logger
|
186
|
-
listener :port => Picnic::Conf.port do
|
187
|
-
uri Picnic::Conf.uri_path, :handler => Mongrel::Camping::CampingHandler.new(app_mod)
|
188
|
-
|
189
|
-
if public_dirs
|
190
|
-
public_dirs.each do |d|
|
191
|
-
dir = d[:dir]
|
192
|
-
path = "#{Picnic::Conf.uri_path}/#{d[:path]}".gsub(/\/\/+/,'/')
|
193
|
-
$LOG.debug("Mounting public directory #{dir.inspect} to path #{path.inspect}.")
|
194
|
-
uri(path, :handler => Mongrel::DirHandler.new(dir))
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
setup_signals
|
199
|
-
end
|
200
|
-
end
|
201
|
-
rescue Errno::EADDRINUSE
|
202
|
-
exit 1
|
203
|
-
end
|
204
|
-
|
205
|
-
|
206
|
-
mongrel.run
|
207
|
-
|
208
|
-
if $DAEMONIZE && $PID_FILE
|
209
|
-
write_pid_file
|
210
|
-
unless File.exists? $PID_FILE
|
211
|
-
$LOG.error "#{self} could not start because pid file #{$PID_FILE.inspect} could not be created."
|
212
|
-
exit 1
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
puts "\n** #{self} is running at http://#{ENV['HOSTNAME'] || 'localhost'}:#{Picnic::Conf.port}#{Picnic::Conf.uri_path} and logging to '#{Picnic::Conf.log[:file]}'"
|
217
|
-
|
218
|
-
|
219
|
-
self.prestart if self.respond_to? :prestart
|
220
|
-
mongrel.join
|
221
|
-
|
222
|
-
clear_pid_file
|
223
|
-
|
224
|
-
if mongrel.needs_restart
|
225
|
-
$LOG.info "#{self} is restarting..."
|
226
|
-
puts "\n** #{self} is restarting..."
|
227
|
-
else
|
228
|
-
$LOG.info "#{self} is stopped."
|
229
|
-
puts "\n** #{self} is stopped (#{Time.now})"
|
230
|
-
end
|
231
|
-
|
232
|
-
end while mongrel.needs_restart
|
233
|
-
end
|
234
|
-
|
235
|
-
# Theoretically this should launch your Picnic app as a FastCGI process.
|
236
|
-
# I say "theoretically" because this has never actually been tested.
|
237
|
-
def fastcgi
|
238
|
-
require 'camping/fastcgi'
|
239
|
-
Dir.chdir('.')
|
240
|
-
|
241
|
-
self.create
|
242
|
-
Camping::FastCGI.start(self)
|
243
|
-
end
|
244
|
-
|
245
|
-
# Theoretically this should launch your Picnic app as a CGI process.
|
246
|
-
# I say "theoretically" because this has never actually been tested.
|
247
|
-
def cgi
|
248
|
-
self.create
|
249
|
-
puts self.run
|
250
|
-
end
|
251
|
-
|
252
|
-
private
|
253
|
-
# Prints an error message to stderr if the log file is not writable.
|
254
|
-
def check_log_writable
|
255
|
-
log_file = Picnic::Conf.log['file']
|
256
|
-
begin
|
257
|
-
f = open(log_file, 'a')
|
258
|
-
rescue
|
259
|
-
$stderr.puts "Couldn't write to log file at '#{log_file}' (#{$!})."
|
260
|
-
exit 1
|
261
|
-
end
|
262
|
-
f.close
|
263
|
-
end
|
264
|
-
|
265
|
-
# Prints an error message to stderr if the pid file is not writable.
|
266
|
-
def check_pid_writable
|
267
|
-
$LOG.debug "Checking if pid file #{$PID_FILE.inspect} is writable"
|
268
|
-
begin
|
269
|
-
f = open($PID_FILE, 'w')
|
270
|
-
rescue
|
271
|
-
$stderr.puts "Couldn't write to log at #{$PID_FILE.inspect} (#{$!})."
|
272
|
-
exit 1
|
273
|
-
end
|
274
|
-
f.close
|
275
|
-
end
|
276
|
-
|
277
|
-
# Writes the pid file.
|
278
|
-
def write_pid_file
|
279
|
-
$LOG.debug "Writing pid #{Process.pid.inspect} to pid file #{$PID_FILE.inspect}"
|
280
|
-
open($PID_FILE, "w") { |file| file.write(Process.pid) }
|
281
|
-
end
|
282
|
-
|
283
|
-
# Removes the pid file.
|
284
|
-
def clear_pid_file
|
285
|
-
if $PID_FILE && File.exists?($PID_FILE)
|
286
|
-
$LOG.debug "Clearing pid file #{$PID_FILE.inspect}"
|
287
|
-
File.unlink $PID_FILE
|
288
|
-
end
|
289
|
-
end
|
290
|
-
|
291
|
-
end
|
292
|
-
end
|