Revision bbc9fae4
Added by koszko over 1 year ago
test/haketilo_test/unit/test_CORS_bypass_server.py | ||
---|---|---|
24 | 24 |
from ..script_loader import load_script |
25 | 25 |
from ..world_wide_library import some_data |
26 | 26 |
|
27 |
urls = { |
|
28 |
'resource': 'https://anotherdoma.in/resource/blocked/by/CORS.json', |
|
29 |
'nonexistent': 'https://nxdoma.in/resource.json', |
|
30 |
'invalid': 'w3csucks://invalid.url/' |
|
27 |
datas = { |
|
28 |
'resource': 'https://anotherdoma.in/resource/blocked/by/CORS.json', |
|
29 |
'nonexistent': 'https://nxdoma.in/resource.json', |
|
30 |
'invalid': 'w3csucks://invalid.url/', |
|
31 |
'redirected_ok': 'https://site.with.scripts.block.ed', |
|
32 |
'redirected_err': 'https://site.with.scripts.block.ed' |
|
31 | 33 |
} |
32 | 34 |
|
35 |
for name, url in [*datas.items()]: |
|
36 |
datas[name] = {'url': url} |
|
37 |
|
|
38 |
datas['redirected_ok']['init'] = {'redirect': 'follow'} |
|
39 |
datas['redirected_err']['init'] = {'redirect': 'error'} |
|
40 |
|
|
33 | 41 |
content_script = '''\ |
34 |
const urls = %s; |
|
35 |
|
|
36 |
function fetch_data(url) { |
|
37 |
return { |
|
38 |
url, |
|
39 |
to_get: ["ok", "status"], |
|
40 |
to_call: ["text", "json"] |
|
41 |
}; |
|
42 |
} |
|
42 |
const datas = %s; |
|
43 | 43 |
|
44 | 44 |
async function fetch_resources() { |
45 | 45 |
const results = {}; |
46 | 46 |
const promises = []; |
47 |
for (const [name, url] of Object.entries(urls)) { |
|
48 |
const sending = browser.runtime.sendMessage(["CORS_bypass", |
|
49 |
fetch_data(url)]); |
|
47 |
for (const [name, data] of Object.entries(datas)) { |
|
48 |
const sending = browser.runtime.sendMessage(["CORS_bypass", data]); |
|
50 | 49 |
promises.push(sending.then(response => results[name] = response)); |
51 | 50 |
} |
52 | 51 |
|
... | ... | |
58 | 57 |
fetch_resources(); |
59 | 58 |
''' |
60 | 59 |
|
61 |
content_script = content_script % json.dumps(urls);
|
|
60 |
content_script = content_script % json.dumps(datas);
|
|
62 | 61 |
|
63 | 62 |
@pytest.mark.ext_data({ |
64 | 63 |
'content_script': content_script, |
... | ... | |
77 | 76 |
''' |
78 | 77 |
const result = {}; |
79 | 78 |
let promises = []; |
80 |
for (const [name, url] of Object.entries(arguments[0])) {
|
|
79 |
for (const [name, data] of Object.entries(arguments[0])) {
|
|
81 | 80 |
const [ok_cb, err_cb] = |
82 | 81 |
["ok", "err"].map(status => () => result[name] = status); |
83 |
promises.push(fetch(url).then(ok_cb, err_cb)); |
|
82 |
promises.push(fetch(data.url).then(ok_cb, err_cb));
|
|
84 | 83 |
} |
85 | 84 |
// Make the promises non-failing. |
86 | 85 |
promises = promises.map(p => new Promise(cb => p.then(cb, cb))); |
87 | 86 |
returnval(Promise.all(promises).then(() => result)); |
88 | 87 |
''', |
89 |
{**urls, 'sameorigin': './nonexistent_resource'})
|
|
88 |
{**datas, 'sameorigin': './nonexistent_resource'})
|
|
90 | 89 |
|
91 |
assert results == dict([*[(k, 'err') for k in urls.keys()],
|
|
90 |
assert results == dict([*[(k, 'err') for k in datas.keys()],
|
|
92 | 91 |
('sameorigin', 'ok')]) |
93 | 92 |
|
94 | 93 |
done = lambda d: d.execute_script('return window.haketilo_fetch_results;') |
95 | 94 |
results = WebDriverWait(driver, 10).until(done) |
96 | 95 |
|
97 | 96 |
assert set(results['invalid'].keys()) == {'error'} |
97 |
assert results['invalid']['error']['fileName'].endswith('background.js') |
|
98 |
assert type(results['invalid']['error']['lineNumber']) is int |
|
99 |
assert type(results['invalid']['error']['message']) is str |
|
100 |
assert results['invalid']['error']['name'] == 'TypeError' |
|
98 | 101 |
|
99 |
assert set(results['nonexistent'].keys()) == \ |
|
100 |
{'ok', 'status', 'text', 'error_json'} |
|
101 |
assert results['nonexistent']['ok'] == False |
|
102 | 102 |
assert results['nonexistent']['status'] == 404 |
103 |
assert results['nonexistent']['text'] == 'Handler for this URL not found.' |
|
103 |
assert results['nonexistent']['statusText'] == 'Not Found' |
|
104 |
assert any([name.lower() == 'content-length' |
|
105 |
for name, value in results['nonexistent']['headers']]) |
|
106 |
assert bytes.fromhex(results['nonexistent']['body']) == \ |
|
107 |
b'Handler for this URL not found.' |
|
104 | 108 |
|
105 |
assert set(results['resource'].keys()) == {'ok', 'status', 'text', 'json'} |
|
106 |
assert results['resource']['ok'] == True |
|
107 | 109 |
assert results['resource']['status'] == 200 |
108 |
assert results['resource']['text'] == some_data |
|
109 |
assert results['resource']['json'] == json.loads(some_data) |
|
110 |
assert results['resource']['statusText'] == 'OK' |
|
111 |
assert any([name.lower() == 'content-length' |
|
112 |
for name, value in results['resource']['headers']]) |
|
113 |
assert bytes.fromhex(results['resource']['body']) == b'{"some": "data"}' |
|
114 |
|
|
115 |
assert results['redirected_ok']['status'] == 200 |
|
116 |
assert results['redirected_err']['error']['name'] == 'TypeError' |
Also available in: Unified diff
serialize and deserialize entire Response object when relaying fetch() calls to other contexts using sendMessage