libqtaws  0.1.0
UnofficialAWSlibraryforQt-InternalDocumentation
Public Member Functions | Protected Attributes | Friends | List of all members
AwsAbstractSignaturePrivate Class Reference

Private implementation for AwsAbstractSignature. More...

Inheritance diagram for AwsAbstractSignaturePrivate:
Inheritance graph
[legend]
Collaboration diagram for AwsAbstractSignaturePrivate:
Collaboration graph
[legend]

Public Member Functions

virtual ~AwsAbstractSignaturePrivate ()
 AwsAbstractSignaturePrivate destructor. More...
 
 AwsAbstractSignaturePrivate (AwsAbstractSignature *const q)
 Constructs a new AwsAbstractSignaturePrivate object. More...
 
QString canonicalPath (const QUrl &url) const
 Create an AWS Signature canonical path. More...
 
QByteArray canonicalQuery (const QUrlQuery &query) const
 Create an AWS Signature canonical query. More...
 
QString httpMethod (const QNetworkAccessManager::Operation operation) const
 Create an AWS Signature request method string. More...
 
bool setQueryItem (QUrlQuery &query, const QString &key, const QString &value, const bool warnOnNonIdenticalDuplicate=true) const
 Set a query item, checking for existing values first. More...
 

Protected Attributes

AwsAbstractSignature *const q_ptr
 Internal q-pointer.
 

Friends

class TestAwsAbstractSignature
 

Detailed Description

Private implementation for AwsAbstractSignature.

Warning
This is an internal private implementation class, and as such external should code should not depend directly on anything contained within this class.

Definition at line 32 of file awsabstractsignature_p.h.

Constructor & Destructor Documentation

AwsAbstractSignaturePrivate::~AwsAbstractSignaturePrivate ( )
virtual

AwsAbstractSignaturePrivate destructor.

This virtual destructor does nothing (yet) - its here to allow for safe polymorphic destruction.

Definition at line 116 of file awsabstractsignature.cpp.

117 {
118 
119 }
AwsAbstractSignaturePrivate::AwsAbstractSignaturePrivate ( AwsAbstractSignature *const  q)

Constructs a new AwsAbstractSignaturePrivate object.

Parameters
qPointer to this object's public AwsAbstractSignature instance.

Definition at line 103 of file awsabstractsignature.cpp.

103  : q_ptr(q)
104 {
105 
106 }
AwsAbstractSignature *const q_ptr
Internal q-pointer.

Member Function Documentation

QString AwsAbstractSignaturePrivate::canonicalPath ( const QUrl &  url) const

Create an AWS Signature canonical path.

This function simply returns the fully-URL-encoded path. However, if the path is empty, then a single '/' is returned, as is required by Amazon for both V2 and V4 signatures (and presumably other versions too).

Parameters
urlURL from which to extract the path.
Returns
An AWS Signature canonical path.
See also
http://docs.aws.amazon.com/general/latest/gr/signature-version-2.html
http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html

Definition at line 135 of file awsabstractsignature.cpp.

Referenced by AwsSignatureV2Private::canonicalRequest(), AwsSignatureV3Private::canonicalRequest(), and AwsSignatureV4Private::canonicalRequest().

136 {
137  QString path = QDir::cleanPath(QLatin1Char('/') + url.path(QUrl::FullyEncoded));
138 
139  // If the path begins with "//", remove one of the redundant slashes.
140  // Note, this is only needed on Windows, because there QDir::speparator is
141  // '\', and internally QDir::cleanPath swaps all separators to '/', before
142  // calling qt_normalizePathSegments with allowUncPaths set to true, so that
143  // '//' is preserved to allow of Windows UNC paths beginning with '\\'.
144  // This should probably be reported as a bug in Qt::cleanPath("//...").
145 #ifdef Q_OS_WIN
146  if (path.startsWith(QLatin1String("//"))) {
147  path.remove(0, 1); // Remove the first of two forward slashes.
148  }
149 #endif
150 
151  // Restore the trailing '/' if QDir::cleanPath (rightly) removed one.
152  if ((url.path().endsWith(QLatin1Char('/'))) && (!path.endsWith(QLatin1Char('/')))) {
153  path += QLatin1Char('/');
154  }
155 
156  return path;
157 }
QByteArray AwsAbstractSignaturePrivate::canonicalQuery ( const QUrlQuery &  query) const

Create an AWS Signature canonical query.

This function returns an HTTP query string in Amazon's canonical form. That is, all query parameters are sorted by keys (but not keys-then-values), then joined with & separators, in key=value pairs with both keys and values being URL percent encoded.

