// This source code is dual-licensed under the Apache License, version
// 2.0, and the Mozilla Public License, version 1.1.
//
// The APL v2.0:
//
//---------------------------------------------------------------------------
// Copyright (C) 2007-2009 LShift Ltd., Cohesive Financial
// Technologies LLC., and Rabbit Technologies Ltd.
//
// Licensed 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.
//---------------------------------------------------------------------------
//
// The MPL v1.1:
//
//---------------------------------------------------------------------------
// The contents of this file are subject to the Mozilla Public License
// Version 1.1 (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.rabbitmq.com/mpl.html
//
// Software distributed under the License is distributed on an "AS IS"
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
// License for the specific language governing rights and limitations
// under the License.
//
// The Original Code is The RabbitMQ .NET Client.
//
// The Initial Developers of the Original Code are LShift Ltd,
// Cohesive Financial Technologies LLC, and Rabbit Technologies Ltd.
//
// Portions created before 22-Nov-2008 00:00:00 GMT by LShift Ltd,
// Cohesive Financial Technologies LLC, or Rabbit Technologies Ltd
// are Copyright (C) 2007-2008 LShift Ltd, Cohesive Financial
// Technologies LLC, and Rabbit Technologies Ltd.
//
// Portions created by LShift Ltd are Copyright (C) 2007-2009 LShift
// Ltd. Portions created by Cohesive Financial Technologies LLC are
// Copyright (C) 2007-2009 Cohesive Financial Technologies
// LLC. Portions created by Rabbit Technologies Ltd are Copyright
// (C) 2007-2009 Rabbit Technologies Ltd.
//
// All Rights Reserved.
//
// Contributor(s): ______________________________________.
//
//---------------------------------------------------------------------------
using System;
using RabbitMQ.Client;
namespace RabbitMQ.Client.Impl
{
/// Instances of RedirectException are thrown by
/// ConnectionBase.Open when the broker returns a
/// Connection.Redirect method. The ConnectionFactory catches the
/// exception and arranges for the redirect to take
/// place.
public class RedirectException: Exception
{
public AmqpTcpEndpoint m_host;
public AmqpTcpEndpoint[] m_knownHosts;
///The host we were redirected to. Try connecting to
///this first.
public AmqpTcpEndpoint Host { get { return m_host; } }
///Other hosts the broker knows about. If connecting
///to Host fails, try some of these.
public AmqpTcpEndpoint[] KnownHosts { get { return m_knownHosts; } }
///Uses AmqpTcpEndpoint.Parse and .ParseMultiple to
///convert the strings, and then passes them to the other
///overload of the constructor.
public RedirectException(IProtocol protocol,
string host,
string knownHosts)
: this(ParseHost(protocol, host),
AmqpTcpEndpoint.ParseMultiple(protocol, knownHosts))
{}
public RedirectException(AmqpTcpEndpoint host, AmqpTcpEndpoint[] knownHosts)
: base(string.Format("The connection.open attempt was redirected to host '{0}'",
host))
{
m_host = host;
m_knownHosts = knownHosts;
}
///Conservative extension to the spec, supporting
///multiple interfaces in the "host" field of the
///connection.redirect method.
///
/// We use ParseMultiple rather than Parse, because a single
/// host may have multiple interfaces. The spec doesn't say
/// what to do here, so this is a conservative extension (as
/// in, if a broker only returns a single address, we handle
/// that fine). We arbitrarily take the first element of the
/// array.
///
public static AmqpTcpEndpoint ParseHost(IProtocol protocol, string host) {
AmqpTcpEndpoint[] addresses = AmqpTcpEndpoint.ParseMultiple(protocol, host);
if (addresses.Length == 0) {
return AmqpTcpEndpoint.Parse(protocol, "");
// ^^ effectively, a (kind of useless) default or null result
} else {
return addresses[0];
}
}
}
}