<!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)
{
    async_test(function() {
        var client = new XMLHttpRequest()
        var uuid_token = token();
        client.open(method, CROSSDOMAIN + 'resources/preflight.py?token='
                            + uuid_token, true)
        for (head in headers)
            client.setRequestHeader(head, headers[head])
        client.onload = this.step_func(function(e){
            assert_equals(client.getResponseHeader('content-type'), "text/plain")
            if (method == 'HEAD')
                assert_equals(client.response, '', 'response')
            else
                assert_equals(client.response, 'NO', 'response')
            this.done()
        })
        client.onerror = this.step_func(function(e){
             assert_unreached("should succeed")
        })
        client.send("data")

        client.open('GET', 'resources/preflight.py?check&token='
                          + uuid_token, true)
        client.onload = this.step_func(function(e){
            assert_equals(client.response, "0", "Found preflight log")
            this.done()
        })
        client.onerror = this.step_func(function(e){
             assert_unreached("should succeed")
        })
        client.send("data")
    },
    '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({'Accept': 'test'})
check_simple_headers({'accept-language': 'test'})
check_simple_headers({'CONTENT-language': 'test'})

check_simple_headers({'Content-Type': 'application/x-www-form-urlencoded'})
check_simple_headers({'content-type': 'multipart/form-data'})
check_simple_headers({'content-type': 'text/plain'})

check_simple_headers({
                        'accept': 'test',
                        'accept-language': 'test',
                        'content-language': 'test',
                        'content-type': 'text/plain; parameter=whatever'
                     })

check_simple('Get', {'content-type': 'text/plain; parameter=extra_bonus'})
check_simple('post', {'content-type': 'text/plain'})


/* Extra async test */

var simple_async = async_test("Check simple headers (async)")
simple_async.step(function (){
    var time = new Date().getTime(),
        client = new XMLHttpRequest()
    var uuid_token = token();
    client.open('POST', CROSSDOMAIN + 'resources/preflight.py?token='
                        + uuid_token, true)

    client.setRequestHeader('Accept', 'jewelry')
    client.setRequestHeader('accept-language', 'nn_NO,nn,en')
    client.setRequestHeader('content-type', 'text/plain; parameter=extra')
    client.setRequestHeader('content-Language', 'nn_NO')

    client.onload = simple_async.step_func(function() {
        assert_equals(client.getResponseHeader('content-type'), "text/plain", 'content-type response header')
        assert_equals(client.response, 'NO', 'response')
        simple_async.done()
    })
    client.onerror = simple_async.step_func(function () { assert_unreached('onerror') })
    client.send()
})
</script>
