Created
November 9, 2012 22:37
-
-
Save jpetazzo/4048789 to your computer and use it in GitHub Desktop.
autobahn websocket on dotCloud
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Autobahn on dotCloud! | |
This code is 99% Autobah example code, 1% dotCloud adaptation. | |
To test this on dotCloud: | |
- create a dotCloud account at http://www.dotcloud.com/ | |
(free, no credit card) | |
- install dotCloud CLI, see http://docs.dotcloud.com/ | |
("sudo pip install dotcloud" generally works) | |
- follow those simple steps: | |
git clone git://gist.github.com/4048789.git autobahndemo | |
cd autobahndemo | |
yes | dotcloud create autobahndemo -f sandbox | |
dotcloud push | |
- go to the URL shown at the end of the push | |
What you need to know if you're already familiar with Autobahn: | |
- the external and internal ports are not the same; external will be 80, | |
but internal will be something quasi random; so you have to bind to the | |
internal port (e.g. 42800) but still specify a "normal" ws:// URL when | |
creating the factory! |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
www: | |
# Ask a worker service instead of the default "python" one, which includes nginx+uwsgi | |
type: python-worker | |
# The following will allocate a HTTP endpoint and map it to $PORT_WWW in the service | |
ports: | |
www: http | |
# The following will automatically run the server (self-explanatory I think!) | |
processes: | |
echotest: python server.py debug |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<script type="text/javascript"> | |
var sock = null; | |
var ellog = null; | |
window.onload = function() { | |
ellog = document.getElementById('log'); | |
var wsuri; | |
if (window.location.protocol === "file:") { | |
wsuri = "ws://127.0.0.1:8080/ws"; | |
} else { | |
wsuri = "ws://" + window.location.hostname + "/ws"; | |
} | |
if ("WebSocket" in window) { | |
sock = new WebSocket(wsuri); | |
} else if ("MozWebSocket" in window) { | |
sock = new MozWebSocket(wsuri); | |
} else { | |
log("Browser does not support WebSocket!"); | |
window.location = "http://autobahn.ws/unsupportedbrowser"; | |
} | |
if (sock) { | |
sock.onopen = function() { | |
log("Connected to " + wsuri); | |
} | |
sock.onclose = function(e) { | |
log("Connection closed (wasClean = " + e.wasClean + ", code = " + e.code + ", reason = '" + e.reason + "')"); | |
sock = null; | |
} | |
sock.onmessage = function(e) { | |
log("Got echo: " + e.data); | |
} | |
} | |
}; | |
function send() { | |
var msg = document.getElementById('message').value; | |
if (sock) { | |
sock.send(msg); | |
log("Sent: " + msg); | |
} else { | |
log("Not connected."); | |
} | |
}; | |
function log(m) { | |
ellog.innerHTML += m + '\n'; | |
ellog.scrollTop = ellog.scrollHeight; | |
}; | |
</script> | |
</head> | |
<body> | |
<h1>Autobahn WebSocket Echo Test</h1> | |
<noscript>You must enable JavaScript</noscript> | |
<form> | |
<p>Message: <input id="message" type="text" size="50" maxlength="50" value="Hello, world!"></p> | |
</form> | |
<button onclick='send();'>Send Message</button> | |
<pre id="log" style="height: 20em; overflow-y: scroll; background-color: #faa;"></pre> | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
autobahn | |
flask |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################################################### | |
## | |
## Copyright 2012 Tavendo GmbH | |
## | |
## Licensed under the Apache License, Version 2.0 (the "License"); | |
## you may not use this file except in compliance with the License. | |
## You may obtain a copy of the License at | |
## | |
## http://www.apache.org/licenses/LICENSE-2.0 | |
## | |
## Unless required by applicable law or agreed to in writing, software | |
## distributed under the License is distributed on an "AS IS" BASIS, | |
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
## See the License for the specific language governing permissions and | |
## limitations under the License. | |
## | |
############################################################################### | |
import os, uuid, sys | |
port = int(os.environ.get('PORT_WWW', 8080)) | |
ws_url = os.environ.get('DOTCLOUD_WWW_HTTP_URL', 'http://localhost:8080') | |
ws_url = ws_url.replace('http://', 'ws://') | |
from twisted.python import log | |
from twisted.internet import reactor | |
from twisted.web.server import Site | |
from twisted.web.wsgi import WSGIResource | |
from flask import Flask, render_template | |
from autobahn.websocket import WebSocketServerFactory, \ | |
WebSocketServerProtocol | |
from autobahn.resource import WebSocketResource, \ | |
WSGIRootResource, \ | |
HTTPChannelHixie76Aware | |
## | |
## Our WebSocket Server protocol | |
## | |
class EchoServerProtocol(WebSocketServerProtocol): | |
def onMessage(self, msg, binary): | |
self.sendMessage(msg, binary) | |
## | |
## Our WSGI application .. in this case Flask based | |
## | |
app = Flask(__name__) | |
app.secret_key = str(uuid.uuid4()) | |
@app.route('/') | |
def page_home(): | |
return render_template('index.html') | |
if __name__ == "__main__": | |
if len(sys.argv) > 1 and sys.argv[1] == 'debug': | |
log.startLogging(sys.stdout) | |
debug = True | |
else: | |
debug = False | |
app.debug = debug | |
if debug: | |
log.startLogging(sys.stdout) | |
## | |
## create a Twisted Web resource for our WebSocket server | |
## | |
wsFactory = WebSocketServerFactory(ws_url, | |
debug = debug, | |
debugCodePaths = debug) | |
wsFactory.protocol = EchoServerProtocol | |
wsFactory.setProtocolOptions(allowHixie76 = True) # needed if Hixie76 is to be supported | |
wsResource = WebSocketResource(wsFactory) | |
## | |
## create a Twisted Web WSGI resource for our Flask server | |
## | |
wsgiResource = WSGIResource(reactor, reactor.getThreadPool(), app) | |
## | |
## create a root resource serving everything via WSGI/Flask, but | |
## the path "/ws" served by our WebSocket stuff | |
## | |
rootResource = WSGIRootResource(wsgiResource, {'ws': wsResource}) | |
## | |
## create a Twisted Web Site and run everything | |
## | |
site = Site(rootResource) | |
site.protocol = HTTPChannelHixie76Aware # needed if Hixie76 is to be supported | |
reactor.listenTCP(port, site) | |
reactor.run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment