import json

def main(request, response):
    origin = request.GET.first("origin", request.headers.get('origin'))

    if "check" in request.GET:
        token = request.GET.first("token")
        value = request.server.stash.take(token)
        if value is not None:
            if request.GET.first("check", None) == "keep":
                request.server.stash.put(token, value)
            body = "1"
        else:
            body = "0"
        return [("Content-Type", "text/plain")], body


    if origin != 'none':
        response.headers.set("Access-Control-Allow-Origin", origin)
    if 'origin2' in request.GET:
        response.headers.append("Access-Control-Allow-Origin", request.GET.first('origin2'))

    #Preflight
    if 'headers' in request.GET:
        response.headers.set("Access-Control-Allow-Headers", request.GET.first('headers'))
    if 'credentials' in request.GET:
        response.headers.set("Access-Control-Allow-Credentials", request.GET.first('credentials'))
    if 'methods' in request.GET:
        response.headers.set("Access-Control-Allow-Methods", request.GET.first('methods'))

    code_raw = request.GET.first('code', None)
    if code_raw:
        code = int(code_raw)
    else:
        code = None
    if request.method == 'OPTIONS':
        #Override the response code if we're in a preflight and it's asked
        if 'preflight' in request.GET:
            code = int(request.GET.first('preflight'))

        #Log that the preflight actually happened if we have an ident
        if 'token' in request.GET:
            request.server.stash.put(request.GET['token'], True)

    if 'location' in request.GET:
        if code is None:
            code = 302

        if code >= 300 and code < 400:
            response.headers.set("Location", request.GET.first('location'))

    headers = {}
    for name, values in request.headers.iteritems():
        if len(values) == 1:
            headers[name] = values[0]
        else:
            #I have no idea, really
            headers[name] = values

    headers['get_value'] = request.GET.first('get_value', '')

    body = json.dumps(headers)

    if code:
        return (code, "StatusText"), [], body
    else:
        return body
