I took a crack at it. Since I'm not sure how to test it, I have no idea if 
it works. I'm just learning the "str.join()" trick so am not that 
comfortable with it yet. At a minimum it returns the openlayers home page if 
you simply go to http://127.0.0.1:8000/app/default/proxy as suggested in the 
FAQ so that's a start. I also verified that it works if you POST to the 
proxy and include the POST var "url=http://labs.metacarta.com";.


def proxy():
    import urllib, urllib2
    import cgi
    import sys, os

    allowedHosts = ['www.openlayers.org', 'openlayers.org', 
                    'labs.metacarta.com', 'world.freemap.in', 
                    'prototype.openmnnd.org', 'geo.openplans.org',
                    'sigma.openplans.org', 'demo.opengeo.org',
                    'www.openstreetmap.org', 'sample.azavea.com',
                    'v2.suite.opengeo.org', 'v-swe.uni-muenster.de:8080', 
                    'vmap0.tiles.osgeo.org', 'www.openrouteservice.org']

    method = request.env.request_method

    if method == "POST":
        if request.vars.url:
            url = request.vars.url
        else:
            url = "http://www.openlayers.org";
    else:
        fs = cgi.FieldStorage()
        url = fs.getvalue('url', "http://www.openlayers.org";)


    host = url.split("/")[2]
    if allowedHosts and not host in allowedHosts:
        response = '\n'.join(["Status: 502 Bad Gateway",
                    "Content-Type: text/plain",
                    '',
                    "This proxy does not allow you to access that location 
(%s)." % (host,),
                    '',
                    str(request.env)])
        return response

    elif url.startswith("http://";) or url.startswith("https://";):
        try:
            if method == "POST":
                body = urllib.urlencode(request.post_vars)
                r = urllib2.Request(url, body)
                y = urllib2.urlopen(r)
            else:
                y = urllib2.urlopen(url)

            # print content type header
            i = y.info()
            if i.has_key("Content-Type"):
                response = "Content-Type: %s\n\n%s" % (i["Content-Type"], 
y.read())
            else:
                response = "Content-Type: text/plain\n\n%s" % (y.read(),)
            y.close()
            return response

        except Exception, E:
            response = '\n'.join(["Status: 500 Unexpected Error",
                    "Content-Type: text/plain",
                    '',
                    "Some unexpected error occurred. Error text was:",
                    str(E)])
            return response

    else:
        response = '\n'.join(["Content-Type: text/plain",
                            '',
                            "Illegal request."])
        return response

Reply via email to