summaryrefslogtreecommitdiffhomepage
path: root/Source/URL.cxx
blob: f382fb58251de28f9a31e329e676dc937d907a3e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
 *	========================================================
 *
 *	hCore
 * 	Copyright Mahrouss Logic, all rights reserved.
 *
 * 	========================================================
 */

#include <CFKit/URL.hpp>
#include <NewKit/Utils.hpp>

#include <KernelKit/DebugOutput.hpp>

// Bugs = 0

namespace hCore
{
    Url::Url(StringView &strUrl) : m_urlView(strUrl, false) {}
    
    Url::~Url() = default;

    constexpr const char *kProtos[] = {
        "https", // http with the secure.
        "http", // http without the secure
        "file", // filesystem protocol
        "ftp", // file transfer protocol
        "params", // system settings
        "rsh", // remote shell (gui)
    };

    constexpr const int kUrlOutSz = 3; //! ://
    constexpr const int kProtosCount = 8;
    constexpr const int kRangeSz = 4096;

    static ErrorOr<StringView> url_extract_location(const char *url)
    {
        if (!url || *url == 0 || string_length(url, kRangeSz) > kRangeSz)
            return ErrorOr<StringView>{-1};

        StringView view(string_length(url));

        SizeT i = 0;
        bool scheme_found = false;

        for (; i < string_length(url); ++i)
        {
            if (!scheme_found)
            {
                for (int y = 0; kProtosCount; ++y)
                {
                    if (string_in_string(view.CData(), kProtos[y]))
                    {
                        i += string_length(kProtos[y]) + kUrlOutSz;
                        scheme_found = true;

                        break;
                    }
                }
            }

            view.Data()[i] = url[i];
        }

        return ErrorOr<StringView>(view);
    }

    static ErrorOr<StringView> url_extract_protocol(const char *url)
    {
        if (!url || *url == 0 || string_length(url, kRangeSz) > kRangeSz)
            return ErrorOr<StringView>{-1};

        ErrorOr<StringView> view{ -1 };
        
        return view;
    }

    Ref<ErrorOr<StringView>> Url::Location() noexcept
    {
        const char *src = m_urlView.Leak().CData();
        auto loc = url_extract_location(src);

        if (!loc)
            return {};

        return Ref<ErrorOr<StringView>>(loc);
    }

    Ref<ErrorOr<StringView>> Url::Protocol() noexcept
    {
        const char *src = m_urlView.Leak().CData();
        auto loc = url_extract_protocol(src);

        if (!loc)
            return {};

        return Ref<ErrorOr<StringView>>(loc);
    }
} // namespace hCore