mirror of
https://github.com/falk-werner/webfuse
synced 2024-09-28 22:40:43 +00:00
70 lines
1.3 KiB
C++
70 lines
1.3 KiB
C++
|
#include "webfuse/ws/url.hpp"
|
||
|
|
||
|
#include <cstring>
|
||
|
#include <stdexcept>
|
||
|
|
||
|
namespace
|
||
|
{
|
||
|
|
||
|
bool starts_with(std::string const & value, std::string const & prefix)
|
||
|
{
|
||
|
return (0 == value.find(prefix));
|
||
|
}
|
||
|
|
||
|
std::string parse_protocol(std::string const &url, bool &use_tls)
|
||
|
{
|
||
|
if (starts_with(url, "ws://"))
|
||
|
{
|
||
|
use_tls = false;
|
||
|
return url.substr(strlen("ws://"));
|
||
|
}
|
||
|
|
||
|
if (starts_with(url, "wss://"))
|
||
|
{
|
||
|
use_tls = true;
|
||
|
return url.substr(strlen("wss://"));
|
||
|
}
|
||
|
|
||
|
throw std::runtime_error("unknown protocol");
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
namespace webfuse
|
||
|
{
|
||
|
|
||
|
constexpr uint16_t const ws_port = 80;
|
||
|
constexpr uint16_t const wss_port = 443;
|
||
|
|
||
|
ws_url::ws_url(std::string const & url)
|
||
|
{
|
||
|
auto remainder = parse_protocol(url, use_tls);
|
||
|
|
||
|
auto const path_start = remainder.find('/');
|
||
|
if (path_start != std::string::npos)
|
||
|
{
|
||
|
path = remainder.substr(path_start);
|
||
|
remainder = remainder.substr(0, path_start);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
path = "/";
|
||
|
}
|
||
|
|
||
|
auto const port_start = remainder.find(':');
|
||
|
if (port_start != std::string::npos)
|
||
|
{
|
||
|
auto const port_str = remainder.substr(port_start + 1);
|
||
|
port = static_cast<uint16_t>(std::stoi(port_str));
|
||
|
hostname = remainder.substr(0, port_start);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
port = (use_tls) ? wss_port : ws_port;
|
||
|
hostname = remainder;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|