serverside 0.1.59
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/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
|