#include "parser.h" namespace panda { namespace uri { // ============== RFC3986 compliant parser =================== %%{ machine uri_parser_ext; include uri_parser_base "parser.rl"; action ext_chars { ext_chars = true; } query = (pchar | "/" | "?" | ("\"" | "{" | "}" | "|") %ext_chars)* >mark %query; absolute_uri = scheme ":" hier_part ("?" query)? ("#" fragment)?; relative_ref = relative_part ("?" query)? ("#" fragment)?; uri := absolute_uri | relative_ref; write data; }%% bool URI::_parse_ext (const string& str, bool& authority_has_pct) { const char* ps = str.data(); const char* p = ps; const char* pe = p + str.length(); const char* eof = pe; int cs = uri_parser_ext_start; size_t mark; int acc = 0; bool ext_chars = false; %% write exec; if (ext_chars) { // we must parse and invalidate source query string to produce valid uri on output parse_query(); _qstr.clear(); ok_query(); } return cs >= uri_parser_ext_first_final; } }}