20 #include "awsendpoint.h"
21 #include "awsendpoint_p.h"
25 #include <QMutexLocker>
78 d->hostName = QString::fromUtf8(hostName);
164 const Transports transport)
180 if ((endpointInfo.
transports & HTTPS) && (transport & HTTPS))
181 url.setScheme(QLatin1String(
"https"));
182 else if ((endpointInfo.
transports & HTTP) && (transport & HTTP))
183 url.setScheme(QLatin1String(
"http"));
284 const QHash<QString, AwsEndpointPrivate::ServiceInfo>::const_iterator
307 return d->regionName;
320 return d->serviceName;
355 if (transport == AnyTransport) {
362 regions.append(regionName);
381 if (transport == AnyTransport) {
385 QStringList serviceNames;
387 for (AwsEndpointPrivate::RegionServices::const_iterator iter = services.constBegin(); iter != services.constEnd(); ++iter) {
388 if (iter.value().transports & transport)
389 serviceNames.append(iter.key());
439 QMutexLocker locker(&
mutex);
440 if (!
hosts.empty()) {
445 QFile file(fileName);
465 QMutexLocker locker(&
mutex);
466 if (!
hosts.empty()) {
471 if ((!device.isOpen()) && (!device.open(QIODevice::ReadOnly))) {
472 qWarning() <<
"AwsEndpoint:" << device.errorString();
477 QXmlStreamReader xml(&device);
497 QMutexLocker locker(&
mutex);
498 if (!
hosts.empty()) {
503 while (xml.readNextStartElement()) {
504 if (xml.name() == QLatin1String(
"Regions")) {
506 }
else if (xml.name() == QLatin1String(
"Services")) {
508 }
else if (xml.name() != QLatin1String(
"XML")) {
509 qDebug() << Q_FUNC_INFO <<
"ignoring" << xml.name();
512 if (xml.hasError()) {
513 qWarning() <<
"AwsEndpoint:" << xml.errorString();
515 Q_ASSERT(!xml.hasError());
516 Q_ASSERT(!
hosts.isEmpty());
556 while ((!xml.atEnd()) && (xml.readNextStartElement())) {
557 if (xml.name() == QLatin1String(
"Name")) {
558 regionName = xml.readElementText();
559 }
else if (xml.name() == QLatin1String(
"Endpoint")) {
560 Q_ASSERT(!regionName.isEmpty());
563 while ((!xml.atEnd()) && (xml.readNextStartElement())) {
564 if (xml.name() == QLatin1String(
"ServiceName")) {
565 serviceName = xml.readElementText();
566 }
else if (xml.name() == QLatin1String(
"Http")) {
567 if (xml.readElementText() == QLatin1String(
"true")) {
568 endpoint.transports |= AwsEndpoint::HTTP;
570 }
else if (xml.name() == QLatin1String(
"Https")) {
571 if (xml.readElementText() == QLatin1String(
"true")) {
572 endpoint.transports |= AwsEndpoint::HTTPS;
574 }
else if (xml.name() == QLatin1String(
"Hostname")) {
575 endpoint.hostName = xml.readElementText();
577 qDebug() << Q_FUNC_INFO <<
"ignoring" << xml.name();
578 xml.skipCurrentElement();
581 Q_ASSERT(!serviceName.isEmpty());
583 if (serviceName == QLatin1String(
"email")) {
584 endpoint.transports |= AwsEndpoint::SMTP;
587 Q_ASSERT((!
hosts.contains(endpoint.hostName)) || (
hosts.value(endpoint.hostName).serviceName ==
serviceName));
588 hosts[endpoint.hostName].regionNames.append(regionName);
593 qDebug() << Q_FUNC_INFO <<
"ignoring" << xml.name();
594 xml.skipCurrentElement();
616 while ((!xml.atEnd()) && (xml.readNextStartElement())) {
617 if (xml.name() == QLatin1String(
"Region")) {
620 qDebug() << Q_FUNC_INFO <<
"ignoring" << xml.name();
621 xml.skipCurrentElement();
657 while ((!xml.atEnd()) && (xml.readNextStartElement())) {
658 if (xml.name() == QLatin1String(
"Name")) {
659 serviceName = xml.readElementText();
660 }
else if (xml.name() == QLatin1String(
"FullName")) {
661 Q_ASSERT(!serviceName.isEmpty());
663 }
else if (xml.name() == QLatin1String(
"RegionName")) {
664 Q_ASSERT(!serviceName.isEmpty());
665 const QString &
regionName = xml.readElementText();
669 qDebug() << Q_FUNC_INFO <<
"ignoring" << xml.name();
670 xml.skipCurrentElement();
691 while ((!xml.atEnd()) && (xml.readNextStartElement())) {
692 if (xml.name() == QLatin1String(
"Service")) {
695 qDebug() << Q_FUNC_INFO <<
"ignoring" << xml.name();
696 xml.skipCurrentElement();
AwsEndpoint(const QByteArray &hostName)
Constructs a new AwsEndpoint object.
AwsEndpointPrivate(AwsEndpoint *const q)
Constructs a new AwsEndpointPrivate object.
QString hostName() const
Get the name of host represented by this endpoint.
bool isValid() const
Is this endpoint valid?
static QMutex mutex
Mutex for protecting access to static members.
static QStringList supportedServices(const QString ®ionName, const Transports transport=AnyTransport)
Get a list of services that support a given region.
Transport
Network transport supported by one or more AWS endpoints.
QString fullServiceName() const
Get this endpoint's full service name.
QHash< QString, RegionEndpointInfo > RegionServices
Hash of service names to RegionEndpointInfo.
QString serviceName() const
Get this endpoint's service name.
static QHash< QString, RegionInfo > regions
Hash of region names to RegionInfo.
QString regionName
This endpoint's region name.
QStringList supportedRegions(const Transports transport=AnyTransport) const
Get the full list of regions this endpoint supports.
QString regionName() const
Get this endpoint's primary region name.
Provides AWS endpoint information.
AwsEndpoint::Transports transports
Transports supported by this AWS endpoint.
QString serviceName
This endpoint's service name.
static void parseServices(QXmlStreamReader &xml)
Parse a Services element from Amazon's endpoint XML data.
static void loadEndpointData(const QString &fileName=QLatin1String(":/aws/endpoints.xml"))
Load endpoint data.
AwsEndpointPrivate *const d_ptr
Internal d-pointer.
static bool isSupported(const QString ®ionName, const QString &serviceName, const Transports transport=AnyTransport)
Is a region / service / transport combination supported by Amazon?
static void parseRegion(QXmlStreamReader &xml)
Parse a Region element from Amazon's endpoint XML data.
Private implementation for AwsEndpoint.
~AwsEndpoint()
AwsEndpoint destructor.
static QUrl getEndpoint(const QString ®ionName, const QString &serviceName, const Transports transport=AnyTransport)
Get a QUrl for an AWS endpoint.
static QHash< QString, ServiceInfo > services
Hash of service names to ServiceInfo.
QString hostName
AWS endpoint's hostname.
The per-region endpoint-specific information to load from the endpoints.xml file. ...
static void parseRegions(QXmlStreamReader &xml)
Parse a Regions element from Amazon's endpoint XML data.
static QHash< QString, HostInfo > hosts
Hash of hostnames to HostInfo.
static void parseService(QXmlStreamReader &xml)
Parse a Service element from Amazon's endpoint XML data.