stripe_form_encoder.cpp 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #include "stripe/stripe_form_encoder.h"
  8. #include <QStringList>
  9. #include <QUrl>
  10. #include <vector>
  11. namespace Stripe {
  12. QByteArray FormEncoder::formEncodedDataForObject(
  13. FormEncodable &&object) {
  14. const auto root = object.rootObjectName();
  15. const auto values = object.formFieldValues();
  16. auto result = QByteArray();
  17. auto keys = std::vector<QString>();
  18. for (const auto &[key, value] : values) {
  19. if (!value.isEmpty()) {
  20. keys.push_back(key);
  21. }
  22. }
  23. std::sort(begin(keys), end(keys));
  24. const auto encode = [](const QString &value) {
  25. return QUrl::toPercentEncoding(value);
  26. };
  27. for (const auto &key : keys) {
  28. const auto fullKey = root.isEmpty() ? key : (root + '[' + key + ']');
  29. if (!result.isEmpty()) {
  30. result += '&';
  31. }
  32. result += encode(fullKey) + '=' + encode(values.at(key));
  33. }
  34. return result;
  35. }
  36. } // namespace Stripe