mirror of
https://github.com/Xahau/xahaud.git
synced 2025-12-06 17:27:52 +00:00
New overloads of suite::expect take the file and line number
as individual parameters, cleaning up the file name output
by showing only the filename part (to not leak the full path,
which might contain sensitive information).
A new macro BEAST_EXPECTS allows an additional reason
string as well as reporting the file and line. Typical usage:
```
error_code ec;
...
if(! BEAST_EXPECTS(! ec, ec.message()))
return;
```
247 lines
5.8 KiB
C++
247 lines
5.8 KiB
C++
//
|
|
// Copyright (c) 2013-2016 Vinnie Falco (vinnie dot falco at gmail dot com)
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
//
|
|
|
|
// Test that header file is self-contained.
|
|
#include <beast/http/rfc7230.hpp>
|
|
|
|
#include <beast/http/detail/rfc7230.hpp>
|
|
#include <beast/unit_test/suite.hpp>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace beast {
|
|
namespace http {
|
|
namespace test {
|
|
|
|
class rfc7230_test : public beast::unit_test::suite
|
|
{
|
|
public:
|
|
static
|
|
std::string
|
|
fmt(std::string const& s)
|
|
{
|
|
return '\'' + s + '\'';
|
|
}
|
|
|
|
static
|
|
std::string
|
|
str(boost::string_ref const& s)
|
|
{
|
|
return std::string(s.data(), s.size());
|
|
}
|
|
|
|
static
|
|
std::string
|
|
str(param_list const& c)
|
|
{
|
|
std::string s;
|
|
for(auto const& p : c)
|
|
{
|
|
s.push_back(';');
|
|
s.append(str(p.first));
|
|
s.push_back('=');
|
|
s.append(str(p.second));
|
|
}
|
|
return s;
|
|
}
|
|
|
|
void
|
|
testParamList()
|
|
{
|
|
auto const ce =
|
|
[&](std::string const& s)
|
|
{
|
|
auto const got = str(param_list{s});
|
|
BEAST_EXPECTS(got == s, fmt(got));
|
|
};
|
|
auto const cs =
|
|
[&](std::string const& s, std::string const& good)
|
|
{
|
|
ce(good);
|
|
auto const got = str(param_list{s});
|
|
ce(got);
|
|
BEAST_EXPECTS(got == good, fmt(got));
|
|
};
|
|
auto const cq =
|
|
[&](std::string const& s, std::string const& good)
|
|
{
|
|
auto const got = str(param_list{s});
|
|
BEAST_EXPECTS(got == good, fmt(got));
|
|
};
|
|
|
|
ce("");
|
|
cs(" ;\t i =\t 1 \t", ";i=1");
|
|
cq("\t; \t xyz=1 ; ijk=\"q\\\"t\"", ";xyz=1;ijk=q\"t");
|
|
|
|
// invalid strings
|
|
cs(";", "");
|
|
cs(";,", "");
|
|
cs(";xy", "");
|
|
cs(";xy", "");
|
|
cs(";xy ", "");
|
|
cs(";xy,", "");
|
|
|
|
cq(";x=,", "");
|
|
cq(";xy=\"", "");
|
|
cq(";xy=\"\x7f", "");
|
|
cq(";xy=\"\\", "");
|
|
cq(";xy=\"\\\x01\"", "");
|
|
}
|
|
|
|
static
|
|
std::string
|
|
str(ext_list const& ex)
|
|
{
|
|
std::string s;
|
|
for(auto const& e : ex)
|
|
{
|
|
if(! s.empty())
|
|
s += ',';
|
|
s.append(str(e.first));
|
|
s += str(e.second);
|
|
}
|
|
return s;
|
|
}
|
|
|
|
void
|
|
testExtList()
|
|
{
|
|
auto const ce =
|
|
[&](std::string const& s)
|
|
{
|
|
auto const got = str(ext_list{s});
|
|
BEAST_EXPECTS(got == s, fmt(got));
|
|
};
|
|
auto const cs =
|
|
[&](std::string const& s, std::string const& good)
|
|
{
|
|
ce(good);
|
|
auto const got = str(ext_list{s});
|
|
ce(got);
|
|
BEAST_EXPECTS(got == good, fmt(got));
|
|
};
|
|
auto const cq =
|
|
[&](std::string const& s, std::string const& good)
|
|
{
|
|
auto const got = str(ext_list{s});
|
|
BEAST_EXPECTS(got == good, fmt(got));
|
|
};
|
|
/*
|
|
ext-list = *( "," OWS ) ext *( OWS "," [ OWS ext ] )
|
|
ext = token param-list
|
|
param-list = *( OWS ";" OWS param )
|
|
param = token OWS "=" OWS ( token / quoted-string )
|
|
*/
|
|
ce("");
|
|
cs(",", "");
|
|
cs(", ", "");
|
|
cs(",\t", "");
|
|
cs(", \t", "");
|
|
cs(" ", "");
|
|
cs(" ,", "");
|
|
cs("\t,", "");
|
|
cs("\t , \t", "");
|
|
cs(",,", "");
|
|
cs(" , \t,, \t,", "");
|
|
|
|
ce("a");
|
|
ce("ab");
|
|
ce("a,b");
|
|
cs(" a ", "a");
|
|
cs("\t a, b\t , c\t", "a,b,c");
|
|
|
|
cs("a; \t i\t=\t \t1\t ", "a;i=1");
|
|
ce("a;i=1;j=2;k=3");
|
|
ce("a;i=1;j=2;k=3,b;i=4;j=5;k=6");
|
|
|
|
cq("ab;x=\" \"", "ab;x= ");
|
|
cq("ab;x=\"\\\"\"", "ab;x=\"");
|
|
|
|
BEAST_EXPECT(ext_list{"a,b;i=1,c;j=2;k=3"}.exists("A"));
|
|
BEAST_EXPECT(ext_list{"a,b;i=1,c;j=2;k=3"}.exists("b"));
|
|
BEAST_EXPECT(! ext_list{"a,b;i=1,c;j=2;k=3"}.exists("d"));
|
|
|
|
// invalid strings
|
|
cs("i j", "i");
|
|
cs(";", "");
|
|
}
|
|
|
|
static
|
|
std::string
|
|
str(token_list const& c)
|
|
{
|
|
bool first = true;
|
|
std::string s;
|
|
for(auto const& p : c)
|
|
{
|
|
if(! first)
|
|
s.push_back(',');
|
|
s.append(str(p));
|
|
first = false;
|
|
}
|
|
return s;
|
|
}
|
|
|
|
void
|
|
testTokenList()
|
|
{
|
|
auto const ce =
|
|
[&](std::string const& s)
|
|
{
|
|
auto const got = str(token_list{s});
|
|
BEAST_EXPECTS(got == s, fmt(got));
|
|
};
|
|
auto const cs =
|
|
[&](std::string const& s, std::string const& good)
|
|
{
|
|
ce(good);
|
|
auto const got = str(token_list{s});
|
|
ce(got);
|
|
BEAST_EXPECTS(got == good, fmt(got));
|
|
};
|
|
|
|
cs("", "");
|
|
cs(" ", "");
|
|
cs(" ", "");
|
|
cs("\t", "");
|
|
cs(" \t ", "");
|
|
cs(",", "");
|
|
cs(",,", "");
|
|
cs(" ,", "");
|
|
cs(" , ,", "");
|
|
cs(" x", "x");
|
|
cs(" \t x", "x");
|
|
cs("x ", "x");
|
|
cs("x \t", "x");
|
|
cs(" \t x \t ", "x");
|
|
ce("x,y");
|
|
cs("x ,\ty ", "x,y");
|
|
cs("x, y, z", "x,y,z");
|
|
|
|
BEAST_EXPECT(token_list{"a,b,c"}.exists("A"));
|
|
BEAST_EXPECT(token_list{"a,b,c"}.exists("b"));
|
|
BEAST_EXPECT(! token_list{"a,b,c"}.exists("d"));
|
|
|
|
// invalid
|
|
cs("x y", "x");
|
|
}
|
|
|
|
void
|
|
run()
|
|
{
|
|
testParamList();
|
|
testExtList();
|
|
testTokenList();
|
|
}
|
|
};
|
|
|
|
BEAST_DEFINE_TESTSUITE(rfc7230,http,beast);
|
|
|
|
} // test
|
|
} // http
|
|
} // beast
|