summaryrefslogtreecommitdiffstats
path: root/src/types.cpp
blob: 8c4575c81c4b2fdc7d80f47c94fe40419f435af6 (plain)
1
2
3
4
5
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* 
/*  This file is part of mastodonpp.
 *  Copyright © 2020 tastytea <tastytea@tastytea.de>
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Affero General Public License as published by
 *  the Free Software Foundation, version 3.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Affero General Public License for more details.
 *
 *  You should have received a copy of the GNU Affero General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "log.hpp"
#include "types.hpp"

#include <algorithm>
#include <cctype>

namespace mastodonpp
{

using std::search;
using std::tolower;

answer_type::operator bool() const
{
    return (curl_error_code == 0 && http_status == 200);
}

answer_type::operator string_view() const
{
    return body;
}

std::ostream &operator <<(std::ostream &out, const answer_type &answer)
{
    out << answer.body;
    return out;
}

string_view answer_type::get_header(const string_view field) const
{
    const string_view searchstring{string(field) += ':'};
    auto it{search(headers.begin(), headers.end(),
                   searchstring.begin(), searchstring.end(),
                   [](unsigned char a, unsigned char b)
                   { return tolower(a) == tolower(b); })};

    if (it != headers.end())
    {
        auto pos{static_cast<size_t>(it - headers.begin())};
        pos = headers.find(':', pos) + 2;
        const auto endpos{headers.find('\n', pos)};
        return string_view(&headers[pos], endpos - pos);
    }

    return {};
}

parametermap answer_type::parse_pagination(const bool next) const
{
    const string_view link{get_header("Link")};
    if (link.empty())
    {
        return {};
    }

    const auto direction{next ? R"(rel="next")" : R"(rel="prev")"};
    auto endpos{link.find(direction)};
    endpos = link.rfind('>', endpos);
    auto startpos{link.rfind('?', endpos) + 1};
    const string_view paramstr{link.substr(startpos, endpos - startpos)};
    debuglog << "Found parameters in Link header: " << paramstr << '\n';

    startpos = 0;
    parametermap parameters;
    while ((endpos = paramstr.find('=', startpos)) != string_view::npos)
    {
        parameterpair param;
        param.first = paramstr.substr(startpos, endpos - startpos);
        startpos = endpos + 1;
        endpos = paramstr.find('&', startpos);
        param.second = paramstr.substr(startpos, endpos - startpos);
        parameters.insert(param);

        if (endpos == string_view::npos)
        {
            break;
        }
        startpos = endpos + 1;
    }

    return parameters;
}

} // namespace mastodonpp