<!DOCTYPE html>
<meta charset=utf-8>
<title>CORS - simple requests</title>
<meta name=author title="Odin Hørthe Omdal" href="mailto:odiho@opera.com">

<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=support.js?pipe=sub></script>
<script src=/common/utils.js></script>

<h1>Simple requests</h1>
<p>Simple requests shouldn't trigger preflight</p>

<div id=log></div>
<script>

var test_c = 0;

function check_simple(method, headers)
{
    test(function() {
        var client = new XMLHttpRequest()
        var uuid_token = token();
        client.open(method, CROSSDOMAIN + 'resources/preflight.py?token='
                            + uuid_token, false)
        for (head in headers)
            client.setRequestHeader(head, headers[head])
        client.send("data")
        assert_equals(client.getResponseHeader('content-type'), "text/plain")
        if (method == 'HEAD')
            assert_equals(client.response, '', 'response')
        else
            assert_equals(client.response, 'NO', 'response')

        client.open('GET', 'resources/preflight.py?check&token='
                          + uuid_token, false)
        client.send("data")
        assert_equals(client.response, "0", "Found preflight log")
    },
    'No preflight ' + method + ' and ' + JSON.stringify(headers))
}

function check_simple_headers(headers) {
    check_simple('GET', headers)
    check_simple('HEAD', headers)
    check_simple('POST', headers)
}

check_simple_headers({
                        'save-data': 'on',
                        'device-memory': '2.0',
                        'dpr': '3.0',
                        'width': '1200',
                        'viewport-width': '1300'
                     })

</script>
