mirror of
https://github.com/esiur/esiur-dotnet.git
synced 2026-09-08 10:10:49 +00:00
Revisions
This commit is contained in:
@@ -63,8 +63,8 @@ public static class ConfigurationResolver
|
||||
static readonly string[] ValidSchemes = ["ep", "eps", "ws", "wss"];
|
||||
|
||||
/// <summary>
|
||||
/// Accepts <c>ep(s)://host:port</c> (a bare Esiur endpoint, connects at the
|
||||
/// WebSocket root) as well as <c>ws(s)://host:port/path</c> (for hosts like
|
||||
/// Accepts <c>ep(s)://host[:port]</c> (a bare Esiur endpoint, connects at the
|
||||
/// WebSocket root) as well as <c>ws(s)://host[:port]/path</c> (for hosts like
|
||||
/// ASP.NET Core's <c>MapEsiur("/esiur")</c> that mount the WebSocket route
|
||||
/// somewhere other than root) — see <see cref="EndpointParser"/> for how
|
||||
/// the two forms are dialed.
|
||||
@@ -75,37 +75,12 @@ public static class ConfigurationResolver
|
||||
|| !ValidSchemes.Contains(uri.Scheme, StringComparer.OrdinalIgnoreCase)
|
||||
|| string.IsNullOrWhiteSpace(uri.Host)
|
||||
|| !string.IsNullOrEmpty(uri.UserInfo)
|
||||
|| !HasExplicitPort(endpoint))
|
||||
|| uri.Port == 0
|
||||
|| uri.Port > ushort.MaxValue)
|
||||
throw new CliException(
|
||||
$"Endpoint \"{endpoint}\" is not a valid ep:// or ws:// endpoint with an explicit port.",
|
||||
$"Endpoint \"{endpoint}\" is not a valid ep:// or ws:// endpoint.",
|
||||
ExitCodes.InvalidArguments);
|
||||
}
|
||||
|
||||
static bool HasExplicitPort(string endpoint)
|
||||
{
|
||||
var schemeEnd = endpoint.IndexOf("://", StringComparison.Ordinal);
|
||||
if (schemeEnd < 0)
|
||||
return false;
|
||||
|
||||
var authorityStart = schemeEnd + 3;
|
||||
var authorityEnd = endpoint.IndexOfAny(['/', '?', '#'], authorityStart);
|
||||
if (authorityEnd < 0)
|
||||
authorityEnd = endpoint.Length;
|
||||
|
||||
var authority = endpoint[authorityStart..authorityEnd];
|
||||
var at = authority.LastIndexOf('@');
|
||||
if (at >= 0)
|
||||
authority = authority[(at + 1)..];
|
||||
|
||||
var colon = authority.StartsWith('[')
|
||||
? authority.IndexOf(']') + 1
|
||||
: authority.LastIndexOf(':');
|
||||
return colon > 0
|
||||
&& colon < authority.Length - 1
|
||||
&& authority[colon] == ':'
|
||||
&& ushort.TryParse(authority[(colon + 1)..], out var port)
|
||||
&& port > 0;
|
||||
}
|
||||
}
|
||||
|
||||
public static class DurationParser
|
||||
|
||||
@@ -19,13 +19,13 @@ Runtime-specific publishes are configured as self-contained, single-file, and no
|
||||
Create and verify a password-authenticated profile:
|
||||
|
||||
```console
|
||||
esiur login production "ep://host:${ESIUR_PORT}" --provider password --identity ahmed
|
||||
esiur login production "ep://host" --provider password --identity ahmed
|
||||
```
|
||||
|
||||
The password prompt does not echo input. For automation, supply it on standard input:
|
||||
|
||||
```console
|
||||
printf '%s' "$ESIUR_PASSWORD" | esiur login production "ep://host:${ESIUR_PORT}" \
|
||||
printf '%s' "$ESIUR_PASSWORD" | esiur login production "ep://host" \
|
||||
--provider password --identity ahmed --password-stdin
|
||||
```
|
||||
|
||||
@@ -86,7 +86,7 @@ Every operational command accepts a saved profile or a temporary endpoint:
|
||||
|
||||
```console
|
||||
esiur --profile production describe sys/service
|
||||
esiur --endpoint "ep://host:${ESIUR_PORT}" query sys --output json
|
||||
esiur --endpoint "ep://host" query sys --output json
|
||||
esiur get sys/service Name --timeout 30s
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user