http_auth_challenge_tokenizer_unittest.cc 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. // Copyright 2014 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 "net/http/http_auth_challenge_tokenizer.h"
  5. #include "testing/gtest/include/gtest/gtest.h"
  6. namespace net {
  7. TEST(HttpAuthChallengeTokenizerTest, Basic) {
  8. std::string challenge_str = "Basic realm=\"foobar\"";
  9. HttpAuthChallengeTokenizer challenge(challenge_str.begin(),
  10. challenge_str.end());
  11. HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs();
  12. EXPECT_TRUE(parameters.valid());
  13. EXPECT_EQ(std::string("basic"), challenge.auth_scheme());
  14. EXPECT_TRUE(parameters.GetNext());
  15. EXPECT_TRUE(parameters.valid());
  16. EXPECT_EQ(std::string("realm"), parameters.name());
  17. EXPECT_EQ(std::string("foobar"), parameters.value());
  18. EXPECT_FALSE(parameters.GetNext());
  19. }
  20. // Use a name=value property with no quote marks.
  21. TEST(HttpAuthChallengeTokenizerTest, NoQuotes) {
  22. std::string challenge_str = "Basic realm=foobar@baz.com";
  23. HttpAuthChallengeTokenizer challenge(challenge_str.begin(),
  24. challenge_str.end());
  25. HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs();
  26. EXPECT_TRUE(parameters.valid());
  27. EXPECT_EQ(std::string("basic"), challenge.auth_scheme());
  28. EXPECT_TRUE(parameters.GetNext());
  29. EXPECT_TRUE(parameters.valid());
  30. EXPECT_EQ(std::string("realm"), parameters.name());
  31. EXPECT_EQ(std::string("foobar@baz.com"), parameters.value());
  32. EXPECT_FALSE(parameters.GetNext());
  33. }
  34. // Use a name=value property with mismatching quote marks.
  35. TEST(HttpAuthChallengeTokenizerTest, MismatchedQuotes) {
  36. std::string challenge_str = "Basic realm=\"foobar@baz.com";
  37. HttpAuthChallengeTokenizer challenge(challenge_str.begin(),
  38. challenge_str.end());
  39. HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs();
  40. EXPECT_TRUE(parameters.valid());
  41. EXPECT_EQ(std::string("basic"), challenge.auth_scheme());
  42. EXPECT_TRUE(parameters.GetNext());
  43. EXPECT_TRUE(parameters.valid());
  44. EXPECT_EQ(std::string("realm"), parameters.name());
  45. EXPECT_EQ(std::string("foobar@baz.com"), parameters.value());
  46. EXPECT_FALSE(parameters.GetNext());
  47. }
  48. // Use a name= property without a value and with mismatching quote marks.
  49. TEST(HttpAuthChallengeTokenizerTest, MismatchedQuotesNoValue) {
  50. std::string challenge_str = "Basic realm=\"";
  51. HttpAuthChallengeTokenizer challenge(challenge_str.begin(),
  52. challenge_str.end());
  53. HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs();
  54. EXPECT_TRUE(parameters.valid());
  55. EXPECT_EQ(std::string("basic"), challenge.auth_scheme());
  56. EXPECT_TRUE(parameters.GetNext());
  57. EXPECT_TRUE(parameters.valid());
  58. EXPECT_EQ(std::string("realm"), parameters.name());
  59. EXPECT_EQ(std::string(), parameters.value());
  60. EXPECT_FALSE(parameters.GetNext());
  61. }
  62. // Use a name=value property with mismatching quote marks and spaces in the
  63. // value.
  64. TEST(HttpAuthChallengeTokenizerTest, MismatchedQuotesSpaces) {
  65. std::string challenge_str = "Basic realm=\"foo bar";
  66. HttpAuthChallengeTokenizer challenge(challenge_str.begin(),
  67. challenge_str.end());
  68. HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs();
  69. EXPECT_TRUE(parameters.valid());
  70. EXPECT_EQ(std::string("basic"), challenge.auth_scheme());
  71. EXPECT_TRUE(parameters.GetNext());
  72. EXPECT_TRUE(parameters.valid());
  73. EXPECT_EQ(std::string("realm"), parameters.name());
  74. EXPECT_EQ(std::string("foo bar"), parameters.value());
  75. EXPECT_FALSE(parameters.GetNext());
  76. }
  77. // Use multiple name=value properties with mismatching quote marks in the last
  78. // value.
  79. TEST(HttpAuthChallengeTokenizerTest, MismatchedQuotesMultiple) {
  80. std::string challenge_str = "Digest qop=auth-int, algorithm=md5, realm=\"foo";
  81. HttpAuthChallengeTokenizer challenge(challenge_str.begin(),
  82. challenge_str.end());
  83. HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs();
  84. EXPECT_TRUE(parameters.valid());
  85. EXPECT_EQ(std::string("digest"), challenge.auth_scheme());
  86. EXPECT_TRUE(parameters.GetNext());
  87. EXPECT_TRUE(parameters.valid());
  88. EXPECT_EQ(std::string("qop"), parameters.name());
  89. EXPECT_EQ(std::string("auth-int"), parameters.value());
  90. EXPECT_TRUE(parameters.GetNext());
  91. EXPECT_TRUE(parameters.valid());
  92. EXPECT_EQ(std::string("algorithm"), parameters.name());
  93. EXPECT_EQ(std::string("md5"), parameters.value());
  94. EXPECT_TRUE(parameters.GetNext());
  95. EXPECT_TRUE(parameters.valid());
  96. EXPECT_EQ(std::string("realm"), parameters.name());
  97. EXPECT_EQ(std::string("foo"), parameters.value());
  98. EXPECT_FALSE(parameters.GetNext());
  99. }
  100. // Use a name= property which has no value.
  101. TEST(HttpAuthChallengeTokenizerTest, NoValue) {
  102. std::string challenge_str = "Digest qop=";
  103. HttpAuthChallengeTokenizer challenge(
  104. challenge_str.begin(), challenge_str.end());
  105. HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs();
  106. EXPECT_TRUE(parameters.valid());
  107. EXPECT_EQ(std::string("digest"), challenge.auth_scheme());
  108. EXPECT_FALSE(parameters.GetNext());
  109. EXPECT_FALSE(parameters.valid());
  110. }
  111. // Specify multiple properties, comma separated.
  112. TEST(HttpAuthChallengeTokenizerTest, Multiple) {
  113. std::string challenge_str =
  114. "Digest algorithm=md5, realm=\"Oblivion\", qop=auth-int";
  115. HttpAuthChallengeTokenizer challenge(challenge_str.begin(),
  116. challenge_str.end());
  117. HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs();
  118. EXPECT_TRUE(parameters.valid());
  119. EXPECT_EQ(std::string("digest"), challenge.auth_scheme());
  120. EXPECT_TRUE(parameters.GetNext());
  121. EXPECT_TRUE(parameters.valid());
  122. EXPECT_EQ(std::string("algorithm"), parameters.name());
  123. EXPECT_EQ(std::string("md5"), parameters.value());
  124. EXPECT_TRUE(parameters.GetNext());
  125. EXPECT_TRUE(parameters.valid());
  126. EXPECT_EQ(std::string("realm"), parameters.name());
  127. EXPECT_EQ(std::string("Oblivion"), parameters.value());
  128. EXPECT_TRUE(parameters.GetNext());
  129. EXPECT_TRUE(parameters.valid());
  130. EXPECT_EQ(std::string("qop"), parameters.name());
  131. EXPECT_EQ(std::string("auth-int"), parameters.value());
  132. EXPECT_FALSE(parameters.GetNext());
  133. EXPECT_TRUE(parameters.valid());
  134. }
  135. // Use a challenge which has no property.
  136. TEST(HttpAuthChallengeTokenizerTest, NoProperty) {
  137. std::string challenge_str = "NTLM";
  138. HttpAuthChallengeTokenizer challenge(
  139. challenge_str.begin(), challenge_str.end());
  140. HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs();
  141. EXPECT_TRUE(parameters.valid());
  142. EXPECT_EQ(std::string("ntlm"), challenge.auth_scheme());
  143. EXPECT_FALSE(parameters.GetNext());
  144. }
  145. // Use a challenge with Base64 encoded token.
  146. TEST(HttpAuthChallengeTokenizerTest, Base64) {
  147. std::string challenge_str = "NTLM SGVsbG8sIFdvcmxkCg===";
  148. HttpAuthChallengeTokenizer challenge(challenge_str.begin(),
  149. challenge_str.end());
  150. EXPECT_EQ(std::string("ntlm"), challenge.auth_scheme());
  151. // Notice the two equal statements below due to padding removal.
  152. EXPECT_EQ(std::string("SGVsbG8sIFdvcmxkCg=="), challenge.base64_param());
  153. }
  154. } // namespace net