cors-makeheader.py (2371B)
1 import json 2 3 from wptserve.utils import isomorphic_decode 4 5 def main(request, response): 6 origin = request.GET.first(b"origin", request.headers.get(b'origin') or b'none') 7 8 if b"check" in request.GET: 9 token = request.GET.first(b"token") 10 value = request.server.stash.take(token) 11 if value is not None: 12 if request.GET.first(b"check", None) == b"keep": 13 request.server.stash.put(token, value) 14 body = u"1" 15 else: 16 body = u"0" 17 return [(b"Content-Type", b"text/plain")], body 18 19 20 if origin != b'none': 21 response.headers.set(b"Access-Control-Allow-Origin", origin) 22 if b'origin2' in request.GET: 23 response.headers.append(b"Access-Control-Allow-Origin", request.GET.first(b'origin2')) 24 25 #Preflight 26 if b'headers' in request.GET: 27 response.headers.set(b"Access-Control-Allow-Headers", request.GET.first(b'headers')) 28 if b'credentials' in request.GET: 29 response.headers.set(b"Access-Control-Allow-Credentials", request.GET.first(b'credentials')) 30 if b'methods' in request.GET: 31 response.headers.set(b"Access-Control-Allow-Methods", request.GET.first(b'methods')) 32 33 code_raw = request.GET.first(b'code', None) 34 if code_raw: 35 code = int(code_raw) 36 else: 37 code = None 38 if request.method == u'OPTIONS': 39 #Override the response code if we're in a preflight and it's asked 40 if b'preflight' in request.GET: 41 code = int(request.GET.first(b'preflight')) 42 43 #Log that the preflight actually happened if we have an ident 44 if b'token' in request.GET: 45 request.server.stash.put(request.GET[b'token'], True) 46 47 if b'location' in request.GET: 48 if code is None: 49 code = 302 50 51 if code >= 300 and code < 400: 52 response.headers.set(b"Location", request.GET.first(b'location')) 53 54 headers = {} 55 for name, values in request.headers.items(): 56 if len(values) == 1: 57 headers[isomorphic_decode(name)] = isomorphic_decode(values[0]) 58 else: 59 #I have no idea, really 60 headers[name] = values 61 62 headers[u'get_value'] = isomorphic_decode(request.GET.first(b'get_value', b'')) 63 64 body = json.dumps(headers) 65 66 if code: 67 return (code, b"StatusText"), [], body 68 else: 69 return body