serverside 0.1.59
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +97 -0
- data/COPYING +18 -0
- data/README +51 -0
- data/Rakefile +92 -0
- data/bin/serverside +74 -0
- data/doc/rdoc/classes/Daemon.html +253 -0
- data/doc/rdoc/classes/Daemon/Base.html +146 -0
- data/doc/rdoc/classes/Daemon/Cluster.html +308 -0
- data/doc/rdoc/classes/Daemon/Cluster/PidFile.html +228 -0
- data/doc/rdoc/classes/Daemon/PidFile.html +178 -0
- data/doc/rdoc/classes/ServerSide.html +160 -0
- data/doc/rdoc/classes/ServerSide/Application.html +147 -0
- data/doc/rdoc/classes/ServerSide/Application/Base.html +196 -0
- data/doc/rdoc/classes/ServerSide/Application/Static.html +154 -0
- data/doc/rdoc/classes/ServerSide/Connection.html +128 -0
- data/doc/rdoc/classes/ServerSide/Connection/Base.html +343 -0
- data/doc/rdoc/classes/ServerSide/Connection/Const.html +229 -0
- data/doc/rdoc/classes/ServerSide/Connection/Static.html +172 -0
- data/doc/rdoc/classes/ServerSide/Server.html +162 -0
- data/doc/rdoc/classes/ServerSide/StaticFiles.html +208 -0
- data/doc/rdoc/classes/ServerSide/StaticFiles/Const.html +179 -0
- data/doc/rdoc/classes/String.html +210 -0
- data/doc/rdoc/classes/Symbol.html +156 -0
- data/doc/rdoc/created.rid +1 -0
- data/doc/rdoc/files/CHANGELOG.html +260 -0
- data/doc/rdoc/files/COPYING.html +129 -0
- data/doc/rdoc/files/README.html +171 -0
- data/doc/rdoc/files/lib/serverside/application_rb.html +109 -0
- data/doc/rdoc/files/lib/serverside/cluster_rb.html +101 -0
- data/doc/rdoc/files/lib/serverside/connection_rb.html +101 -0
- data/doc/rdoc/files/lib/serverside/core_ext_rb.html +107 -0
- data/doc/rdoc/files/lib/serverside/daemon_rb.html +108 -0
- data/doc/rdoc/files/lib/serverside/server_rb.html +108 -0
- data/doc/rdoc/files/lib/serverside/static_rb.html +101 -0
- data/doc/rdoc/files/lib/serverside_rb.html +131 -0
- data/doc/rdoc/fr_class_index.html +44 -0
- data/doc/rdoc/fr_file_index.html +37 -0
- data/doc/rdoc/fr_method_index.html +60 -0
- data/doc/rdoc/index.html +24 -0
- data/doc/rdoc/rdoc-style.css +208 -0
- data/lib/serverside.rb +13 -0
- data/lib/serverside/application.rb +40 -0
- data/lib/serverside/cluster.rb +72 -0
- data/lib/serverside/connection.rb +115 -0
- data/lib/serverside/core_ext.rb +27 -0
- data/lib/serverside/daemon.rb +67 -0
- data/lib/serverside/server.rb +18 -0
- data/lib/serverside/static.rb +96 -0
- data/test/functional/primitive_static_server_test.rb +37 -0
- data/test/functional/static_profile.rb +17 -0
- data/test/functional/static_rfuzz.rb +67 -0
- data/test/functional/static_server_test.rb +25 -0
- data/test/test_helper.rb +2 -0
- data/test/unit/application_test.rb +16 -0
- data/test/unit/cluster_test.rb +129 -0
- data/test/unit/connection_test.rb +193 -0
- data/test/unit/core_ext_test.rb +32 -0
- data/test/unit/daemon_test.rb +75 -0
- data/test/unit/server_test.rb +26 -0
- data/test/unit/static_test.rb +143 -0
- metadata +140 -0
@@ -0,0 +1,44 @@
|
|
1
|
+
|
2
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
3
|
+
<!DOCTYPE html
|
4
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
5
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
6
|
+
|
7
|
+
<!--
|
8
|
+
|
9
|
+
Classes
|
10
|
+
|
11
|
+
-->
|
12
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
13
|
+
<head>
|
14
|
+
<title>Classes</title>
|
15
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
16
|
+
<link rel="stylesheet" href="rdoc-style.css" type="text/css" />
|
17
|
+
<base target="docwin" />
|
18
|
+
</head>
|
19
|
+
<body>
|
20
|
+
<div id="index">
|
21
|
+
<h1 class="section-bar">Classes</h1>
|
22
|
+
<div id="index-entries">
|
23
|
+
<a href="classes/Daemon.html">Daemon</a><br />
|
24
|
+
<a href="classes/Daemon/Base.html">Daemon::Base</a><br />
|
25
|
+
<a href="classes/Daemon/Cluster.html">Daemon::Cluster</a><br />
|
26
|
+
<a href="classes/Daemon/Cluster/PidFile.html">Daemon::Cluster::PidFile</a><br />
|
27
|
+
<a href="classes/Daemon/PidFile.html">Daemon::PidFile</a><br />
|
28
|
+
<a href="classes/ServerSide.html">ServerSide</a><br />
|
29
|
+
<a href="classes/ServerSide/Application.html">ServerSide::Application</a><br />
|
30
|
+
<a href="classes/ServerSide/Application/Base.html">ServerSide::Application::Base</a><br />
|
31
|
+
<a href="classes/ServerSide/Application/Static.html">ServerSide::Application::Static</a><br />
|
32
|
+
<a href="classes/ServerSide/Connection.html">ServerSide::Connection</a><br />
|
33
|
+
<a href="classes/ServerSide/Connection/Base.html">ServerSide::Connection::Base</a><br />
|
34
|
+
<a href="classes/ServerSide/Connection/Const.html">ServerSide::Connection::Const</a><br />
|
35
|
+
<a href="classes/ServerSide/Connection/Static.html">ServerSide::Connection::Static</a><br />
|
36
|
+
<a href="classes/ServerSide/Server.html">ServerSide::Server</a><br />
|
37
|
+
<a href="classes/ServerSide/StaticFiles.html">ServerSide::StaticFiles</a><br />
|
38
|
+
<a href="classes/ServerSide/StaticFiles/Const.html">ServerSide::StaticFiles::Const</a><br />
|
39
|
+
<a href="classes/String.html">String</a><br />
|
40
|
+
<a href="classes/Symbol.html">Symbol</a><br />
|
41
|
+
</div>
|
42
|
+
</div>
|
43
|
+
</body>
|
44
|
+
</html>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
|
2
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
3
|
+
<!DOCTYPE html
|
4
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
5
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
6
|
+
|
7
|
+
<!--
|
8
|
+
|
9
|
+
Files
|
10
|
+
|
11
|
+
-->
|
12
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
13
|
+
<head>
|
14
|
+
<title>Files</title>
|
15
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
16
|
+
<link rel="stylesheet" href="rdoc-style.css" type="text/css" />
|
17
|
+
<base target="docwin" />
|
18
|
+
</head>
|
19
|
+
<body>
|
20
|
+
<div id="index">
|
21
|
+
<h1 class="section-bar">Files</h1>
|
22
|
+
<div id="index-entries">
|
23
|
+
<a href="files/CHANGELOG.html">CHANGELOG</a><br />
|
24
|
+
<a href="files/COPYING.html">COPYING</a><br />
|
25
|
+
<a href="files/README.html">README</a><br />
|
26
|
+
<a href="files/lib/serverside_rb.html">lib/serverside.rb</a><br />
|
27
|
+
<a href="files/lib/serverside/application_rb.html">lib/serverside/application.rb</a><br />
|
28
|
+
<a href="files/lib/serverside/cluster_rb.html">lib/serverside/cluster.rb</a><br />
|
29
|
+
<a href="files/lib/serverside/connection_rb.html">lib/serverside/connection.rb</a><br />
|
30
|
+
<a href="files/lib/serverside/core_ext_rb.html">lib/serverside/core_ext.rb</a><br />
|
31
|
+
<a href="files/lib/serverside/daemon_rb.html">lib/serverside/daemon.rb</a><br />
|
32
|
+
<a href="files/lib/serverside/server_rb.html">lib/serverside/server.rb</a><br />
|
33
|
+
<a href="files/lib/serverside/static_rb.html">lib/serverside/static.rb</a><br />
|
34
|
+
</div>
|
35
|
+
</div>
|
36
|
+
</body>
|
37
|
+
</html>
|
@@ -0,0 +1,60 @@
|
|
1
|
+
|
2
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
3
|
+
<!DOCTYPE html
|
4
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
5
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
6
|
+
|
7
|
+
<!--
|
8
|
+
|
9
|
+
Methods
|
10
|
+
|
11
|
+
-->
|
12
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
13
|
+
<head>
|
14
|
+
<title>Methods</title>
|
15
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
16
|
+
<link rel="stylesheet" href="rdoc-style.css" type="text/css" />
|
17
|
+
<base target="docwin" />
|
18
|
+
</head>
|
19
|
+
<body>
|
20
|
+
<div id="index">
|
21
|
+
<h1 class="section-bar">Methods</h1>
|
22
|
+
<div id="index-entries">
|
23
|
+
<a href="classes/String.html#M000004">/ (String)</a><br />
|
24
|
+
<a href="classes/ServerSide/Application/Base.html#M000024">configuration (ServerSide::Application::Base)</a><br />
|
25
|
+
<a href="classes/ServerSide/Application/Base.html#M000023">configure (ServerSide::Application::Base)</a><br />
|
26
|
+
<a href="classes/Daemon.html#M000005">control (Daemon)</a><br />
|
27
|
+
<a href="classes/Daemon/Cluster.html#M000014">daemon_loop (Daemon::Cluster)</a><br />
|
28
|
+
<a href="classes/ServerSide/Application.html#M000022">daemonize (ServerSide::Application)</a><br />
|
29
|
+
<a href="classes/ServerSide/Application/Static.html#M000026">daemonize (ServerSide::Application::Static)</a><br />
|
30
|
+
<a href="classes/Daemon/Cluster/PidFile.html#M000017">delete (Daemon::Cluster::PidFile)</a><br />
|
31
|
+
<a href="classes/Daemon/Cluster.html#M000011">fork_server (Daemon::Cluster)</a><br />
|
32
|
+
<a href="classes/ServerSide/Connection/Base.html#M000027">new (ServerSide::Connection::Base)</a><br />
|
33
|
+
<a href="classes/ServerSide/Application/Base.html#M000025">new (ServerSide::Application::Base)</a><br />
|
34
|
+
<a href="classes/ServerSide/Server.html#M000034">new (ServerSide::Server)</a><br />
|
35
|
+
<a href="classes/ServerSide/Connection/Base.html#M000030">parse_parameters (ServerSide::Connection::Base)</a><br />
|
36
|
+
<a href="classes/ServerSide/Connection/Base.html#M000029">parse_request (ServerSide::Connection::Base)</a><br />
|
37
|
+
<a href="classes/Daemon/Base.html#M000010">pid_fn (Daemon::Base)</a><br />
|
38
|
+
<a href="classes/ServerSide/Connection/Base.html#M000028">process (ServerSide::Connection::Base)</a><br />
|
39
|
+
<a href="classes/Daemon/PidFile.html#M000009">recall (Daemon::PidFile)</a><br />
|
40
|
+
<a href="classes/Daemon/Cluster/PidFile.html#M000019">recall_pids (Daemon::Cluster::PidFile)</a><br />
|
41
|
+
<a href="classes/ServerSide/Connection/Static.html#M000033">respond (ServerSide::Connection::Static)</a><br />
|
42
|
+
<a href="classes/ServerSide/Connection/Base.html#M000031">send_response (ServerSide::Connection::Base)</a><br />
|
43
|
+
<a href="classes/ServerSide/StaticFiles.html#M000021">serve_dir (ServerSide::StaticFiles)</a><br />
|
44
|
+
<a href="classes/ServerSide/StaticFiles.html#M000020">serve_file (ServerSide::StaticFiles)</a><br />
|
45
|
+
<a href="classes/Daemon.html#M000006">start (Daemon)</a><br />
|
46
|
+
<a href="classes/Daemon/Cluster.html#M000015">start (Daemon::Cluster)</a><br />
|
47
|
+
<a href="classes/Daemon/Cluster.html#M000012">start_servers (Daemon::Cluster)</a><br />
|
48
|
+
<a href="classes/Daemon.html#M000007">stop (Daemon)</a><br />
|
49
|
+
<a href="classes/Daemon/Cluster.html#M000016">stop (Daemon::Cluster)</a><br />
|
50
|
+
<a href="classes/Daemon/Cluster.html#M000013">stop_servers (Daemon::Cluster)</a><br />
|
51
|
+
<a href="classes/Daemon/PidFile.html#M000008">store (Daemon::PidFile)</a><br />
|
52
|
+
<a href="classes/Daemon/Cluster/PidFile.html#M000018">store_pid (Daemon::Cluster::PidFile)</a><br />
|
53
|
+
<a href="classes/ServerSide/Connection/Base.html#M000032">stream (ServerSide::Connection::Base)</a><br />
|
54
|
+
<a href="classes/Symbol.html#M000001">to_s (Symbol)</a><br />
|
55
|
+
<a href="classes/String.html#M000002">uri_escape (String)</a><br />
|
56
|
+
<a href="classes/String.html#M000003">uri_unescape (String)</a><br />
|
57
|
+
</div>
|
58
|
+
</div>
|
59
|
+
</body>
|
60
|
+
</html>
|
data/doc/rdoc/index.html
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
|
5
|
+
|
6
|
+
<!--
|
7
|
+
|
8
|
+
ServerSide Documentation
|
9
|
+
|
10
|
+
-->
|
11
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
12
|
+
<head>
|
13
|
+
<title>ServerSide Documentation</title>
|
14
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
15
|
+
</head>
|
16
|
+
<frameset rows="20%, 80%">
|
17
|
+
<frameset cols="25%,35%,45%">
|
18
|
+
<frame src="fr_file_index.html" title="Files" name="Files" />
|
19
|
+
<frame src="fr_class_index.html" name="Classes" />
|
20
|
+
<frame src="fr_method_index.html" name="Methods" />
|
21
|
+
</frameset>
|
22
|
+
<frame src="files/README.html" name="docwin" />
|
23
|
+
</frameset>
|
24
|
+
</html>
|
@@ -0,0 +1,208 @@
|
|
1
|
+
|
2
|
+
body {
|
3
|
+
font-family: Verdana,Arial,Helvetica,sans-serif;
|
4
|
+
font-size: 90%;
|
5
|
+
margin: 0;
|
6
|
+
margin-left: 40px;
|
7
|
+
padding: 0;
|
8
|
+
background: white;
|
9
|
+
}
|
10
|
+
|
11
|
+
h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; }
|
12
|
+
h1 { font-size: 150%; }
|
13
|
+
h2,h3,h4 { margin-top: 1em; }
|
14
|
+
|
15
|
+
a { background: #eef; color: #039; text-decoration: none; }
|
16
|
+
a:hover { background: #039; color: #eef; }
|
17
|
+
|
18
|
+
/* Override the base stylesheet's Anchor inside a table cell */
|
19
|
+
td > a {
|
20
|
+
background: transparent;
|
21
|
+
color: #039;
|
22
|
+
text-decoration: none;
|
23
|
+
}
|
24
|
+
|
25
|
+
/* and inside a section title */
|
26
|
+
.section-title > a {
|
27
|
+
background: transparent;
|
28
|
+
color: #eee;
|
29
|
+
text-decoration: none;
|
30
|
+
}
|
31
|
+
|
32
|
+
/* === Structural elements =================================== */
|
33
|
+
|
34
|
+
div#index {
|
35
|
+
margin: 0;
|
36
|
+
margin-left: -40px;
|
37
|
+
padding: 0;
|
38
|
+
font-size: 90%;
|
39
|
+
}
|
40
|
+
|
41
|
+
|
42
|
+
div#index a {
|
43
|
+
margin-left: 0.7em;
|
44
|
+
}
|
45
|
+
|
46
|
+
div#index .section-bar {
|
47
|
+
margin-left: 0px;
|
48
|
+
padding-left: 0.7em;
|
49
|
+
background: #ccc;
|
50
|
+
font-size: small;
|
51
|
+
}
|
52
|
+
|
53
|
+
|
54
|
+
div#classHeader, div#fileHeader {
|
55
|
+
width: auto;
|
56
|
+
color: white;
|
57
|
+
padding: 0.5em 1.5em 0.5em 1.5em;
|
58
|
+
margin: 0;
|
59
|
+
margin-left: -40px;
|
60
|
+
border-bottom: 3px solid #006;
|
61
|
+
}
|
62
|
+
|
63
|
+
div#classHeader a, div#fileHeader a {
|
64
|
+
background: inherit;
|
65
|
+
color: white;
|
66
|
+
}
|
67
|
+
|
68
|
+
div#classHeader td, div#fileHeader td {
|
69
|
+
background: inherit;
|
70
|
+
color: white;
|
71
|
+
}
|
72
|
+
|
73
|
+
|
74
|
+
div#fileHeader {
|
75
|
+
background: #057;
|
76
|
+
}
|
77
|
+
|
78
|
+
div#classHeader {
|
79
|
+
background: #048;
|
80
|
+
}
|
81
|
+
|
82
|
+
|
83
|
+
.class-name-in-header {
|
84
|
+
font-size: 180%;
|
85
|
+
font-weight: bold;
|
86
|
+
}
|
87
|
+
|
88
|
+
|
89
|
+
div#bodyContent {
|
90
|
+
padding: 0 1.5em 0 1.5em;
|
91
|
+
}
|
92
|
+
|
93
|
+
div#description {
|
94
|
+
padding: 0.5em 1.5em;
|
95
|
+
background: #efefef;
|
96
|
+
border: 1px dotted #999;
|
97
|
+
}
|
98
|
+
|
99
|
+
div#description h1,h2,h3,h4,h5,h6 {
|
100
|
+
color: #125;;
|
101
|
+
background: transparent;
|
102
|
+
}
|
103
|
+
|
104
|
+
div#validator-badges {
|
105
|
+
text-align: center;
|
106
|
+
}
|
107
|
+
div#validator-badges img { border: 0; }
|
108
|
+
|
109
|
+
div#copyright {
|
110
|
+
color: #333;
|
111
|
+
background: #efefef;
|
112
|
+
font: 0.75em sans-serif;
|
113
|
+
margin-top: 5em;
|
114
|
+
margin-bottom: 0;
|
115
|
+
padding: 0.5em 2em;
|
116
|
+
}
|
117
|
+
|
118
|
+
|
119
|
+
/* === Classes =================================== */
|
120
|
+
|
121
|
+
table.header-table {
|
122
|
+
color: white;
|
123
|
+
font-size: small;
|
124
|
+
}
|
125
|
+
|
126
|
+
.type-note {
|
127
|
+
font-size: small;
|
128
|
+
color: #DEDEDE;
|
129
|
+
}
|
130
|
+
|
131
|
+
.xxsection-bar {
|
132
|
+
background: #eee;
|
133
|
+
color: #333;
|
134
|
+
padding: 3px;
|
135
|
+
}
|
136
|
+
|
137
|
+
.section-bar {
|
138
|
+
color: #333;
|
139
|
+
border-bottom: 1px solid #999;
|
140
|
+
margin-left: -20px;
|
141
|
+
}
|
142
|
+
|
143
|
+
|
144
|
+
.section-title {
|
145
|
+
background: #79a;
|
146
|
+
color: #eee;
|
147
|
+
padding: 3px;
|
148
|
+
margin-top: 2em;
|
149
|
+
margin-left: -30px;
|
150
|
+
border: 1px solid #999;
|
151
|
+
}
|
152
|
+
|
153
|
+
.top-aligned-row { vertical-align: top }
|
154
|
+
.bottom-aligned-row { vertical-align: bottom }
|
155
|
+
|
156
|
+
/* --- Context section classes ----------------------- */
|
157
|
+
|
158
|
+
.context-row { }
|
159
|
+
.context-item-name { font-family: monospace; font-weight: bold; color: black; }
|
160
|
+
.context-item-value { font-size: small; color: #448; }
|
161
|
+
.context-item-desc { color: #333; padding-left: 2em; }
|
162
|
+
|
163
|
+
/* --- Method classes -------------------------- */
|
164
|
+
.method-detail {
|
165
|
+
background: #efefef;
|
166
|
+
padding: 0;
|
167
|
+
margin-top: 0.5em;
|
168
|
+
margin-bottom: 1em;
|
169
|
+
border: 1px dotted #ccc;
|
170
|
+
}
|
171
|
+
.method-heading {
|
172
|
+
color: black;
|
173
|
+
background: #ccc;
|
174
|
+
border-bottom: 1px solid #666;
|
175
|
+
padding: 0.2em 0.5em 0 0.5em;
|
176
|
+
}
|
177
|
+
.method-signature { color: black; background: inherit; }
|
178
|
+
.method-name { font-weight: bold; }
|
179
|
+
.method-args { font-style: italic; }
|
180
|
+
.method-description { padding: 0 0.5em 0 0.5em; }
|
181
|
+
|
182
|
+
/* --- Source code sections -------------------- */
|
183
|
+
|
184
|
+
a.source-toggle { font-size: 90%; }
|
185
|
+
div.method-source-code {
|
186
|
+
background: #262626;
|
187
|
+
color: #ffdead;
|
188
|
+
margin: 1em;
|
189
|
+
padding: 0.5em;
|
190
|
+
border: 1px dashed #999;
|
191
|
+
overflow: hidden;
|
192
|
+
}
|
193
|
+
|
194
|
+
div.method-source-code pre { color: #ffdead; overflow: hidden; }
|
195
|
+
|
196
|
+
/* --- Ruby keyword styles --------------------- */
|
197
|
+
|
198
|
+
.standalone-code { background: #221111; color: #ffdead; overflow: hidden; }
|
199
|
+
|
200
|
+
.ruby-constant { color: #7fffd4; background: transparent; }
|
201
|
+
.ruby-keyword { color: #00ffff; background: transparent; }
|
202
|
+
.ruby-ivar { color: #eedd82; background: transparent; }
|
203
|
+
.ruby-operator { color: #00ffee; background: transparent; }
|
204
|
+
.ruby-identifier { color: #ffdead; background: transparent; }
|
205
|
+
.ruby-node { color: #ffa07a; background: transparent; }
|
206
|
+
.ruby-comment { color: #b22222; font-weight: bold; background: transparent; }
|
207
|
+
.ruby-regexp { color: #ffa07a; background: transparent; }
|
208
|
+
.ruby-value { color: #7fffd4; background: transparent; }
|
data/lib/serverside.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# ServerSide is a web framework that make it easy to create custom light-weight
|
2
|
+
# web applications. It contains the following functionalities:
|
3
|
+
# 1. A fast multithreaded HTTP server with support for persistent connections
|
4
|
+
# and streaming.
|
5
|
+
# 2. A static file handler.
|
6
|
+
# 3. A daemon for controlling a server or a cluster of servers.
|
7
|
+
# 4. A simple script for serving files or applications easily.
|
8
|
+
# 5. A simple controller-view system for processing requests.
|
9
|
+
module ServerSide
|
10
|
+
end
|
11
|
+
|
12
|
+
path = File.join(File.dirname(__FILE__), 'serverside')
|
13
|
+
Dir.foreach(path) {|fn| require File.join(path, fn) if fn =~ /\.rb$/}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'metaid'
|
3
|
+
require File.join(File.dirname(__FILE__), 'connection')
|
4
|
+
|
5
|
+
module ServerSide
|
6
|
+
module Application
|
7
|
+
|
8
|
+
class Base < ServerSide::Connection::Base
|
9
|
+
def self.configure(options)
|
10
|
+
@config = options
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.configuration
|
14
|
+
@config
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(host, port)
|
18
|
+
ServerSide::Server.new(host, port, make_request_class)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class Static
|
23
|
+
def self.daemonize(config, cmd)
|
24
|
+
daemon_class = Class.new(Daemon::Cluster) do
|
25
|
+
meta_def(:pid_fn) {Daemon::WorkingDirectory/'serverside.pid'}
|
26
|
+
meta_def(:server_loop) do |port|
|
27
|
+
ServerSide::Server.new(config[:host], port, ServerSide::Connection::Static)
|
28
|
+
end
|
29
|
+
meta_def(:ports) {$cmd_config[:ports]}
|
30
|
+
end
|
31
|
+
|
32
|
+
Daemon.control(daemon_class, cmd)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.daemonize
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'daemon')
|
2
|
+
|
3
|
+
module Daemon
|
4
|
+
# Implements a cluster controlling daemon. The daemon itself itself forks
|
5
|
+
# a child process for each port.
|
6
|
+
class Cluster < Base
|
7
|
+
# Stores and recalls pids for the child processes.
|
8
|
+
class PidFile
|
9
|
+
FN = 'serverside_cluster.pid'
|
10
|
+
|
11
|
+
# Deletes the cluster's pid file.
|
12
|
+
def self.delete
|
13
|
+
FileUtils.rm(FN) if File.file?(FN)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Stores a pid in the cluster's pid file.
|
17
|
+
def self.store_pid(pid)
|
18
|
+
File.open(FN, 'a') {|f| f.puts pid}
|
19
|
+
end
|
20
|
+
|
21
|
+
# Recalls all child pids.
|
22
|
+
def self.recall_pids
|
23
|
+
pids = []
|
24
|
+
File.open(FN, 'r') do |f|
|
25
|
+
while !f.eof?
|
26
|
+
pids << f.gets.to_i
|
27
|
+
end
|
28
|
+
end
|
29
|
+
pids
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Forks a child process with a specific port.
|
34
|
+
def self.fork_server(port)
|
35
|
+
fork do
|
36
|
+
trap('TERM') {exit}
|
37
|
+
server_loop(port)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Starts child processes.
|
42
|
+
def self.start_servers
|
43
|
+
PidFile.delete
|
44
|
+
ports.each do |p|
|
45
|
+
PidFile.store_pid(fork_server(p))
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Stops child processes.
|
50
|
+
def self.stop_servers
|
51
|
+
pids = PidFile.recall_pids
|
52
|
+
pids.each {|pid| begin; Process.kill('TERM', pid); rescue; end}
|
53
|
+
PidFile.delete
|
54
|
+
end
|
55
|
+
|
56
|
+
# The main daemon loop. Does nothing for now.
|
57
|
+
def self.daemon_loop
|
58
|
+
loop {sleep 60}
|
59
|
+
end
|
60
|
+
|
61
|
+
# Starts child processes and calls the main loop.
|
62
|
+
def self.start
|
63
|
+
start_servers
|
64
|
+
daemon_loop
|
65
|
+
end
|
66
|
+
|
67
|
+
# Stops child processes.
|
68
|
+
def self.stop
|
69
|
+
stop_servers
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|