blob: fc08185841cf74a83b471d7829453163ff68f473 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.IO;
using Apache.Qpid.Proton.Types;
namespace Apache.Qpid.Proton.Client.Implementation
{
/// <summary>
/// Support class that houses the information and API needed to process
/// redirection information sent from a remote.
/// </summary>
public sealed class ClientRedirect
{
private readonly Dictionary<Symbol, object> redirect;
internal ClientRedirect(IEnumerable<KeyValuePair<Symbol, object>> redirect)
{
this.redirect = new Dictionary<Symbol, object>(redirect);
}
public ClientRedirect Validate()
{
object networkHost = null;
if (!redirect.TryGetValue(ClientConstants.NETWORK_HOST, out networkHost))
{
throw new IOException("Redirection information not set, missing network host.");
}
if (networkHost is not string)
{
throw new IOException("Redirection information not correctly set, unknown network host type.");
}
int networkPort;
try
{
networkPort = Int32.Parse(redirect[ClientConstants.PORT].ToString());
}
catch (Exception)
{
throw new IOException("Redirection information contained invalid port.");
}
// TODO LOG.trace("Redirect issued host and port as follows: {}:{}", networkHost, networkPort);
return this;
}
/// <summary>
/// Access the dictionary with remote supplied redirection information
/// </summary>
public IReadOnlyDictionary<Symbol, object> RedirectMap => redirect;
/// <summary>
/// Access the supplied host value in the redirection information.
/// </summary>
public string Hostname => redirect[ClientConstants.OPEN_HOSTNAME].ToString();
/// <summary>
/// Access the supplied DNS host value or IP Address in the redirection information.
/// </summary>
public string NetworkHostname => redirect[ClientConstants.NETWORK_HOST].ToString();
/// <summary>
/// Access the supplied remote port in the redirection information.
/// </summary>
public int Port => Int32.Parse(redirect[ClientConstants.PORT].ToString());
/// <summary>
/// Access the supplied scheme that the remote indicated the redirect connection should use.
/// </summary>
public string Scheme => redirect[ClientConstants.SCHEME].ToString();
/// <summary>
/// Access the supplied path that the remote indicated the redirect connection should use.
/// </summary>
public string Path => redirect[ClientConstants.PATH].ToString();
/// <summary>
/// Access the supplied address that the remote indicated the redirected link should use.
/// </summary>
public string Address => redirect[ClientConstants.ADDRESS].ToString();
public override string ToString()
{
try
{
return string.Format("Redirect Host:{0}, Port:{1}", NetworkHostname, Port);
}
catch (Exception)
{
return "<Invalid-Redirect-Value>";
}
}
}
}