Note
The canonical form produced by this function is used by Amazon's later signature formats (versions 2, 3 and 4), but not their earlier formats (versions 0 and 1).
Parameters
queryQuery to encode the HTTP query string from.
Returns
An AWS Signature canonical query string.
See also
http://docs.aws.amazon.com/general/latest/gr/signature-version-2.html
http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html

Definition at line 178 of file awsabstractsignature.cpp.

Referenced by AwsSignatureV2Private::canonicalRequest(), AwsSignatureV3Private::canonicalRequest(), and AwsSignatureV4Private::canonicalRequest().

179 {
180  typedef QPair<QString, QString> QStringPair;
181  QList<QStringPair> list = query.queryItems(QUrl::FullyDecoded);
182  qSort(list);
183  QString result;
184  foreach (const QStringPair &pair, list) {
185  if (!result.isEmpty()) result += QLatin1Char('&');
186  result += QString::fromUtf8(QUrl::toPercentEncoding(pair.first)) + QLatin1Char('=') +
187  QString::fromUtf8(QUrl::toPercentEncoding(pair.second));
188  }
189  return result.toUtf8();
190 }
QString AwsAbstractSignaturePrivate::httpMethod ( const QNetworkAccessManager::Operation  operation) const

Create an AWS Signature request method string.

This function simply converts QNetworkAccessManager operations (enum values) to strings appropriate to use in AWS signatures.

Parameters
operationThe network operation to convert to string.
Returns
A string representation of operation, or an empty string if the operation is not recognised or otherwise unsupported.

Definition at line 203 of file awsabstractsignature.cpp.

Referenced by AwsSignatureV2Private::canonicalRequest(), AwsSignatureV3Private::canonicalRequest(), and AwsSignatureV4Private::canonicalRequest().

204 {
205  switch (operation) {
206  case QNetworkAccessManager::DeleteOperation: return QLatin1String("DELETE");
207  case QNetworkAccessManager::HeadOperation: return QLatin1String("HEAD");
208  case QNetworkAccessManager::GetOperation: return QLatin1String("GET");
209  case QNetworkAccessManager::PostOperation: return QLatin1String("POST");
210  case QNetworkAccessManager::PutOperation: return QLatin1String("PUT");
211  case QNetworkAccessManager::CustomOperation: // Fall through.
212  default:
213  // Catch this in debug mode for easier development / debugging.
214  Q_ASSERT_X(false, Q_FUNC_INFO, "invalid operation");
215  }
216  return QString(); // Operation was invalid / unsupported.
217 }
bool AwsAbstractSignaturePrivate::setQueryItem ( QUrlQuery &  query,
const QString &  key,
const QString &  value,
const bool  warnOnNonIdenticalDuplicate = true 
) const

Set a query item, checking for existing values first.

This function is a light wrapper around QUrlQuery::addQueryItem() that first checks for existing values. Existing values will not be overwritten, instead if existing values are found, this function will simply check if the exsting value matches the desired value, and if not, will return false and optionally (according to warnOnNonIdenticalDuplicate) issue a qWarning().

Typically, when setting something that must be a specific value, such as an access key ID, warnOnNonIdenticalDuplicate would be true. However, when setting query items as a fall-back default, such as a current timestamp, warnOnNonIdenticalDuplicate would typically be set to false.

Parameters
queryURL query to add the query item to.
keyQuery item key to add to query.
valueQuery item value to add to query.
warnOnNonIdenticalDuplicateIf true, and an exisiting key value is found in query that has a value other than value, then a qWarning() is issued, otherwise the duplicate is silently ignored.
Returns
true if the query item was set successfully or was already set to the requested value previously, false otherwise.

Definition at line 244 of file awsabstractsignature.cpp.

Referenced by AwsSignatureV0Private::adornRequest(), and AwsSignatureV2Private::adornRequest().

246 {
247  if (query.hasQueryItem(key)) {
248  const QString existingValue = query.queryItemValue(key, QUrl::FullyEncoded);
249  const bool existingQueryItemIsIdentical = (existingValue == value);
250  if ((warnOnNonIdenticalDuplicate) && (!existingQueryItemIsIdentical)) {
251  qWarning() << "AwsAbstractSignature::setQueryItem Not overwriting existing value for key"
252  << key << ':' << existingValue;
253  }
254  return existingQueryItemIsIdentical;
255  }
256  query.addQueryItem(key, value);
257  return true;
258 }

The documentation for this class was generated from the following files: