peerplays-fc/src/url.cpp

104 lines
2.8 KiB
C++
Raw Normal View History

2012-12-15 14:41:55 +00:00
#include <fc/url.hpp>
2012-12-19 17:23:12 +00:00
#include <fc/value.hpp>
2012-12-15 14:41:55 +00:00
#include <fc/error_report.hpp>
#include <fc/lexical_cast.hpp>
#include <fc/value_cast.hpp>
#include <fc/sstream.hpp>
namespace fc {
// url::url( const url& u );
#if 0
url::url( url&& u )
:proto(fc::move(u.proto)),
host(fc::move(u.host)),
user(fc::move(u.user)),
pass(fc::move(u.pass)),
path(fc::move(u.path)),
args(fc::move(u.args)),
port(u.port){}
url& url::operator=(url&& c)
{
fc::swap(*this,c);
return *this;
}
// url::url& operator=(const url& c) {
// }
#endif
url::url( const string& s ) {
from_string(s);
}
string url::to_string()const {
fc::stringstream ss;
ss<<proto<<"://";
if( user ) {
ss << *user;
if( pass ) {
ss<<":"<<*pass;
}
ss<<"@";
}
ss<<*host;
if( port ) ss<<":"<<*port;
if( path ) ss<<"/"<<*path;
if( args ) ss<<"?"<<*args;
return ss.str();
}
/**
* proto://user:pass@host:port/~/path?args
* proto://user:pass@host:port/absolute?args
*/
url& url::from_string( const string& s ) {
fc::stringstream ss(s);
fc::string _proto,skip,_user,_pass,_host,_port,_path,_args;
fc::getline( ss, _proto, ':' );
fc::getline( ss, skip, '/' );
fc::getline( ss, skip, '/' );
if( s.find('@') != fc::string::npos ) {
fc::string user_pass;
fc::getline( ss, user_pass, '@' );
fc::stringstream upss(user_pass);
if( user_pass.find( ':' ) != fc::string::npos ) {
fc::getline( upss, _user, ':' );
fc::getline( upss, _pass, ':' );
user = fc::move(_user);
pass = fc::move(_pass);
} else {
user = fc::move(user_pass);
}
}
fc::string host_port;
fc::getline( ss, host_port, '/' );
auto pos = host_port.find( ':' );
if( pos != fc::string::npos ) {
try {
port = fc::lexical_cast<uint16_t>( host_port.substr( pos+1 ) );
} catch ( ... ) {
FC_THROW_REPORT( "Unable to parse port field in url", value().set( "url", s ) );
}
host = host_port.substr(0,pos);
} else {
host = fc::move(host_port);
}
fc::getline( ss, _path, '?' );
fc::getline( ss, _args );
path = fc::move(_path);
if( _args.size() ) args = fc::move(_args);
return *this;
}
bool url::operator==( const url& cmp )const {
return cmp.proto == proto &&
cmp.host == host &&
cmp.user == user &&
cmp.pass == pass &&
cmp.path == path &&
cmp.args == args &&
cmp.port == port;
}
} // namespace fc