【发布时间】:2021-06-07 14:33:27
【问题描述】:
我正在尝试像这样解析 RTSP-url:
namespace qi = boost::spirit::qi;
qi::int_parser<unsigned char, 16, 2, 2> hex_byte;
struct UrlParser : qi::grammar<stringIterator_t, UrlStruct()>
{
UrlParser() : UrlParser::base_type(start)
{
using boost::spirit::int_;
namespace ascii = boost::spirit::ascii;
using boost::spirit::ascii::char_;
// Parses http://, rtsp://, ftp://....
protocol %= +(char_ - ':') >> "://";
// Parsers for url decoding
encodeChar.add("+", ' ');
passwordRule = *((encodeChar | "%" >> hex_byte | char_) - '@');
loginRule = *((encodeChar | "%" >> hex_byte | char_) - ':');
// Parses user:pass@, user:@, :pass@
credentials %= loginRule >> ':' >> passwordRule >> '@';
// Parses host name or ip address in 192.168.0.1:80 192.168.0.1/script.cgi
host %= +(!(char_("/") | (char_(":")) >> +ascii::digit >> (char_("/") | boost::spirit::eoi)) >> char_);
// Parses port number in ":80", string
port %= ':' >> int_;
// Parses script path in "/video.cgi?resulution=1" string.
path %= *(char_ - boost::spirit::eol);
start %= -protocol
>> -credentials
>> host
>> -port
>> path
;
}
qi::rule<stringIterator_t, UrlStruct()> start;
qi::rule<stringIterator_t, std::string()> protocol;
qi::rule<stringIterator_t, UrlStruct::stringPair_t()> credentials;
qi::rule<stringIterator_t, std::string()> host;
qi::rule<stringIterator_t, int()> port;
qi::rule<stringIterator_t, std::string()> path;
private:
qi::rule<stringIterator_t, std::string()> loginRule;
qi::rule<stringIterator_t, std::string()> passwordRule;
qi::symbols<char const, char const> encodeChar;
};
UrlStruct 如下所示:
struct UrlStruct
{
typedef boost::optional<std::string> optString_t;
typedef boost::optional<int> port_t;
typedef boost::fusion::vector<std::string, std::string> stringPair_t;
typedef boost::optional<stringPair_t> credentials_t;
optString_t protocol;
credentials_t credentials;
std::string host;
port_t port;
std::string path;
};
当我有这样的网址时,这是可行的:
rtsp://admin:admin@wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov
但是当我在密码中输入“@”时,这不起作用。网址例如:
rtsp://admin:adm@in@wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov
我该如何解决这个问题?
【问题讨论】:
-
让你的问题代码独立是一种很好的礼仪。例如,
hex_byte丢失了,很多人在弄清楚如何让你的代码编译/调用解析器时会遇到很大的麻烦。
标签: c++ boost-spirit boost-spirit-qi