shad.cc

To content | To menu | To search

Tag - webpy

Entries feed - Comments feed

Wednesday, May 19 2010

Minor release: CirruxCache 0.2.2

CirruxCache 0.2.2 has just been released. It contains some bugfixes (thanks to Devattas to have reported errors on Datastore latency). Webpy has been updated to the last version.

I have also updated the documentation, especially I brought more details on Point of Presence configuration and usage of cron tasks for garbage collection.

Finally, some of the users reported me that there is a real problem with the cached object size limit (currently 1MB). I am working on the solution, I will take advantage of the new Blobstore service on AppEngine to store objects. Maybe I will keep the Datastore only for meta-data. This solution will raise the cache object limit to 50MB.

Stay tuned :)

Friday, February 19 2010

Adding virtual host support to webpy

Webpy is a tiny web framework. I use it a lot for my web-services applications.

In general, I let my web server (lighttpd) to handle virtual hosting. But as you may know, I am working on a CDN solution on top of Google App Engine, named CirruxCache. In that case, while I have absolutely no control on the server configuration, I need to handle virtual hosting from the code.

Webpy maps urls by iterating through a tuple. So my solution is quite simple: wrapping the tuple to override the __iter__ function according to an environment variable (HTTP_HOST).

Let's take this basic webpy example, without vhosting:

import web
 
urls = ('/(.*)', 'hello')
 
class hello(object):
    def GET(self, name):
        if not name:
            name = 'World'
        return 'Hello, %s' % name
 
if __name__ == "__main__":
   app = web.application(urls, globals()) 
   app.run()

Let's add the VhostMapper class:

import web
 
urls = {
      'default' : ('/(.*)', 'hello'),
      'my-vhost.domain.tld' : ('/(.*)', 'helloVhost')
      }
 
class hello(object):
    def GET(self, name):
        if not name:
            name = 'World'
        return 'Hello, %s !' % name
 
class helloVhost(object):
    def GET(self, name):
        return 'Hello %s' % web.ctx.environ['HTTP_HOST']
 
class VhostMapper(object):
    def __iter__(self):
        url = urls['default']
        if 'HTTP_HOST' in web.ctx.environ:
            vhost = web.ctx.environ['HTTP_HOST']
            if vhost in urls:
                url = urls[vhost]
        return iter(url)
 
if __name__ == "__main__":
   app = web.application(VhostMapper(), globals()) 
   app.run()

Finally, you can use curl or wget to test your vhosts:

$> curl -H "Host: my-vhost.domain.tld" http://localhost:8080/

It is not so early to announce that the next version of CirruxCache will handle virtual hosting :)

I am sure this simple hack can be easily reproduced to use virtual hosting in some other Rest frameworks.