picnic 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|