forked from boostorg/beast
Refactor stream operations and tests plus coverage
This commit is contained in:
1 parent
9f089c2a33
commit
51a5a36118
22 files changed
+1290
-354
No files matched your search
@@ -214,10 +214,265 @@ public:
|
||||
);
|
||||
}
|
||||
|
||||
// Compression Extensions for WebSocket
|
||||
//
|
||||
// https://tools.ietf.org/html/rfc7692
|
||||
//
|
||||
void
|
||||
testExtRead()
|
||||
{
|
||||
detail::pmd_offer po;
|
||||
|
||||
auto const accept =
|
||||
[&](string_view s)
|
||||
{
|
||||
http::fields f;
|
||||
f.set(http::field::sec_websocket_extensions, s);
|
||||
po = detail::pmd_offer();
|
||||
detail::pmd_read(po, f);
|
||||
BEAST_EXPECT(po.accept);
|
||||
};
|
||||
|
||||
auto const reject =
|
||||
[&](string_view s)
|
||||
{
|
||||
http::fields f;
|
||||
f.set(http::field::sec_websocket_extensions, s);
|
||||
po = detail::pmd_offer();
|
||||
detail::pmd_read(po, f);
|
||||
BEAST_EXPECT(! po.accept);
|
||||
};
|
||||
|
||||
// duplicate parameters
|
||||
reject("permessage-deflate; server_max_window_bits=8; server_max_window_bits=8");
|
||||
|
||||
// missing value
|
||||
reject("permessage-deflate; server_max_window_bits");
|
||||
reject("permessage-deflate; server_max_window_bits=");
|
||||
|
||||
// invalid value
|
||||
reject("permessage-deflate; server_max_window_bits=-1");
|
||||
reject("permessage-deflate; server_max_window_bits=7");
|
||||
reject("permessage-deflate; server_max_window_bits=16");
|
||||
reject("permessage-deflate; server_max_window_bits=999999999999999999999999");
|
||||
reject("permessage-deflate; server_max_window_bits=9a");
|
||||
|
||||
// duplicate parameters
|
||||
reject("permessage-deflate; client_max_window_bits=8; client_max_window_bits=8");
|
||||
|
||||
// optional value excluded
|
||||
accept("permessage-deflate; client_max_window_bits");
|
||||
BEAST_EXPECT(po.client_max_window_bits == -1);
|
||||
accept("permessage-deflate; client_max_window_bits=");
|
||||
BEAST_EXPECT(po.client_max_window_bits == -1);
|
||||
|
||||
// invalid value
|
||||
reject("permessage-deflate; client_max_window_bits=-1");
|
||||
reject("permessage-deflate; client_max_window_bits=7");
|
||||
reject("permessage-deflate; client_max_window_bits=16");
|
||||
reject("permessage-deflate; client_max_window_bits=999999999999999999999999");
|
||||
|
||||
// duplicate parameters
|
||||
reject("permessage-deflate; server_no_context_takeover; server_no_context_takeover");
|
||||
|
||||
// valueless parameter
|
||||
accept("permessage-deflate; server_no_context_takeover");
|
||||
BEAST_EXPECT(po.server_no_context_takeover);
|
||||
accept("permessage-deflate; server_no_context_takeover=");
|
||||
BEAST_EXPECT(po.server_no_context_takeover);
|
||||
|
||||
// disallowed value
|
||||
reject("permessage-deflate; server_no_context_takeover=-1");
|
||||
reject("permessage-deflate; server_no_context_takeover=x");
|
||||
reject("permessage-deflate; server_no_context_takeover=\"yz\"");
|
||||
reject("permessage-deflate; server_no_context_takeover=999999999999999999999999");
|
||||
|
||||
// duplicate parameters
|
||||
reject("permessage-deflate; client_no_context_takeover; client_no_context_takeover");
|
||||
|
||||
// valueless parameter
|
||||
accept("permessage-deflate; client_no_context_takeover");
|
||||
BEAST_EXPECT(po.client_no_context_takeover);
|
||||
accept("permessage-deflate; client_no_context_takeover=");
|
||||
BEAST_EXPECT(po.client_no_context_takeover);
|
||||
|
||||
// disallowed value
|
||||
reject("permessage-deflate; client_no_context_takeover=-1");
|
||||
reject("permessage-deflate; client_no_context_takeover=x");
|
||||
reject("permessage-deflate; client_no_context_takeover=\"yz\"");
|
||||
reject("permessage-deflate; client_no_context_takeover=999999999999999999999999");
|
||||
|
||||
// unknown extension parameter
|
||||
reject("permessage-deflate; unknown");
|
||||
reject("permessage-deflate; unknown=");
|
||||
reject("permessage-deflate; unknown=1");
|
||||
reject("permessage-deflate; unknown=x");
|
||||
reject("permessage-deflate; unknown=\"xy\"");
|
||||
}
|
||||
|
||||
void
|
||||
testExtWrite()
|
||||
{
|
||||
detail::pmd_offer po;
|
||||
|
||||
auto const check =
|
||||
[&](string_view match)
|
||||
{
|
||||
http::fields f;
|
||||
detail::pmd_write(f, po);
|
||||
BEAST_EXPECT(
|
||||
f[http::field::sec_websocket_extensions]
|
||||
== match);
|
||||
};
|
||||
|
||||
po.accept = true;
|
||||
po.server_max_window_bits = 0;
|
||||
po.client_max_window_bits = 0;
|
||||
po.server_no_context_takeover = false;
|
||||
po.client_no_context_takeover = false;
|
||||
|
||||
check("permessage-deflate");
|
||||
|
||||
po.server_max_window_bits = 10;
|
||||
check("permessage-deflate; server_max_window_bits=10");
|
||||
|
||||
po.server_max_window_bits = -1;
|
||||
check("permessage-deflate; server_max_window_bits");
|
||||
|
||||
po.server_max_window_bits = 0;
|
||||
po.client_max_window_bits = 10;
|
||||
check("permessage-deflate; client_max_window_bits=10");
|
||||
|
||||
po.client_max_window_bits = -1;
|
||||
check("permessage-deflate; client_max_window_bits");
|
||||
|
||||
po.client_max_window_bits = 0;
|
||||
po.server_no_context_takeover = true;
|
||||
check("permessage-deflate; server_no_context_takeover");
|
||||
|
||||
po.server_no_context_takeover = false;
|
||||
po.client_no_context_takeover = true;
|
||||
check("permessage-deflate; client_no_context_takeover");
|
||||
}
|
||||
|
||||
void
|
||||
testExtNegotiate()
|
||||
{
|
||||
permessage_deflate pmd;
|
||||
|
||||
auto const reject =
|
||||
[&](
|
||||
string_view offer)
|
||||
{
|
||||
detail::pmd_offer po;
|
||||
{
|
||||
http::fields f;
|
||||
f.set(http::field::sec_websocket_extensions, offer);
|
||||
detail::pmd_read(po, f);
|
||||
}
|
||||
http::fields f;
|
||||
detail::pmd_offer config;
|
||||
detail::pmd_negotiate(f, config, po, pmd);
|
||||
BEAST_EXPECT(! config.accept);
|
||||
};
|
||||
|
||||
auto const accept =
|
||||
[&](
|
||||
string_view offer,
|
||||
string_view result)
|
||||
{
|
||||
detail::pmd_offer po;
|
||||
{
|
||||
http::fields f;
|
||||
f.set(http::field::sec_websocket_extensions, offer);
|
||||
detail::pmd_read(po, f);
|
||||
}
|
||||
http::fields f;
|
||||
detail::pmd_offer config;
|
||||
detail::pmd_negotiate(f, config, po, pmd);
|
||||
auto const got =
|
||||
f[http::field::sec_websocket_extensions];
|
||||
BEAST_EXPECTS(got == result, got);
|
||||
{
|
||||
detail::pmd_offer poc;
|
||||
detail::pmd_read(poc, f);
|
||||
detail::pmd_normalize(poc);
|
||||
BEAST_EXPECT(poc.accept);
|
||||
}
|
||||
BEAST_EXPECT(config.server_max_window_bits != 0);
|
||||
BEAST_EXPECT(config.client_max_window_bits != 0);
|
||||
};
|
||||
|
||||
pmd.server_enable = true;
|
||||
pmd.server_max_window_bits = 15;
|
||||
pmd.client_max_window_bits = 15;
|
||||
pmd.server_no_context_takeover = false;
|
||||
pmd.client_no_context_takeover = false;
|
||||
|
||||
// default
|
||||
accept(
|
||||
"permessage-deflate",
|
||||
"permessage-deflate");
|
||||
|
||||
// non-default server_max_window_bits
|
||||
accept(
|
||||
"permessage-deflate; server_max_window_bits=14",
|
||||
"permessage-deflate; server_max_window_bits=14");
|
||||
|
||||
// explicit default server_max_window_bits
|
||||
accept(
|
||||
"permessage-deflate; server_max_window_bits=15",
|
||||
"permessage-deflate");
|
||||
|
||||
// minimum window size of 8 bits (a zlib bug)
|
||||
accept(
|
||||
"permessage-deflate; server_max_window_bits=8",
|
||||
"permessage-deflate; server_max_window_bits=9");
|
||||
|
||||
// non-default server_max_window_bits setting
|
||||
pmd.server_max_window_bits = 10;
|
||||
accept(
|
||||
"permessage-deflate",
|
||||
"permessage-deflate; server_max_window_bits=10");
|
||||
|
||||
// clamped server_max_window_bits setting #1
|
||||
pmd.server_max_window_bits = 10;
|
||||
accept(
|
||||
"permessage-deflate; server_max_window_bits=14",
|
||||
"permessage-deflate; server_max_window_bits=10");
|
||||
|
||||
// clamped server_max_window_bits setting #2
|
||||
pmd.server_max_window_bits=8;
|
||||
accept(
|
||||
"permessage-deflate; server_max_window_bits=14",
|
||||
"permessage-deflate; server_max_window_bits=9");
|
||||
|
||||
pmd.server_max_window_bits = 15;
|
||||
|
||||
// present with no value
|
||||
accept(
|
||||
"permessage-deflate; client_max_window_bits",
|
||||
"permessage-deflate");
|
||||
|
||||
// present with no value, non-default setting
|
||||
pmd.client_max_window_bits = 10;
|
||||
accept(
|
||||
"permessage-deflate; client_max_window_bits",
|
||||
"permessage-deflate; client_max_window_bits=10");
|
||||
|
||||
// absent, non-default setting
|
||||
pmd.client_max_window_bits = 10;
|
||||
reject(
|
||||
"permessage-deflate");
|
||||
}
|
||||
|
||||
void
|
||||
run() override
|
||||
{
|
||||
testHandshake();
|
||||
testExtRead();
|
||||
testExtWrite();
|
||||
testExtNegotiate();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in new issue
Block a user