#include #include "kingate/util.h" #include "kingate/exception.h" namespace kingate { static const char *safeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789" "_-" ; string url_encode(const string& str) { string rv = str; string::size_type screwed = 0; for(;;) { screwed = rv.find_first_not_of(safeChars,screwed); if(screwed == string::npos) break; while(screwed" | "@" * | "," | ";" | ":" | "\" | <"> * | "/" | "[" | "]" | "?" | "=" * | "{" | "}" | SP | HT */ /* * RFC 2616: * * token = 1* */ static const char *quotible_chars = "\001\002\003\004\005\006\007\010" "\011\012\013\014\015\016\017\020" "\021\022\023\024\025\026\027\030" "\031\032\033\034\035\036\037\040" "()<>@,;:\\\"/[]?={}" /* separator chars (except for SP and HT mentioned elsewhere */ "\177" ; /* * RFC 2616: * * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> ) * qdtext = > * * The backslash character ("\") MAY be used as a single-character * quoting mechanism only within quoted-string and comment constructs. * * quoted-pair = "\" CHAR */ string http_quoted_string(const string& str) { string rv = str; string::size_type sp=0; for(string::size_type q=rv.find('"');(q=rv.find('"',q))!=string::npos;q+=2) rv.insert(q,1,'\\'); rv.insert(0,1,'"'); rv += '"'; return rv; } string http_quote(const string& str) { if(str.find_first_of(quotible_chars)==string::npos) return str; return http_quoted_string(str); } }