d24a6a098bbd972fc1b9e41ad7cdfb9a9b6ea901
[mono.git] / mcs / class / RabbitMQ.Client / src / client / impl / RedirectException.cs
1 // This source code is dual-licensed under the Apache License, version
2 // 2.0, and the Mozilla Public License, version 1.1.
3 //
4 // The APL v2.0:
5 //
6 //---------------------------------------------------------------------------
7 //   Copyright (C) 2007, 2008 LShift Ltd., Cohesive Financial
8 //   Technologies LLC., and Rabbit Technologies Ltd.
9 //
10 //   Licensed under the Apache License, Version 2.0 (the "License");
11 //   you may not use this file except in compliance with the License.
12 //   You may obtain a copy of the License at
13 //
14 //       http://www.apache.org/licenses/LICENSE-2.0
15 //
16 //   Unless required by applicable law or agreed to in writing, software
17 //   distributed under the License is distributed on an "AS IS" BASIS,
18 //   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 //   See the License for the specific language governing permissions and
20 //   limitations under the License.
21 //---------------------------------------------------------------------------
22 //
23 // The MPL v1.1:
24 //
25 //---------------------------------------------------------------------------
26 //   The contents of this file are subject to the Mozilla Public License
27 //   Version 1.1 (the "License"); you may not use this file except in
28 //   compliance with the License. You may obtain a copy of the License at
29 //   http://www.rabbitmq.com/mpl.html
30 //
31 //   Software distributed under the License is distributed on an "AS IS"
32 //   basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
33 //   License for the specific language governing rights and limitations
34 //   under the License.
35 //
36 //   The Original Code is The RabbitMQ .NET Client.
37 //
38 //   The Initial Developers of the Original Code are LShift Ltd.,
39 //   Cohesive Financial Technologies LLC., and Rabbit Technologies Ltd.
40 //
41 //   Portions created by LShift Ltd., Cohesive Financial Technologies
42 //   LLC., and Rabbit Technologies Ltd. are Copyright (C) 2007, 2008
43 //   LShift Ltd., Cohesive Financial Technologies LLC., and Rabbit
44 //   Technologies Ltd.;
45 //
46 //   All Rights Reserved.
47 //
48 //   Contributor(s): ______________________________________.
49 //
50 //---------------------------------------------------------------------------
51 using System;
52
53 using RabbitMQ.Client;
54
55 namespace RabbitMQ.Client.Impl
56 {
57     /// <summary> Instances of RedirectException are thrown by
58     /// ConnectionBase.Open when the broker returns a
59     /// Connection.Redirect method. The ConnectionFactory catches the
60     /// exception and arranges for the redirect to take
61     /// place. </summary>
62     public class RedirectException: Exception
63     {
64         public AmqpTcpEndpoint m_host;
65         public AmqpTcpEndpoint[] m_knownHosts;
66
67         ///<summary>The host we were redirected to. Try connecting to
68         ///this first.</summary>
69         public AmqpTcpEndpoint Host { get { return m_host; } }
70
71         ///<summary>Other hosts the broker knows about. If connecting
72         ///to Host fails, try some of these.</summary>
73         public AmqpTcpEndpoint[] KnownHosts { get { return m_knownHosts; } }
74
75         ///<summary>Uses AmqpTcpEndpoint.Parse and .ParseMultiple to
76         ///convert the strings, and then passes them to the other
77         ///overload of the constructor.</summary>
78         public RedirectException(IProtocol protocol,
79                                  string host,
80                                  string knownHosts)
81             : this(ParseHost(protocol, host),
82                    AmqpTcpEndpoint.ParseMultiple(protocol, knownHosts))
83         {}
84
85         public RedirectException(AmqpTcpEndpoint host, AmqpTcpEndpoint[] knownHosts)
86             : base(string.Format("The connection.open attempt was redirected to host '{0}'",
87                                  host))
88         {
89             m_host = host;
90             m_knownHosts = knownHosts;
91         }
92
93         ///<summary>Conservative extension to the spec, supporting
94         ///multiple interfaces in the "host" field of the
95         ///connection.redirect method.</summary>
96         ///<remarks>
97         /// We use ParseMultiple rather than Parse, because a single
98         /// host may have multiple interfaces. The spec doesn't say
99         /// what to do here, so this is a conservative extension (as
100         /// in, if a broker only returns a single address, we handle
101         /// that fine). We arbitrarily take the first element of the
102         /// array.
103         ///</remarks>
104         public static AmqpTcpEndpoint ParseHost(IProtocol protocol, string host) {
105             AmqpTcpEndpoint[] addresses = AmqpTcpEndpoint.ParseMultiple(protocol, host);
106             if (addresses.Length == 0) {
107                 return AmqpTcpEndpoint.Parse(protocol, "");
108                 // ^^ effectively, a (kind of useless) default or null result
109             } else {
110                 return addresses[0];
111             }
112         }
113     }
114 }