x_callback_url.cc 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ios/chrome/common/x_callback_url.h"
  5. #include "base/check.h"
  6. #include "base/strings/escape.h"
  7. #include "base/strings/strcat.h"
  8. #include "base/strings/string_util.h"
  9. #include "net/base/url_util.h"
  10. namespace {
  11. const char kXCallbackURLHost[] = "x-callback-url";
  12. const char kSuccessURLParameterName[] = "x-success";
  13. const char kErrorURLParameterName[] = "x-error";
  14. const char kCancelURLParameterName[] = "x-cancel";
  15. } // namespace
  16. bool IsXCallbackURL(const GURL& url) {
  17. if (!url.is_valid())
  18. return false;
  19. if (url.IsStandard())
  20. return url.host_piece() == kXCallbackURLHost;
  21. base::StringPiece path_piece = url.path_piece();
  22. if (base::StartsWith(path_piece, "//"))
  23. path_piece = path_piece.substr(2, base::StringPiece::npos);
  24. size_t pos = path_piece.find('/', 0);
  25. if (pos != base::StringPiece::npos)
  26. path_piece = path_piece.substr(0, pos);
  27. return path_piece == kXCallbackURLHost;
  28. }
  29. GURL CreateXCallbackURL(base::StringPiece scheme, base::StringPiece action) {
  30. return CreateXCallbackURLWithParameters(scheme, action, GURL(), GURL(),
  31. GURL(),
  32. std::map<std::string, std::string>());
  33. }
  34. GURL CreateXCallbackURLWithParameters(
  35. base::StringPiece scheme,
  36. base::StringPiece action,
  37. const GURL& success_url,
  38. const GURL& error_url,
  39. const GURL& cancel_url,
  40. const std::map<std::string, std::string>& parameters) {
  41. DCHECK(!scheme.empty());
  42. GURL url(base::StrCat({scheme, "://", kXCallbackURLHost, "/", action}));
  43. if (success_url.is_valid()) {
  44. url = net::AppendQueryParameter(url, kSuccessURLParameterName,
  45. success_url.spec());
  46. }
  47. if (error_url.is_valid()) {
  48. url = net::AppendQueryParameter(url, kErrorURLParameterName,
  49. error_url.spec());
  50. }
  51. if (cancel_url.is_valid()) {
  52. url = net::AppendQueryParameter(url, kCancelURLParameterName,
  53. cancel_url.spec());
  54. }
  55. if (!parameters.empty()) {
  56. for (const auto& pair : parameters) {
  57. url = net::AppendQueryParameter(url, pair.first, pair.second);
  58. }
  59. }
  60. DCHECK(IsXCallbackURL(url));
  61. return url;
  62. }
  63. std::map<std::string, std::string> ExtractQueryParametersFromXCallbackURL(
  64. const GURL& x_callback_url) {
  65. DCHECK(IsXCallbackURL(x_callback_url));
  66. std::map<std::string, std::string> parameters;
  67. net::QueryIterator query_iterator(x_callback_url);
  68. while (!query_iterator.IsAtEnd()) {
  69. parameters.insert(std::make_pair(query_iterator.GetKey(),
  70. query_iterator.GetUnescapedValue()));
  71. query_iterator.Advance();
  72. }
  73. return parameters;
  74. }