mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-05-20 10:34:30 +00:00
Started building the hosting and consuming handlers.
- Remove todo, the idea's there.
This commit is contained in:
parent
44495093d2
commit
af8c23a332
@ -1,19 +1,5 @@
|
|||||||
"""The HTTPS Santiago listener and sender.
|
"""The HTTPS Santiago listener and sender.
|
||||||
|
|
||||||
FIXME: use a reasonable RESTful API.
|
|
||||||
|
|
||||||
- https://appmecha.wordpress.com/2008/10/27/cherrypy-gae-routing-2/
|
|
||||||
- http://docs.cherrypy.org/dev/progguide/REST.html
|
|
||||||
- http://docs.cherrypy.org/dev/concepts/dispatching.html
|
|
||||||
- http://tools.cherrypy.org/wiki/RestfulDispatch
|
|
||||||
- http://docs.cherrypy.org/dev/refman/_cpdispatch.html
|
|
||||||
- http://www.infoq.com/articles/rest-introduction
|
|
||||||
- http://www.infoq.com/articles/rest-anti-patterns
|
|
||||||
- http://stackoverflow.com/a/920181
|
|
||||||
|
|
||||||
It's been about five times too long since I've looked at this sort of
|
|
||||||
thing. Stupid everything-is-GET antipattern.
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
158
ugly_hacks/santiago/protocols/https/controller_test.py
Normal file
158
ugly_hacks/santiago/protocols/https/controller_test.py
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
"""The HTTPS Santiago listener and sender.
|
||||||
|
|
||||||
|
TODO: Build out /consuming too.
|
||||||
|
TODO: build out the rest of the actions.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
from Cheetah.Template import Template
|
||||||
|
import cherrypy
|
||||||
|
import httplib, urllib, urlparse
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
import wsgiref.handlers
|
||||||
|
|
||||||
|
|
||||||
|
mykey = str(8)
|
||||||
|
hosting_data = { mykey: { "santiago": set( ["https://localhost:8080"] )}}
|
||||||
|
consuming_data = { "santiago": { mykey: set( ["https://localhost:8080"] )}}
|
||||||
|
|
||||||
|
|
||||||
|
def setup(santiago):
|
||||||
|
# TODO call this bugger to prep the dispatcher, objects, etc.
|
||||||
|
pass
|
||||||
|
|
||||||
|
class RestController(object):
|
||||||
|
|
||||||
|
def PUT(self, *args, **kwargs):
|
||||||
|
raise NotImplemented("RestController.PUT")
|
||||||
|
|
||||||
|
def GET(self, *args, **kwargs):
|
||||||
|
raise NotImplemented("RestController.GET")
|
||||||
|
|
||||||
|
def POST(self, *args, **kwargs):
|
||||||
|
raise NotImplemented("RestController.POST")
|
||||||
|
|
||||||
|
def DELETE(self, *args, **kwargs):
|
||||||
|
raise NotImplemented("RestController.DELETE")
|
||||||
|
|
||||||
|
|
||||||
|
class Hosting(RestController):
|
||||||
|
exposed = True
|
||||||
|
|
||||||
|
def __init__(self, data):
|
||||||
|
self.hosting = data
|
||||||
|
|
||||||
|
def GET(self):
|
||||||
|
try:
|
||||||
|
clients = [x for x in self.hosting]
|
||||||
|
message = "success"
|
||||||
|
except KeyError:
|
||||||
|
clients = []
|
||||||
|
message = "Error."
|
||||||
|
finally:
|
||||||
|
return [str(Template(
|
||||||
|
file="templates/hosting-get.tmpl",
|
||||||
|
searchList=[{
|
||||||
|
"clients": clients,
|
||||||
|
"message": message }]))]
|
||||||
|
|
||||||
|
class Client(object):
|
||||||
|
exposed = True
|
||||||
|
|
||||||
|
def __init__(self, data):
|
||||||
|
self.hosting = data
|
||||||
|
|
||||||
|
def GET(self, client=0):
|
||||||
|
try:
|
||||||
|
services = [x for x in self.hosting[client]]
|
||||||
|
message = "success"
|
||||||
|
except KeyError:
|
||||||
|
services = []
|
||||||
|
message = "Error."
|
||||||
|
finally:
|
||||||
|
return [str(Template(
|
||||||
|
file="templates/client-get.tmpl",
|
||||||
|
searchList=[{
|
||||||
|
"client": client,
|
||||||
|
"services": services,
|
||||||
|
"message": message }]))]
|
||||||
|
|
||||||
|
class HostedService(object):
|
||||||
|
exposed = True
|
||||||
|
|
||||||
|
def __init__(self, data):
|
||||||
|
self.hosting = data
|
||||||
|
|
||||||
|
def GET(self, client=0, service=""):
|
||||||
|
try:
|
||||||
|
locations = [x for x in self.hosting[client][service]]
|
||||||
|
message = "success"
|
||||||
|
except KeyError:
|
||||||
|
locations = []
|
||||||
|
message = "Error."
|
||||||
|
finally:
|
||||||
|
return [str(Template(
|
||||||
|
file="templates/hostedService-get.tmpl",
|
||||||
|
searchList=[{
|
||||||
|
"client": client,
|
||||||
|
"service": service,
|
||||||
|
"locations": locations,
|
||||||
|
"message": message }]))]
|
||||||
|
|
||||||
|
class Location(object):
|
||||||
|
exposed = True
|
||||||
|
|
||||||
|
def __init__(self, data):
|
||||||
|
self.hosting = data
|
||||||
|
|
||||||
|
def GET(self, client=0, service=0, location=0):
|
||||||
|
try:
|
||||||
|
location = self.hosting[client][service].find(location)
|
||||||
|
message = "success"
|
||||||
|
except KeyError:
|
||||||
|
location = ""
|
||||||
|
message = "error"
|
||||||
|
return [str(Template(
|
||||||
|
file="templates/location-get.tmpl",
|
||||||
|
searchList=[{
|
||||||
|
"client": client,
|
||||||
|
"service": service,
|
||||||
|
"location": location,
|
||||||
|
"message": message, }]))]
|
||||||
|
|
||||||
|
def rest_connect(dispatcher, location, controller, trailing_slash=True):
|
||||||
|
"""Simple REST connector for object/location mapping."""
|
||||||
|
|
||||||
|
if trailing_slash:
|
||||||
|
location = location.rstrip("/")
|
||||||
|
location = [location, location + "/"]
|
||||||
|
else:
|
||||||
|
location = [location]
|
||||||
|
|
||||||
|
for place in location:
|
||||||
|
for a_method in ("PUT", "GET", "POST", "DELETE"):
|
||||||
|
dispatcher.connect(controller.__class__.__name__ + a_method,
|
||||||
|
place, controller=controller, action=a_method,
|
||||||
|
conditions={ "method": [a_method] })
|
||||||
|
|
||||||
|
return dispatcher
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
hosting = Hosting(hosting_data)
|
||||||
|
client = Client(hosting_data)
|
||||||
|
service = HostedService(hosting_data)
|
||||||
|
location = Location(hosting_data)
|
||||||
|
d = cherrypy.dispatch.RoutesDispatcher()
|
||||||
|
|
||||||
|
rest_connect(d, '/hosting/:client/:service/:location', location)
|
||||||
|
rest_connect(d, '/hosting/:client/:service', service)
|
||||||
|
rest_connect(d, '/hosting/:client', client)
|
||||||
|
rest_connect(d, '/hosting/', hosting)
|
||||||
|
|
||||||
|
cherrypy.config.update({"server.socket_host": "0.0.0.0"})
|
||||||
|
|
||||||
|
cherrypy.quickstart(hosting, "/", { "/": {'request.dispatch': d, }})
|
||||||
Loading…
x
Reference in New Issue
Block a user