|
|
|
|
@@ -31,7 +31,7 @@ fn should_resolve_dapp() {
|
|
|
|
|
let response = request(server,
|
|
|
|
|
"\
|
|
|
|
|
GET / HTTP/1.1\r\n\
|
|
|
|
|
Host: 1472a9e190620cdf6b31f383373e45efcfe869a820c91f9ccd7eb9fb45e4985d.parity\r\n\
|
|
|
|
|
Host: 1472a9e190620cdf6b31f383373e45efcfe869a820c91f9ccd7eb9fb45e4985d.web3.site\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
"
|
|
|
|
|
@@ -52,7 +52,7 @@ fn should_return_503_when_syncing_but_should_make_the_calls() {
|
|
|
|
|
let response = request(server,
|
|
|
|
|
"\
|
|
|
|
|
GET / HTTP/1.1\r\n\
|
|
|
|
|
Host: 1472a9e190620cdf6b31f383373e45efcfe869a820c91f9ccd7eb9fb45e4985d.parity\r\n\
|
|
|
|
|
Host: 1472a9e190620cdf6b31f383373e45efcfe869a820c91f9ccd7eb9fb45e4985d.web3.site\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
"
|
|
|
|
|
@@ -81,7 +81,7 @@ fn should_return_502_on_hash_mismatch() {
|
|
|
|
|
let response = request(server,
|
|
|
|
|
"\
|
|
|
|
|
GET / HTTP/1.1\r\n\
|
|
|
|
|
Host: 94f093625c06887d94d9fee0d5f9cc4aaa46f33d24d1c7e4b5237e7c37d547dd.parity\r\n\
|
|
|
|
|
Host: 94f093625c06887d94d9fee0d5f9cc4aaa46f33d24d1c7e4b5237e7c37d547dd.web3.site\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
"
|
|
|
|
|
@@ -112,7 +112,7 @@ fn should_return_error_for_invalid_dapp_zip() {
|
|
|
|
|
let response = request(server,
|
|
|
|
|
"\
|
|
|
|
|
GET / HTTP/1.1\r\n\
|
|
|
|
|
Host: 2be00befcf008bc0e7d9cdefc194db9c75352e8632f48498b5a6bfce9f02c88e.parity\r\n\
|
|
|
|
|
Host: 2be00befcf008bc0e7d9cdefc194db9c75352e8632f48498b5a6bfce9f02c88e.web3.site\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
"
|
|
|
|
|
@@ -144,7 +144,7 @@ fn should_return_fetched_dapp_content() {
|
|
|
|
|
let response1 = http_client::request(server.addr(),
|
|
|
|
|
"\
|
|
|
|
|
GET /index.html HTTP/1.1\r\n\
|
|
|
|
|
Host: 9c94e154dab8acf859b30ee80fc828fb1d38359d938751b65db71d460588d82a.parity\r\n\
|
|
|
|
|
Host: 9c94e154dab8acf859b30ee80fc828fb1d38359d938751b65db71d460588d82a.web3.site\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
"
|
|
|
|
|
@@ -152,7 +152,7 @@ fn should_return_fetched_dapp_content() {
|
|
|
|
|
let response2 = http_client::request(server.addr(),
|
|
|
|
|
"\
|
|
|
|
|
GET /manifest.json HTTP/1.1\r\n\
|
|
|
|
|
Host: 9c94e154dab8acf859b30ee80fc828fb1d38359d938751b65db71d460588d82a.parity\r\n\
|
|
|
|
|
Host: 9c94e154dab8acf859b30ee80fc828fb1d38359d938751b65db71d460588d82a.web3.site\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
"
|
|
|
|
|
@@ -207,7 +207,7 @@ fn should_return_fetched_content() {
|
|
|
|
|
let response = request(server,
|
|
|
|
|
"\
|
|
|
|
|
GET / HTTP/1.1\r\n\
|
|
|
|
|
Host: 2be00befcf008bc0e7d9cdefc194db9c75352e8632f48498b5a6bfce9f02c88e.parity\r\n\
|
|
|
|
|
Host: 2be00befcf008bc0e7d9cdefc194db9c75352e8632f48498b5a6bfce9f02c88e.web3.site\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
"
|
|
|
|
|
@@ -234,7 +234,7 @@ fn should_cache_content() {
|
|
|
|
|
);
|
|
|
|
|
let request_str = "\
|
|
|
|
|
GET / HTTP/1.1\r\n\
|
|
|
|
|
Host: 2be00befcf008bc0e7d9cdefc194db9c75352e8632f48498b5a6bfce9f02c88e.parity\r\n\
|
|
|
|
|
Host: 2be00befcf008bc0e7d9cdefc194db9c75352e8632f48498b5a6bfce9f02c88e.web3.site\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
";
|
|
|
|
|
@@ -265,7 +265,7 @@ fn should_not_request_content_twice() {
|
|
|
|
|
);
|
|
|
|
|
let request_str = "\
|
|
|
|
|
GET / HTTP/1.1\r\n\
|
|
|
|
|
Host: 2be00befcf008bc0e7d9cdefc194db9c75352e8632f48498b5a6bfce9f02c88e.parity\r\n\
|
|
|
|
|
Host: 2be00befcf008bc0e7d9cdefc194db9c75352e8632f48498b5a6bfce9f02c88e.web3.site\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
";
|
|
|
|
|
@@ -298,6 +298,17 @@ fn should_not_request_content_twice() {
|
|
|
|
|
response2.assert_status("HTTP/1.1 200 OK");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn should_encode_and_decode_base32() {
|
|
|
|
|
use base32;
|
|
|
|
|
|
|
|
|
|
let encoded = base32::encode(base32::Alphabet::Crockford, "token+https://parity.io".as_bytes());
|
|
|
|
|
assert_eq!("EHQPPSBE5DM78X3GECX2YBVGC5S6JX3S5SMPY", &encoded);
|
|
|
|
|
|
|
|
|
|
let data = base32::decode(base32::Alphabet::Crockford, "EHQPPSBE5DM78X3GECX2YBVGC5S6JX3S5SMPY").unwrap();
|
|
|
|
|
assert_eq!("token+https://parity.io", &String::from_utf8(data).unwrap());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn should_stream_web_content() {
|
|
|
|
|
// given
|
|
|
|
|
@@ -306,8 +317,8 @@ fn should_stream_web_content() {
|
|
|
|
|
// when
|
|
|
|
|
let response = request(server,
|
|
|
|
|
"\
|
|
|
|
|
GET /web/token/https/parity.io/ HTTP/1.1\r\n\
|
|
|
|
|
Host: localhost:8080\r\n\
|
|
|
|
|
GET / HTTP/1.1\r\n\
|
|
|
|
|
Host: EHQPPSBE5DM78X3GECX2YBVGC5S6JX3S5SMPY.web.web3.site\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
"
|
|
|
|
|
@@ -322,20 +333,90 @@ fn should_stream_web_content() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn should_return_error_on_invalid_token() {
|
|
|
|
|
fn should_support_base32_encoded_web_urls() {
|
|
|
|
|
// given
|
|
|
|
|
let (server, fetch) = serve_with_fetch("token");
|
|
|
|
|
|
|
|
|
|
// when
|
|
|
|
|
let response = request(server,
|
|
|
|
|
"\
|
|
|
|
|
GET /web/invalidtoken/https/parity.io/ HTTP/1.1\r\n\
|
|
|
|
|
GET /styles.css?test=123 HTTP/1.1\r\n\
|
|
|
|
|
Host: EHQPPSBE5DM78X3GECX2YBVGC5S6JX3S5SMPY.web.web3.site\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
"
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// then
|
|
|
|
|
response.assert_status("HTTP/1.1 200 OK");
|
|
|
|
|
assert_security_headers_for_embed(&response.headers);
|
|
|
|
|
|
|
|
|
|
fetch.assert_requested("https://parity.io/styles.css?test=123");
|
|
|
|
|
fetch.assert_no_more_requests();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn should_correctly_handle_long_label_when_splitted() {
|
|
|
|
|
// given
|
|
|
|
|
let (server, fetch) = serve_with_fetch("xolrg9fePeQyKLnL");
|
|
|
|
|
|
|
|
|
|
// when
|
|
|
|
|
let response = request(server,
|
|
|
|
|
"\
|
|
|
|
|
GET /styles.css?test=123 HTTP/1.1\r\n\
|
|
|
|
|
Host: f1qprwk775k6am35a5wmpk3e9gnpgx3me1sk.mbsfcdqpwx3jd5h7ax39dxq2wvb5dhqpww3fe9t2wrvfdm.web.web3.site\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
"
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// then
|
|
|
|
|
response.assert_status("HTTP/1.1 200 OK");
|
|
|
|
|
assert_security_headers_for_embed(&response.headers);
|
|
|
|
|
|
|
|
|
|
fetch.assert_requested("https://contribution.melonport.com/styles.css?test=123");
|
|
|
|
|
fetch.assert_no_more_requests();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn should_support_base32_encoded_web_urls_as_path() {
|
|
|
|
|
// given
|
|
|
|
|
let (server, fetch) = serve_with_fetch("token");
|
|
|
|
|
|
|
|
|
|
// when
|
|
|
|
|
let response = request(server,
|
|
|
|
|
"\
|
|
|
|
|
GET /web/EHQPPSBE5DM78X3GECX2YBVGC5S6JX3S5SMPY/styles.css?test=123 HTTP/1.1\r\n\
|
|
|
|
|
Host: localhost:8080\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
"
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// then
|
|
|
|
|
response.assert_status("HTTP/1.1 200 OK");
|
|
|
|
|
assert_security_headers_for_embed(&response.headers);
|
|
|
|
|
|
|
|
|
|
fetch.assert_requested("https://parity.io/styles.css?test=123");
|
|
|
|
|
fetch.assert_no_more_requests();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn should_return_error_on_invalid_token() {
|
|
|
|
|
// given
|
|
|
|
|
let (server, fetch) = serve_with_fetch("test");
|
|
|
|
|
|
|
|
|
|
// when
|
|
|
|
|
let response = request(server,
|
|
|
|
|
"\
|
|
|
|
|
GET / HTTP/1.1\r\n\
|
|
|
|
|
Host: EHQPPSBE5DM78X3GECX2YBVGC5S6JX3S5SMPY.web.web3.site\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
"
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// then
|
|
|
|
|
response.assert_status("HTTP/1.1 400 Bad Request");
|
|
|
|
|
assert_security_headers_for_embed(&response.headers);
|
|
|
|
|
@@ -365,28 +446,6 @@ fn should_return_error_on_invalid_protocol() {
|
|
|
|
|
fetch.assert_no_more_requests();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn should_redirect_if_trailing_slash_is_missing() {
|
|
|
|
|
// given
|
|
|
|
|
let (server, fetch) = serve_with_fetch("token");
|
|
|
|
|
|
|
|
|
|
// when
|
|
|
|
|
let response = request(server,
|
|
|
|
|
"\
|
|
|
|
|
GET /web/token/https/parity.io HTTP/1.1\r\n\
|
|
|
|
|
Host: localhost:8080\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
"
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// then
|
|
|
|
|
response.assert_status("HTTP/1.1 302 Found");
|
|
|
|
|
response.assert_header("Location", "/web/token/https/parity.io/");
|
|
|
|
|
|
|
|
|
|
fetch.assert_no_more_requests();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn should_disallow_non_get_requests() {
|
|
|
|
|
// given
|
|
|
|
|
@@ -395,8 +454,8 @@ fn should_disallow_non_get_requests() {
|
|
|
|
|
// when
|
|
|
|
|
let response = request(server,
|
|
|
|
|
"\
|
|
|
|
|
POST /token/https/parity.io/ HTTP/1.1\r\n\
|
|
|
|
|
Host: web.parity\r\n\
|
|
|
|
|
POST / HTTP/1.1\r\n\
|
|
|
|
|
Host: EHQPPSBE5DM78X3GECX2YBVGC5S6JX3S5SMPY.web.web3.site\r\n\
|
|
|
|
|
Content-Type: application/json\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
@@ -423,14 +482,37 @@ fn should_fix_absolute_requests_based_on_referer() {
|
|
|
|
|
GET /styles.css HTTP/1.1\r\n\
|
|
|
|
|
Host: localhost:8080\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
Referer: http://localhost:8080/web/token/https/parity.io/\r\n\
|
|
|
|
|
Referer: http://localhost:8080/web/EHQPPSBE5DM78X3GECX2YBVGC5S6JX3S5SMPY/\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
"
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// then
|
|
|
|
|
response.assert_status("HTTP/1.1 302 Found");
|
|
|
|
|
response.assert_header("Location", "/web/token/https/parity.io/styles.css");
|
|
|
|
|
response.assert_header("Location", "/web/EHQPPSBE5DM78X3GECX2YBVGC5S6JX3S5SMPY/styles.css");
|
|
|
|
|
|
|
|
|
|
fetch.assert_no_more_requests();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn should_fix_absolute_requests_based_on_referer_in_url() {
|
|
|
|
|
// given
|
|
|
|
|
let (server, fetch) = serve_with_fetch("token");
|
|
|
|
|
|
|
|
|
|
// when
|
|
|
|
|
let response = request(server,
|
|
|
|
|
"\
|
|
|
|
|
GET /styles.css HTTP/1.1\r\n\
|
|
|
|
|
Host: localhost:8080\r\n\
|
|
|
|
|
Connection: close\r\n\
|
|
|
|
|
Referer: http://localhost:8080/?__referer=web/EHQPPSBE5DM78X3GECX2YBVGC5S6JX3S5SMPY/\r\n\
|
|
|
|
|
\r\n\
|
|
|
|
|
"
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// then
|
|
|
|
|
response.assert_status("HTTP/1.1 302 Found");
|
|
|
|
|
response.assert_header("Location", "/web/EHQPPSBE5DM78X3GECX2YBVGC5S6JX3S5SMPY/styles.css");
|
|
|
|
|
|
|
|
|
|
fetch.assert_no_more_requests();
|
|
|
|
|
}
|
|
|
|
|
|