plezi 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/CHANGELOG.md +450 -0
- data/Gemfile +4 -0
- data/KNOWN_ISSUES.md +13 -0
- data/LICENSE.txt +22 -0
- data/README.md +341 -0
- data/Rakefile +2 -0
- data/TODO.md +19 -0
- data/bin/plezi +301 -0
- data/lib/plezi.rb +125 -0
- data/lib/plezi/base/cache.rb +77 -0
- data/lib/plezi/base/connections.rb +33 -0
- data/lib/plezi/base/dsl.rb +177 -0
- data/lib/plezi/base/engine.rb +85 -0
- data/lib/plezi/base/events.rb +84 -0
- data/lib/plezi/base/io_reactor.rb +41 -0
- data/lib/plezi/base/logging.rb +62 -0
- data/lib/plezi/base/rack_app.rb +89 -0
- data/lib/plezi/base/services.rb +57 -0
- data/lib/plezi/base/timers.rb +71 -0
- data/lib/plezi/handlers/controller_magic.rb +383 -0
- data/lib/plezi/handlers/http_echo.rb +27 -0
- data/lib/plezi/handlers/http_host.rb +215 -0
- data/lib/plezi/handlers/http_router.rb +69 -0
- data/lib/plezi/handlers/magic_helpers.rb +43 -0
- data/lib/plezi/handlers/route.rb +272 -0
- data/lib/plezi/handlers/stubs.rb +143 -0
- data/lib/plezi/server/README.md +33 -0
- data/lib/plezi/server/helpers/http.rb +169 -0
- data/lib/plezi/server/helpers/mime_types.rb +999 -0
- data/lib/plezi/server/protocols/http_protocol.rb +318 -0
- data/lib/plezi/server/protocols/http_request.rb +133 -0
- data/lib/plezi/server/protocols/http_response.rb +294 -0
- data/lib/plezi/server/protocols/websocket.rb +208 -0
- data/lib/plezi/server/protocols/ws_response.rb +92 -0
- data/lib/plezi/server/services/basic_service.rb +224 -0
- data/lib/plezi/server/services/no_service.rb +196 -0
- data/lib/plezi/server/services/ssl_service.rb +193 -0
- data/lib/plezi/version.rb +3 -0
- data/plezi.gemspec +26 -0
- data/resources/404.erb +68 -0
- data/resources/404.haml +64 -0
- data/resources/404.html +67 -0
- data/resources/404.slim +63 -0
- data/resources/500.erb +68 -0
- data/resources/500.haml +63 -0
- data/resources/500.html +67 -0
- data/resources/500.slim +63 -0
- data/resources/Gemfile +85 -0
- data/resources/anorexic_gray.png +0 -0
- data/resources/anorexic_websockets.html +47 -0
- data/resources/code.rb +8 -0
- data/resources/config.ru +39 -0
- data/resources/controller.rb +139 -0
- data/resources/db_ac_config.rb +58 -0
- data/resources/db_dm_config.rb +51 -0
- data/resources/db_sequel_config.rb +42 -0
- data/resources/en.yml +204 -0
- data/resources/environment.rb +41 -0
- data/resources/haml_config.rb +6 -0
- data/resources/i18n_config.rb +14 -0
- data/resources/rakefile.rb +22 -0
- data/resources/redis_config.rb +35 -0
- data/resources/routes.rb +26 -0
- data/resources/welcome_page.html +72 -0
- data/websocket chatroom.md +639 -0
- metadata +141 -0
data/resources/500.erb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<head>
|
3
|
+
<style>
|
4
|
+
body, html
|
5
|
+
{
|
6
|
+
background-color: #eee;
|
7
|
+
padding: 0; margin: 0;
|
8
|
+
width: 100%;
|
9
|
+
}
|
10
|
+
h1
|
11
|
+
{
|
12
|
+
background-color: #ddd;
|
13
|
+
color: #008;
|
14
|
+
text-align: center;
|
15
|
+
border-bottom: 1px solid #000;
|
16
|
+
margin: 0;
|
17
|
+
padding: 0.5em;
|
18
|
+
width: auto;
|
19
|
+
}
|
20
|
+
p
|
21
|
+
{
|
22
|
+
color:#004;
|
23
|
+
font-size: 1.2em;
|
24
|
+
padding: 0 1em;
|
25
|
+
}
|
26
|
+
#wrapper
|
27
|
+
{
|
28
|
+
background-color: #fff;
|
29
|
+
margin: 1em 5%;
|
30
|
+
padding: 0 0 2% 0;
|
31
|
+
border-radius: 20px;
|
32
|
+
min-height: 50%;
|
33
|
+
color: #007;
|
34
|
+
}
|
35
|
+
#wrapper h2
|
36
|
+
{
|
37
|
+
background-color: #ddd;
|
38
|
+
color: #008;
|
39
|
+
text-align: center;
|
40
|
+
margin: 0 0 1em 0;
|
41
|
+
padding: 0.5em 0;
|
42
|
+
width: 100%;
|
43
|
+
border-radius: 20px;
|
44
|
+
}
|
45
|
+
#wrapper p{ padding: 0 2%;}
|
46
|
+
#wrapper #missing
|
47
|
+
{
|
48
|
+
color:#904;
|
49
|
+
font-size: 1.4em;
|
50
|
+
padding: 0.5em 0;
|
51
|
+
text-align: center;
|
52
|
+
background-color: #fee;
|
53
|
+
border-bottom: 1px solid #800;
|
54
|
+
margin: 0;
|
55
|
+
}
|
56
|
+
</style>
|
57
|
+
</head>
|
58
|
+
<body>
|
59
|
+
<h1>Plezi 500 error code (broken?!)...</h1>
|
60
|
+
<div id='wrapper'>
|
61
|
+
<h2 id='missing'>
|
62
|
+
something went wrong with:
|
63
|
+
<%= defined?(request) ? request.path : "what you're looking for..." %>
|
64
|
+
</h2>
|
65
|
+
<p>Sorry, something went wrong trying to process your request...</p>
|
66
|
+
<p>.... Please try again soon and if this issue persists, please let us know.</p>
|
67
|
+
</div>
|
68
|
+
</body>
|
data/resources/500.haml
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
!!!5
|
2
|
+
%head
|
3
|
+
:css
|
4
|
+
body, html
|
5
|
+
{
|
6
|
+
background-color: #eee;
|
7
|
+
padding: 0; margin: 0;
|
8
|
+
width: 100%;
|
9
|
+
}
|
10
|
+
h1
|
11
|
+
{
|
12
|
+
background-color: #ddd;
|
13
|
+
color: #008;
|
14
|
+
text-align: center;
|
15
|
+
border-bottom: 1px solid #000;
|
16
|
+
margin: 0;
|
17
|
+
padding: 0.5em;
|
18
|
+
width: auto;
|
19
|
+
}
|
20
|
+
p
|
21
|
+
{
|
22
|
+
color:#004;
|
23
|
+
font-size: 1.2em;
|
24
|
+
padding: 0 1em;
|
25
|
+
}
|
26
|
+
#wrapper
|
27
|
+
{
|
28
|
+
background-color: #fff;
|
29
|
+
margin: 1em 5%;
|
30
|
+
padding: 0 0 2% 0;
|
31
|
+
border-radius: 20px;
|
32
|
+
min-height: 50%;
|
33
|
+
color: #007;
|
34
|
+
}
|
35
|
+
#wrapper h2
|
36
|
+
{
|
37
|
+
background-color: #ddd;
|
38
|
+
color: #008;
|
39
|
+
text-align: center;
|
40
|
+
margin: 0 0 1em 0;
|
41
|
+
padding: 0.5em 0;
|
42
|
+
width: 100%;
|
43
|
+
border-radius: 20px;
|
44
|
+
}
|
45
|
+
#wrapper p{ padding: 0 2%;}
|
46
|
+
#wrapper #missing
|
47
|
+
{
|
48
|
+
color:#904;
|
49
|
+
font-size: 1.4em;
|
50
|
+
padding: 0.5em 0;
|
51
|
+
text-align: center;
|
52
|
+
background-color: #fee;
|
53
|
+
border-bottom: 1px solid #800;
|
54
|
+
margin: 0;
|
55
|
+
}
|
56
|
+
%body
|
57
|
+
%h1< Plezi 500 error code (broken?!)...
|
58
|
+
#wrapper
|
59
|
+
%h2#missing
|
60
|
+
something went wrong with:
|
61
|
+
= defined?(request) ? request.path : "what you're looking for..."
|
62
|
+
%p Sorry, something went wrong trying to process your request...
|
63
|
+
%p ... Please try again soon and if this issue persists, please let us know.
|
data/resources/500.html
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<head>
|
3
|
+
<style>
|
4
|
+
body, html
|
5
|
+
{
|
6
|
+
background-color: #eee;
|
7
|
+
padding: 0; margin: 0;
|
8
|
+
width: 100%;
|
9
|
+
}
|
10
|
+
h1
|
11
|
+
{
|
12
|
+
background-color: #ddd;
|
13
|
+
color: #008;
|
14
|
+
text-align: center;
|
15
|
+
border-bottom: 1px solid #000;
|
16
|
+
margin: 0;
|
17
|
+
padding: 0.5em;
|
18
|
+
width: 100%;
|
19
|
+
}
|
20
|
+
p
|
21
|
+
{
|
22
|
+
color:#004;
|
23
|
+
font-size: 1.2em;
|
24
|
+
padding: 0 1em;
|
25
|
+
}
|
26
|
+
#wrapper
|
27
|
+
{
|
28
|
+
background-color: #fff;
|
29
|
+
margin: 1em 5%;
|
30
|
+
padding: 0 0 2%;
|
31
|
+
border-radius: 20px;
|
32
|
+
height: auto;
|
33
|
+
color: #007;
|
34
|
+
}
|
35
|
+
#wrapper h2
|
36
|
+
{
|
37
|
+
background-color: #ddd;
|
38
|
+
color: #008;
|
39
|
+
text-align: center;
|
40
|
+
margin: 0 0 1em 0;
|
41
|
+
padding: 0.5em 0;
|
42
|
+
width: 100%;
|
43
|
+
border-radius: 20px;
|
44
|
+
}
|
45
|
+
#wrapper p{ padding: 0 2%;}
|
46
|
+
#wrapper #missing
|
47
|
+
{
|
48
|
+
color:#904;
|
49
|
+
font-size: 1.4em;
|
50
|
+
padding: 0.5em 0;
|
51
|
+
text-align: center;
|
52
|
+
background-color: #fee;
|
53
|
+
border-bottom: 1px solid #800;
|
54
|
+
margin: 0;
|
55
|
+
}
|
56
|
+
</style>
|
57
|
+
</head>
|
58
|
+
<body>
|
59
|
+
<h1>Plezi 500 error code (broken?!)...</h1>
|
60
|
+
<div id='wrapper'>
|
61
|
+
<h2 id='missing'>
|
62
|
+
something went wrong with your request...
|
63
|
+
</h2>
|
64
|
+
<p>Sorry, something went wrong trying to process your request...</p>
|
65
|
+
<p>.... Please try again soon and if this issue persists, please let us know.</p>
|
66
|
+
</div>
|
67
|
+
</body>
|
data/resources/500.slim
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
doctype html
|
2
|
+
head
|
3
|
+
css:
|
4
|
+
body, html
|
5
|
+
{
|
6
|
+
background-color: #eee;
|
7
|
+
padding: 0; margin: 0;
|
8
|
+
width: 100%;
|
9
|
+
}
|
10
|
+
h1
|
11
|
+
{
|
12
|
+
background-color: #ddd;
|
13
|
+
color: #008;
|
14
|
+
text-align: center;
|
15
|
+
border-bottom: 1px solid #000;
|
16
|
+
margin: 0;
|
17
|
+
padding: 0.5em;
|
18
|
+
width: auto;
|
19
|
+
}
|
20
|
+
p
|
21
|
+
{
|
22
|
+
color:#004;
|
23
|
+
font-size: 1.2em;
|
24
|
+
padding: 0 1em;
|
25
|
+
}
|
26
|
+
#wrapper
|
27
|
+
{
|
28
|
+
background-color: #fff;
|
29
|
+
margin: 1em 5%;
|
30
|
+
padding: 0 0 2% 0;
|
31
|
+
border-radius: 20px;
|
32
|
+
min-height: 50%;
|
33
|
+
color: #007;
|
34
|
+
}
|
35
|
+
#wrapper h2
|
36
|
+
{
|
37
|
+
background-color: #ddd;
|
38
|
+
color: #008;
|
39
|
+
text-align: center;
|
40
|
+
margin: 0 0 1em 0;
|
41
|
+
padding: 0.5em 0;
|
42
|
+
width: 100%;
|
43
|
+
border-radius: 20px;
|
44
|
+
}
|
45
|
+
#wrapper p { padding: 0 2%; }
|
46
|
+
#wrapper #missing
|
47
|
+
{
|
48
|
+
color:#904;
|
49
|
+
font-size: 1.4em;
|
50
|
+
padding: 0.5em 0;
|
51
|
+
text-align: center;
|
52
|
+
background-color: #fee;
|
53
|
+
border-bottom: 1px solid #800;
|
54
|
+
margin: 0;
|
55
|
+
}
|
56
|
+
body
|
57
|
+
h1 Plezi 500 error code (broken?!)...
|
58
|
+
#wrapper
|
59
|
+
h2#missing
|
60
|
+
| something went wrong with:
|
61
|
+
=< defined?(request) ? request.path : "what you're looking for..."
|
62
|
+
p Sorry, something went wrong trying to process your request...
|
63
|
+
p ... Please try again soon and if this issue persists, please let us know.
|
data/resources/Gemfile
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
source "https://rubygems.org"
|
2
|
+
|
3
|
+
####################
|
4
|
+
# core gems
|
5
|
+
|
6
|
+
# include the basic plezi framework and server
|
7
|
+
gem 'plezi'
|
8
|
+
|
9
|
+
####################
|
10
|
+
# development gems
|
11
|
+
|
12
|
+
# use pry gem for basic debug ( put `binding.pry` at breake point )?
|
13
|
+
# gem 'pry'
|
14
|
+
|
15
|
+
|
16
|
+
# active support can run without rails and extends the Ruby language.
|
17
|
+
# it might be heavy, be warned.
|
18
|
+
# see: http://guides.rubyonrails.org/active_support_core_extensions.html
|
19
|
+
#
|
20
|
+
# gem 'activesupport', :require => ['active_support', 'active_support/core_ext']
|
21
|
+
# or:
|
22
|
+
# gem 'activesupport', :require => ['active_support', active_support/all']
|
23
|
+
|
24
|
+
|
25
|
+
####################
|
26
|
+
# gems for easy markup
|
27
|
+
|
28
|
+
## Slim is very recommended for HTML markup, it's both easy and fast.
|
29
|
+
# gem 'slim'
|
30
|
+
|
31
|
+
## Sass makes CSS easy
|
32
|
+
# gem "sass"
|
33
|
+
|
34
|
+
## erb for HTML fanatics:
|
35
|
+
# gem 'erb'
|
36
|
+
|
37
|
+
## we love Haml, even though it can be slow:
|
38
|
+
# gem 'haml'
|
39
|
+
|
40
|
+
## and maybe coffee script? (although, we just use javascript, really)
|
41
|
+
# gem "coffee-script"
|
42
|
+
|
43
|
+
####################
|
44
|
+
# Internationalization
|
45
|
+
|
46
|
+
## I18n is the only one I know of.
|
47
|
+
# gem 'i18n'
|
48
|
+
|
49
|
+
####################
|
50
|
+
# WebSocket Scaling
|
51
|
+
|
52
|
+
## redis servers are used to allow websocket scaling.
|
53
|
+
## the :broadcast and :collect methods will work only for the current process.
|
54
|
+
## using Redis, we can publish messages and subscribe to 'chunnels' across processes
|
55
|
+
# (limited support for :broadcast and NO support for :collect while Redis is running).
|
56
|
+
|
57
|
+
# gem 'redis'
|
58
|
+
|
59
|
+
####################
|
60
|
+
# gems for databases and models
|
61
|
+
|
62
|
+
## if you want to use a database, here are a few common enough options:
|
63
|
+
# gem 'mysql2'
|
64
|
+
# gem 'sqlite3'
|
65
|
+
# gem 'pg'
|
66
|
+
|
67
|
+
## MongoDB is a very well known NoSQL DB
|
68
|
+
## https://github.com/mongodb/mongo-ruby-driver
|
69
|
+
# gem 'mongo'
|
70
|
+
## for a performance boost, the C extentions can be used (NOT JRuby - bson_ext isn't used with JRuby).
|
71
|
+
# gem 'bson_ext'
|
72
|
+
## you can also have a look at the Mongo Mapper ORM
|
73
|
+
## http://mongomapper.com
|
74
|
+
# gem 'mongo_mapper'
|
75
|
+
|
76
|
+
## someone told me good things about sequel:
|
77
|
+
## http://sequel.jeremyevans.net/rdoc/files/README_rdoc.html
|
78
|
+
## http://sequel.jeremyevans.net/rdoc/files/doc/cheat_sheet_rdoc.html
|
79
|
+
## this seems greate, but we left out any auto-config for this one... seems to work out of the box.
|
80
|
+
# gem 'sequel'
|
81
|
+
|
82
|
+
## if you want to use ActiveRecord, uncomment the following line(s)...
|
83
|
+
## but first, please remember that AcriveRecord needs extra attention when multi-threading
|
84
|
+
# gem 'activerecord', :require => 'active_record'
|
85
|
+
# gem 'bcrypt', '~> 3.1.7'
|
Binary file
|
@@ -0,0 +1,47 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<head>
|
3
|
+
<meta charset='UTF-8'>
|
4
|
+
<style>
|
5
|
+
html, body {width: 100%; height:100%;}
|
6
|
+
body {font-size: 1.5em; background-color: #eee;}
|
7
|
+
p {padding: 0.2em; margin: 0;}
|
8
|
+
.received { color: #00f;}
|
9
|
+
.sent { color: #f0f;}
|
10
|
+
.connection { color: #0f0;}
|
11
|
+
.error { color: #f00;}
|
12
|
+
input, #output {font-size: 1em; width: 60%; margin: 0.5em 19%; padding: 0.5em 1%;}
|
13
|
+
#output {height: 60%; overflow: auto; background-color: #fff;}
|
14
|
+
</style>
|
15
|
+
<script>
|
16
|
+
var websocket = NaN;
|
17
|
+
function connect() { websocket = new WebSocket('ws://' + window.location.hostname + (window.location.port == '' ? '' : (':' + window.location.port) ) + "/" ); }
|
18
|
+
function init()
|
19
|
+
{
|
20
|
+
connect()
|
21
|
+
websocket.onopen = function(evt) { WriteMessage("Connected.", "connection") };
|
22
|
+
websocket.onclose = function(evt) { WriteMessage("Disconnected.", "connection");connect(); };
|
23
|
+
websocket.onmessage = function(evt) {
|
24
|
+
WriteMessage(evt.data);
|
25
|
+
};
|
26
|
+
websocket.onerror = function(evt) { WriteMessage(evt.data, 'error'); };
|
27
|
+
}
|
28
|
+
function WriteMessage( message, message_type )
|
29
|
+
{
|
30
|
+
if (!message_type) message_type = 'received'
|
31
|
+
var msg = document.createElement("p");
|
32
|
+
msg.className = message_type;
|
33
|
+
msg.innerHTML = message;
|
34
|
+
document.getElementById("output").appendChild(msg);
|
35
|
+
}
|
36
|
+
function Send(message)
|
37
|
+
{
|
38
|
+
WriteMessage(message, 'sent');
|
39
|
+
websocket.send(message);
|
40
|
+
}
|
41
|
+
window.addEventListener("load", init, false);
|
42
|
+
</script>
|
43
|
+
</head>
|
44
|
+
<body>
|
45
|
+
<div id='output'>test</div>
|
46
|
+
<input type='text' placeholder='your message goes here.' value='' />
|
47
|
+
</body>
|
data/resources/code.rb
ADDED
data/resources/config.ru
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
########################
|
2
|
+
# RackServer rack interface
|
3
|
+
#
|
4
|
+
# using Rack with Plezi poses some limitations...:
|
5
|
+
#
|
6
|
+
# 1. only the first service (and all it's virtual hosts) will be running.
|
7
|
+
# (only the first `listen` call and all it's related `host` calls)
|
8
|
+
#
|
9
|
+
# 2. there is NO WebSockets support for Rack apps.
|
10
|
+
#
|
11
|
+
# 3. this WILL BREAKE any streaming / asynchronous methods calls that use the Plezi events engine.
|
12
|
+
#
|
13
|
+
# 4. Plezi parameters and file uploads are different then Rack - HTML Form code might be incompatible!
|
14
|
+
# This MIGHT BREAKE YOUR CODE! (changing this requires Plezi to re-parse the HTML, and costs in performance).
|
15
|
+
#
|
16
|
+
# also, all Plezi server specific configuration will be ignored.
|
17
|
+
#
|
18
|
+
# on the other hand, there is an upside:
|
19
|
+
#
|
20
|
+
# 1. you can choose a well tested server written in C that might (or might not) bring a performance boost.
|
21
|
+
#
|
22
|
+
# 2. you have better control over Middleware then you could have with Plezi.
|
23
|
+
# ("wait", you might say, "there is no Middleware in Plezi!"... "Ahhh", I will answer, "so much to discover...")
|
24
|
+
|
25
|
+
|
26
|
+
working_dir = ::File.expand_path(Dir.pwd)
|
27
|
+
app_path = ::File.expand_path(File.join(".."), __FILE__)
|
28
|
+
app_file_name = app_path.split(/[\\\/]/).last + ".rb"
|
29
|
+
|
30
|
+
# # make sure plezi doesn't set up sockets nor starts the event cycle.
|
31
|
+
PLEZI_ON_RACK = true
|
32
|
+
|
33
|
+
#load the Plezi application file
|
34
|
+
Dir.chdir app_path
|
35
|
+
require File.join(app_path, app_file_name)
|
36
|
+
|
37
|
+
Dir.chdir working_dir
|
38
|
+
|
39
|
+
run Plezi
|