简单高效uri解析

简单高效解析形如[scheme://]host[:port][path][?query][#fragment]的uri.


【头文件】
struct URI
{
    std::string scheme;   // protocol string(http/https/ftp/...)
    std::string host;     // host string(domain or ip)
    ushort      port;     // port number
    std::string path;     // path string(e.g. /index.html)
    std::string query;    // query string(e.g. a=1&b=2)
    std::string fragment; // additional identifying information

    URI() { Clear(); }
    void Clear()
    {
        scheme = "http";  // default "http"
        host.clear();     // default ""
        port = 0;         // default 0
        path = "/";       // default "/"
        query.clear();    // default ""
        fragment.clear(); // default ""
    }
};

/// @brief 解析形如[scheme://]host[:port][path][?query][#fragment]的uri
/// @param[in] uristr 需要解析的uri串
/// @param[out] uri 解析结果 
/// @return 解析成功返回true,否则返回false
/// @attention 解析失败时,出参未定义
bool ParseUri(const string& uristr, URI& uri);

【实现文件】
bool ParseUri(const string& uristr, URI& uri)
{
    const char* begin = uristr.c_str();
    const char* end = uristr.c_str() + uristr.size();
    const char* ptr = begin;
    uri.Clear();

parse_host:
    char c = 0;
    while ((c = *ptr) != 0 and c != '.' and c != ':')
        ++ptr;
    if (0 == c)
        return false;

    if (':' == c) // find the scheme
    {
        // find "//" after ":"
        if (end - ptr <= 3)
            return false;
        if (*(ptr + 1) != '/' or *(ptr + 2) != '/')
            return false;

        uri.scheme.assign(begin, ptr - begin);
        begin = (ptr +&#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值