1 | #!/usr/bin/env python |
---|
2 | |
---|
3 | |
---|
4 | """This is a blind proxy that we use to get around browser |
---|
5 | restrictions that prevent the Javascript from loading pages not on the |
---|
6 | same server as the Javascript. This has several problems: it's less |
---|
7 | efficient, it might break some sites, and it's a security risk because |
---|
8 | people can use this proxy to browse the web and possibly do bad stuff |
---|
9 | with it. It only loads pages via http and https, but it can load any |
---|
10 | content type. It supports GET and POST requests.""" |
---|
11 | |
---|
12 | import urllib2 |
---|
13 | import cgi |
---|
14 | import sys, os |
---|
15 | |
---|
16 | # Designed to prevent Open Proxy type stuff. |
---|
17 | |
---|
18 | allowedHosts = ['www.openlayers.org', 'openlayers.org', |
---|
19 | 'labs.metacarta.com', 'world.freemap.in', |
---|
20 | 'prototype.openmnnd.org', 'geo.openplans.org', |
---|
21 | 'sigma.openplans.org', 'demo.opengeo.org', |
---|
22 | 'www.openstreetmap.org', 'sample.azavea.com', |
---|
23 | 'v2.suite.opengeo.org', 'v-swe.uni-muenster.de:8080', |
---|
24 | 'vmap0.tiles.osgeo.org', 'www.openrouteservice.org'] |
---|
25 | |
---|
26 | method = os.environ["REQUEST_METHOD"] |
---|
27 | |
---|
28 | if method == "POST": |
---|
29 | qs = os.environ["QUERY_STRING"] |
---|
30 | d = cgi.parse_qs(qs) |
---|
31 | if d.has_key("url"): |
---|
32 | url = d["url"][0] |
---|
33 | else: |
---|
34 | url = "http://www.openlayers.org" |
---|
35 | else: |
---|
36 | fs = cgi.FieldStorage() |
---|
37 | url = fs.getvalue('url', "http://www.openlayers.org") |
---|
38 | |
---|
39 | try: |
---|
40 | host = url.split("/")[2] |
---|
41 | if allowedHosts and not host in allowedHosts: |
---|
42 | print "Status: 502 Bad Gateway" |
---|
43 | print "Content-Type: text/plain" |
---|
44 | print |
---|
45 | print "This proxy does not allow you to access that location (%s)." % (host,) |
---|
46 | print |
---|
47 | print os.environ |
---|
48 | |
---|
49 | elif url.startswith("http://") or url.startswith("https://"): |
---|
50 | |
---|
51 | if method == "POST": |
---|
52 | length = int(os.environ["CONTENT_LENGTH"]) |
---|
53 | headers = {"Content-Type": os.environ["CONTENT_TYPE"]} |
---|
54 | body = sys.stdin.read(length) |
---|
55 | r = urllib2.Request(url, body, headers) |
---|
56 | y = urllib2.urlopen(r) |
---|
57 | else: |
---|
58 | y = urllib2.urlopen(url) |
---|
59 | |
---|
60 | # print content type header |
---|
61 | i = y.info() |
---|
62 | if i.has_key("Content-Type"): |
---|
63 | print "Content-Type: %s" % (i["Content-Type"]) |
---|
64 | else: |
---|
65 | print "Content-Type: text/plain" |
---|
66 | print |
---|
67 | |
---|
68 | print y.read() |
---|
69 | |
---|
70 | y.close() |
---|
71 | else: |
---|
72 | print "Content-Type: text/plain" |
---|
73 | print |
---|
74 | print "Illegal request." |
---|
75 | |
---|
76 | except Exception, E: |
---|
77 | print "Status: 500 Unexpected Error" |
---|
78 | print "Content-Type: text/plain" |
---|
79 | print |
---|
80 | print "Some unexpected error occurred. Error text was:", E |
---|