Former-commit-id:133dc97f67
[formerlya02aeb236c
] [formerly9f19e3f712
] [formerly06a8b51d6d
[formerly9f19e3f712
[formerly 64fa9254b946eae7e61bbc3f513b7c3696c4f54f]]] Former-commit-id:06a8b51d6d
Former-commit-id:377dcd10b9
[formerly3360eb6c5f
] Former-commit-id:8e80217e59
322 lines
10 KiB
C#
322 lines
10 KiB
C#
/*
|
|
*
|
|
* 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;
|
|
using System.Text;
|
|
using Apache.Qpid.Client.Qms;
|
|
|
|
namespace Apache.Qpid.Client
|
|
{
|
|
public class AmqBrokerInfo : IBrokerInfo
|
|
{
|
|
public readonly string URL_FORMAT_EXAMPLE =
|
|
"<transport>://<hostname>[:<port Default=\""+BrokerInfoConstants.DEFAULT_PORT+"\">][?<option>='<value>'[,<option>='<value>']]";
|
|
|
|
public const long DEFAULT_CONNECT_TIMEOUT = 30000L;
|
|
|
|
private string _host = "localhost";
|
|
private int _port = 5672;
|
|
private string _transport = "amqp";
|
|
private Hashtable _options = new Hashtable();
|
|
private SslOptions _sslOptions;
|
|
|
|
public AmqBrokerInfo()
|
|
{
|
|
}
|
|
|
|
public AmqBrokerInfo(string url)
|
|
{
|
|
// URL should be of format tcp://host:port?option='value',option='value'
|
|
try
|
|
{
|
|
Uri connection = new Uri(url);
|
|
|
|
String transport = connection.Scheme;
|
|
|
|
// Handles some defaults to minimise changes to existing broker URLS e.g. localhost
|
|
if (transport != null)
|
|
{
|
|
transport = transport.ToLower();
|
|
//todo this list of valid transports should be enumerated somewhere
|
|
if ((!(transport.Equals("vm") || transport.Equals("tcp"))))
|
|
{
|
|
if (transport.Equals("localhost"))
|
|
{
|
|
connection = new Uri(BrokerInfoConstants.DEFAULT_TRANSPORT + "://" + url);
|
|
transport = connection.Scheme;
|
|
}
|
|
else
|
|
{
|
|
if (url[transport.Length] == ':' && url[transport.Length + 1] != '/')
|
|
{
|
|
//Then most likely we have a host:port value
|
|
connection = new Uri(BrokerInfoConstants.DEFAULT_TRANSPORT + "://" + url);
|
|
transport = connection.Scheme;
|
|
}
|
|
else
|
|
{
|
|
URLHelper.parseError(0, transport.Length, "Unknown transport", url);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//Default the transport
|
|
connection = new Uri(BrokerInfoConstants.DEFAULT_TRANSPORT + "://" + url);
|
|
transport = connection.Scheme;
|
|
}
|
|
|
|
if (transport == null)
|
|
{
|
|
URLHelper.parseError(-1, "Unknown transport:'" + transport + "'" +
|
|
" In broker URL:'" + url + "' Format: " + URL_FORMAT_EXAMPLE, "");
|
|
}
|
|
|
|
Transport = transport;
|
|
|
|
String host = connection.Host;
|
|
if (!host.Equals("default")) Host = host;
|
|
|
|
int port = connection.Port;
|
|
|
|
if (port == -1)
|
|
{
|
|
// Fix for when there is port data but it is not automatically parseable by getPort().
|
|
String auth = connection.Authority;
|
|
|
|
if (auth != null && auth.IndexOf(':') != -1)
|
|
{
|
|
int start = auth.IndexOf(":") + 1;
|
|
int end = start;
|
|
bool looking = true;
|
|
bool found = false;
|
|
//Walk the authority looking for a port value.
|
|
while (looking)
|
|
{
|
|
try
|
|
{
|
|
end++;
|
|
int.Parse(auth.Substring(start, end-start+1));
|
|
|
|
if (end >= auth.Length)
|
|
{
|
|
looking = false;
|
|
found = true;
|
|
}
|
|
}
|
|
catch (FormatException)
|
|
{
|
|
looking = false;
|
|
}
|
|
|
|
}
|
|
if (found)
|
|
{
|
|
Port = int.Parse(auth.Substring(start, end-start+1));
|
|
}
|
|
else
|
|
{
|
|
URLHelper.parseError(connection.ToString().IndexOf(connection.Authority) + end - 1,
|
|
"Illegal character in port number", connection.ToString());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Port = BrokerInfoConstants.DEFAULT_PORT;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Port = port;
|
|
}
|
|
|
|
String queryString = connection.Query;
|
|
if (queryString.Length > 0 && queryString[0] == '?')
|
|
{
|
|
queryString = queryString.Substring(1);
|
|
}
|
|
|
|
URLHelper.parseOptions(_options, queryString);
|
|
|
|
//Fragment is #string (not used)
|
|
}
|
|
catch (UriFormatException uris)
|
|
{
|
|
throw uris;
|
|
// if (uris is UrlSyntaxException)
|
|
// {
|
|
// throw uris;
|
|
// }
|
|
//
|
|
// URLHelper.parseError(uris.getIndex(), uris.getReason(), uris.getInput());
|
|
}
|
|
}
|
|
|
|
public AmqBrokerInfo(string transport, string host, int port, bool useSSL) : this()
|
|
{
|
|
_transport = transport;
|
|
_host = host;
|
|
_port = port;
|
|
|
|
if (useSSL)
|
|
{
|
|
SetOption(BrokerInfoConstants.OPTIONS_SSL, "true");
|
|
}
|
|
}
|
|
|
|
public AmqBrokerInfo(string transport, string host, int port, SslOptions sslConfig)
|
|
: this()
|
|
{
|
|
_transport = transport;
|
|
_host = host;
|
|
_port = port;
|
|
|
|
if ( sslConfig != null )
|
|
{
|
|
SetOption(BrokerInfoConstants.OPTIONS_SSL, "true");
|
|
_sslOptions = sslConfig;
|
|
}
|
|
}
|
|
|
|
|
|
public string Host
|
|
{
|
|
get { return _host; }
|
|
set { _host = value; }
|
|
}
|
|
|
|
public int Port
|
|
{
|
|
get { return _port; }
|
|
set { _port = value; }
|
|
}
|
|
|
|
public string Transport
|
|
{
|
|
get { return _transport; }
|
|
set { _transport = value; }
|
|
}
|
|
|
|
public SslOptions SslOptions
|
|
{
|
|
get { return _sslOptions; }
|
|
}
|
|
|
|
public string GetOption(string key)
|
|
{
|
|
return (string)_options[key];
|
|
}
|
|
|
|
public void SetOption(string key, string value)
|
|
{
|
|
_options[key] = value;
|
|
}
|
|
|
|
public long Timeout
|
|
{
|
|
get
|
|
{
|
|
if ( _options.ContainsKey(BrokerInfoConstants.OPTIONS_CONNECT_TIMEOUT) )
|
|
{
|
|
try
|
|
{
|
|
return long.Parse(GetOption(BrokerInfoConstants.OPTIONS_CONNECT_TIMEOUT));
|
|
} catch ( FormatException )
|
|
{
|
|
//Do nothing as we will use the default below.
|
|
}
|
|
}
|
|
return BrokerInfoConstants.DEFAULT_CONNECT_TIMEOUT;
|
|
}
|
|
set
|
|
{
|
|
SetOption(BrokerInfoConstants.OPTIONS_CONNECT_TIMEOUT, value.ToString());
|
|
}
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
sb.Append(_transport);
|
|
sb.Append("://");
|
|
|
|
if (!(StringEqualsIgnoreCase(_transport, "vm")))
|
|
{
|
|
sb.Append(_host);
|
|
}
|
|
|
|
sb.Append(':');
|
|
sb.Append(_port);
|
|
|
|
sb.Append(URLHelper.printOptions(_options));
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
if (!(obj is IBrokerInfo))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
IBrokerInfo bd = (IBrokerInfo) obj;
|
|
return StringEqualsIgnoreCase(_host, bd.Host) &&
|
|
_port == bd.Port &&
|
|
StringEqualsIgnoreCase(_transport, bd.Transport) &&
|
|
UseSSL == bd.UseSSL;
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return _host.ToLower().GetHashCode() ^ _port.GetHashCode();
|
|
}
|
|
|
|
// TODO: move to util class.
|
|
private bool StringEqualsIgnoreCase(string one, string two)
|
|
{
|
|
return one.ToLower().Equals(two.ToLower());
|
|
}
|
|
|
|
public bool UseSSL
|
|
{
|
|
get
|
|
{
|
|
// To be friendly to users we should be case insensitive.
|
|
// or simply force users to conform to OPTIONS_SSL
|
|
// todo make case insensitive by trying ssl Ssl sSl ssL SSl SsL sSL SSL
|
|
|
|
if ( _options.ContainsKey(BrokerInfoConstants.OPTIONS_SSL) )
|
|
{
|
|
return StringEqualsIgnoreCase(GetOption(BrokerInfoConstants.OPTIONS_SSL), "true");
|
|
}
|
|
|
|
return false;
|
|
}
|
|
set
|
|
{
|
|
SetOption(BrokerInfoConstants.OPTIONS_SSL, value.ToString());
|
|
}
|
|
}
|
|
}
|
|
}
|