mirror of
https://github.com/SerenityOS/serenity
synced 2024-09-06 17:06:31 +00:00
![Shannon Booth](/assets/img/avatar_default.png)
Instead of implementing this inline, put it into a function. Use this new function to correctly implement shortening paths for some places where this logic was previously missing. Before these changes, the pathname for the included test was incorrectly being set to '/' as we were not considering the windows drive letter.
79 lines
2.2 KiB
C++
79 lines
2.2 KiB
C++
/*
|
|
* Copyright (c) 2021, Max Wipfli <mail@maxwipfli.ch>
|
|
* Copyright (c) 2023, Shannon Booth <shannon@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Optional.h>
|
|
#include <AK/StringView.h>
|
|
#include <AK/URL.h>
|
|
|
|
namespace AK {
|
|
|
|
#define ENUMERATE_STATES \
|
|
STATE(SchemeStart) \
|
|
STATE(Scheme) \
|
|
STATE(NoScheme) \
|
|
STATE(SpecialRelativeOrAuthority) \
|
|
STATE(PathOrAuthority) \
|
|
STATE(Relative) \
|
|
STATE(RelativeSlash) \
|
|
STATE(SpecialAuthoritySlashes) \
|
|
STATE(SpecialAuthorityIgnoreSlashes) \
|
|
STATE(Authority) \
|
|
STATE(Host) \
|
|
STATE(Hostname) \
|
|
STATE(Port) \
|
|
STATE(File) \
|
|
STATE(FileSlash) \
|
|
STATE(FileHost) \
|
|
STATE(PathStart) \
|
|
STATE(Path) \
|
|
STATE(CannotBeABaseUrlPath) \
|
|
STATE(Query) \
|
|
STATE(Fragment)
|
|
|
|
class URLParser {
|
|
public:
|
|
enum class State {
|
|
#define STATE(state) state,
|
|
ENUMERATE_STATES
|
|
#undef STATE
|
|
};
|
|
|
|
static char const* state_name(State const& state)
|
|
{
|
|
switch (state) {
|
|
#define STATE(state) \
|
|
case State::state: \
|
|
return #state;
|
|
ENUMERATE_STATES
|
|
#undef STATE
|
|
}
|
|
VERIFY_NOT_REACHED();
|
|
}
|
|
|
|
// https://url.spec.whatwg.org/#concept-basic-url-parser
|
|
static URL basic_parse(StringView input, Optional<URL> const& base_url = {}, Optional<URL> url = {}, Optional<State> state_override = {});
|
|
|
|
// https://url.spec.whatwg.org/#string-percent-encode-after-encoding
|
|
static ErrorOr<String> percent_encode_after_encoding(StringView input, URL::PercentEncodeSet percent_encode_set, bool space_as_plus = false);
|
|
|
|
// https://url.spec.whatwg.org/#concept-host-serializer
|
|
static ErrorOr<String> serialize_host(URL::Host const&);
|
|
|
|
// https://url.spec.whatwg.org/#shorten-a-urls-path
|
|
static void shorten_urls_path(URL&);
|
|
};
|
|
|
|
#undef ENUMERATE_STATES
|
|
|
|
}
|
|
|
|
#if USING_AK_GLOBALLY
|
|
using AK::URLParser;
|
|
#endif
|