Here is my use case. A few days ago I've wrote an application to mirror my Flickr accounts. The pics are downloaded on file system and the metadata are stored in CouchDB. Now I use the Flickr interface to upload and tags pics but I got my own data on my own server. That's always cool.
For now I'm using WSGIProxy. The code is very simple and look like this:
from wsgiproxy.exactproxy import proxy_exact_request from webob import Request class Proxy(object): def __init__(self, db=None, **kwargs): self.db = db def __call__(self, environ, start_response): req = Request(environ) if req.method == 'GET': req.server_name = '127.0.0.1' req.server_port = 5984 req.script_name = '' req.path_info = '/%s%s' % (self.db, req.path_info) resp = req.get_response(proxy_exact_request) resp.content_type = 'text/jasacsript' else: resp = exc.HTTPForbidden() return resp(environ, start_response) def make_app(global_conf, **local_conf): conf = global_conf.copy() conf.update(local_conf) return Proxy(**conf)
That's cool and simple and ok for small files. But if you want to handle large request WSGIProxy will raise a MemoryError. This is no longer fun. I've already sent a patch but don't want to bother the Paste team with that.
The result is a small contribution. A set of WSGI applications included in the wsgi_proxy extention.
Here is a simple Paste config file to show own to use the proxies:
[server:main] use = egg:Paste#http port = 4969 [app:main] use = egg:Paste#urlmap /couchdb = couchdb / = proxy [app:couchdb] use = egg:restkit#host_proxy uri = http://localhost:5984/mydb [app:proxy] use = egg:restkit#host_proxy uri = http://benoitc.github.com/restkit/ max_connections=50 allowed_methods = get head post
No code needed. Cheers.
You can also use the Proxy class to proxify clients request and transform the response on the fly:
from webob import Request from restkit.ext.wsgi_proxy import Proxy proxy = Proxy() def application(environ, start_response): req = Request(environ) req.environ['SERVER_NAME'] = 'example.com' req.environ['SERVER_PORT'] = '80' # do stuff ... resp = req.get_response(proxy) # do stuff ... ... return resp(environ, start_response)
I've also tried to replace WSGIProxy in deliverance with an ugly monkey patch:
from restkit.ext.wsgi_proxy import Proxy from wsgiproxy import exactproxy print 'Patching exactproxy with restkit proxy' exactproxy.proxy_exact_request = Proxy(max_connections=4, allowed_methods=['GET', 'HEAD', 'POST']).__call__
It work perfect.