net/HostParser: use std::string_view instead of StringView
This commit is contained in:
parent
d5db4ca0e7
commit
242ba727b2
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2007-2020 CM4all GmbH
|
* Copyright 2007-2022 CM4all GmbH
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* author: Max Kellermann <mk@cm4all.com>
|
* author: Max Kellermann <mk@cm4all.com>
|
||||||
|
@ -83,10 +83,22 @@ FindIPv6End(const char *p) noexcept
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static constexpr std::string_view
|
||||||
|
SV(const char *begin, const char *end) noexcept
|
||||||
|
{
|
||||||
|
#if __cplusplus >= 202002 && !defined(__clang__)
|
||||||
|
return {begin, end};
|
||||||
|
#else
|
||||||
|
/* kludge for libc++ which does not yet implement the C++20
|
||||||
|
iterator constructor */
|
||||||
|
return {begin, std::size_t(end - begin)};
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
ExtractHostResult
|
ExtractHostResult
|
||||||
ExtractHost(const char *src) noexcept
|
ExtractHost(const char *src) noexcept
|
||||||
{
|
{
|
||||||
ExtractHostResult result{nullptr, src};
|
ExtractHostResult result{{}, src};
|
||||||
const char *hostname;
|
const char *hostname;
|
||||||
|
|
||||||
if (IsValidHostnameChar(*src)) {
|
if (IsValidHostnameChar(*src)) {
|
||||||
|
@ -100,7 +112,7 @@ ExtractHost(const char *src) noexcept
|
||||||
/* found a second colon: assume it's an IPv6
|
/* found a second colon: assume it's an IPv6
|
||||||
address */
|
address */
|
||||||
result.end = FindIPv6End(src + 1);
|
result.end = FindIPv6End(src + 1);
|
||||||
result.host = {hostname, result.end};
|
result.host = SV(hostname, result.end);
|
||||||
return result;
|
return result;
|
||||||
} else
|
} else
|
||||||
/* remember the position of the first colon */
|
/* remember the position of the first colon */
|
||||||
|
@ -115,11 +127,11 @@ ExtractHost(const char *src) noexcept
|
||||||
src = colon;
|
src = colon;
|
||||||
|
|
||||||
result.end = src;
|
result.end = src;
|
||||||
result.host = {hostname, result.end};
|
result.host = SV(hostname, result.end);
|
||||||
} else if (src[0] == ':' && src[1] == ':') {
|
} else if (src[0] == ':' && src[1] == ':') {
|
||||||
/* IPv6 address beginning with "::" */
|
/* IPv6 address beginning with "::" */
|
||||||
result.end = FindIPv6End(src + 2);
|
result.end = FindIPv6End(src + 2);
|
||||||
result.host = {src, result.end};
|
result.host = SV(src, result.end);
|
||||||
} else if (src[0] == '[') {
|
} else if (src[0] == '[') {
|
||||||
/* "[hostname]:port" (IPv6?) */
|
/* "[hostname]:port" (IPv6?) */
|
||||||
|
|
||||||
|
@ -129,7 +141,7 @@ ExtractHost(const char *src) noexcept
|
||||||
/* failed, return nullptr */
|
/* failed, return nullptr */
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
result.host = {hostname, end};
|
result.host = SV(hostname, end);
|
||||||
result.end = end + 1;
|
result.end = end + 1;
|
||||||
} else {
|
} else {
|
||||||
/* failed, return nullptr */
|
/* failed, return nullptr */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2007-2020 CM4all GmbH
|
* Copyright 2007-2022 CM4all GmbH
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* author: Max Kellermann <mk@cm4all.com>
|
* author: Max Kellermann <mk@cm4all.com>
|
||||||
|
@ -30,10 +30,9 @@
|
||||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef NET_HOST_PARSER_HXX
|
#pragma once
|
||||||
#define NET_HOST_PARSER_HXX
|
|
||||||
|
|
||||||
#include "util/StringView.hxx"
|
#include <string_view>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Result type for ExtractHost().
|
* Result type for ExtractHost().
|
||||||
|
@ -44,7 +43,7 @@ struct ExtractHostResult {
|
||||||
*
|
*
|
||||||
* If nothing was parsed, then this is nullptr.
|
* If nothing was parsed, then this is nullptr.
|
||||||
*/
|
*/
|
||||||
StringView host;
|
std::string_view host;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pointer to the first character that was not parsed. On
|
* Pointer to the first character that was not parsed. On
|
||||||
|
@ -57,7 +56,7 @@ struct ExtractHostResult {
|
||||||
const char *end;
|
const char *end;
|
||||||
|
|
||||||
constexpr bool HasFailed() const noexcept {
|
constexpr bool HasFailed() const noexcept {
|
||||||
return host == nullptr;
|
return host.data() == nullptr;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -71,5 +70,3 @@ struct ExtractHostResult {
|
||||||
[[gnu::pure]]
|
[[gnu::pure]]
|
||||||
ExtractHostResult
|
ExtractHostResult
|
||||||
ExtractHost(const char *src) noexcept;
|
ExtractHost(const char *src) noexcept;
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -108,11 +108,11 @@ Resolve(const char *host_and_port, int default_port,
|
||||||
if (eh.HasFailed())
|
if (eh.HasFailed())
|
||||||
throw std::runtime_error("Failed to extract host name");
|
throw std::runtime_error("Failed to extract host name");
|
||||||
|
|
||||||
if (eh.host.size >= sizeof(buffer))
|
if (eh.host.size() >= sizeof(buffer))
|
||||||
throw std::runtime_error("Host name too long");
|
throw std::runtime_error("Host name too long");
|
||||||
|
|
||||||
memcpy(buffer, eh.host.data, eh.host.size);
|
memcpy(buffer, eh.host.data(), eh.host.size());
|
||||||
buffer[eh.host.size] = 0;
|
buffer[eh.host.size()] = 0;
|
||||||
host = buffer;
|
host = buffer;
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
|
|
Loading…
Reference in New Issue