httpreqdata_ut.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #include "httpreqdata.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. Y_UNIT_TEST_SUITE(TRequestServerDataTest) {
  4. Y_UNIT_TEST(Headers) {
  5. TServerRequestData sd;
  6. sd.AddHeader("x-xx", "y-yy");
  7. sd.AddHeader("x-Xx", "y-yy");
  8. UNIT_ASSERT_VALUES_EQUAL(sd.HeadersCount(), 1);
  9. sd.AddHeader("x-XxX", "y-yyy");
  10. UNIT_ASSERT_VALUES_EQUAL(sd.HeadersCount(), 2);
  11. UNIT_ASSERT_VALUES_EQUAL(TStringBuf(sd.HeaderIn("X-XX")), TStringBuf("y-yy"));
  12. UNIT_ASSERT_VALUES_EQUAL(TStringBuf(sd.HeaderIn("X-XXX")), TStringBuf("y-yyy"));
  13. }
  14. Y_UNIT_TEST(ComplexHeaders) {
  15. TServerRequestData sd;
  16. sd.SetHost("zzz", 1);
  17. sd.AddHeader("x-Xx", "y-yy");
  18. UNIT_ASSERT_VALUES_EQUAL(sd.HeadersCount(), 1);
  19. UNIT_ASSERT_VALUES_EQUAL(TStringBuf(sd.HeaderIn("X-XX")), TStringBuf("y-yy"));
  20. sd.AddHeader("x-Xz", "y-yy");
  21. UNIT_ASSERT_VALUES_EQUAL(sd.HeadersCount(), 2);
  22. UNIT_ASSERT_VALUES_EQUAL(TStringBuf(sd.HeaderIn("X-Xz")), TStringBuf("y-yy"));
  23. UNIT_ASSERT_VALUES_EQUAL(sd.ServerName(), "zzz");
  24. UNIT_ASSERT_VALUES_EQUAL(sd.ServerPort(), "1");
  25. sd.AddHeader("Host", "1234");
  26. UNIT_ASSERT_VALUES_EQUAL(sd.HeadersCount(), 3);
  27. UNIT_ASSERT_VALUES_EQUAL(TStringBuf(sd.HeaderIn("Host")), TStringBuf("1234"));
  28. UNIT_ASSERT_VALUES_EQUAL(sd.ServerName(), "1234");
  29. sd.AddHeader("Host", "12345:678");
  30. UNIT_ASSERT_VALUES_EQUAL(sd.HeadersCount(), 3);
  31. UNIT_ASSERT_VALUES_EQUAL(TStringBuf(sd.HeaderIn("Host")), TStringBuf("12345:678"));
  32. UNIT_ASSERT_VALUES_EQUAL(sd.ServerName(), "12345");
  33. UNIT_ASSERT_VALUES_EQUAL(sd.ServerPort(), "678");
  34. }
  35. Y_UNIT_TEST(ParseScan) {
  36. TServerRequestData rd;
  37. // Parse parses url without host
  38. UNIT_ASSERT(!rd.Parse(" http://yandex.ru/yandsearch?&gta=fake&haha=da HTTP 1.1 OK"));
  39. // This should work
  40. UNIT_ASSERT(rd.Parse(" /yandsearch?&gta=fake&haha=da HTTP 1.1 OK"));
  41. UNIT_ASSERT_STRINGS_EQUAL(rd.QueryStringBuf(), "&gta=fake&haha=da");
  42. UNIT_ASSERT_STRINGS_EQUAL(rd.QueryStringBuf(), rd.OrigQueryStringBuf());
  43. rd.Scan();
  44. UNIT_ASSERT(rd.CgiParam.Has("gta", "fake"));
  45. UNIT_ASSERT(rd.CgiParam.Has("haha", "da"));
  46. UNIT_ASSERT(!rd.CgiParam.Has("no-param"));
  47. rd.Clear();
  48. }
  49. Y_UNIT_TEST(Ctor) {
  50. const TString qs("gta=fake&haha=da");
  51. TServerRequestData rd(qs.c_str());
  52. UNIT_ASSERT_STRINGS_EQUAL(rd.QueryStringBuf(), qs);
  53. UNIT_ASSERT_STRINGS_EQUAL(rd.OrigQueryStringBuf(), qs);
  54. UNIT_ASSERT(rd.CgiParam.Has("gta"));
  55. UNIT_ASSERT(rd.CgiParam.Has("haha"));
  56. UNIT_ASSERT(!rd.CgiParam.Has("no-param"));
  57. }
  58. Y_UNIT_TEST(HashCut) {
  59. const TString qs("&gta=fake&haha=da");
  60. const TString header = " /yandsearch?" + qs + "#&uberParam=yes&q=? HTTP 1.1 OK";
  61. TServerRequestData rd;
  62. rd.Parse(header.c_str());
  63. UNIT_ASSERT_STRINGS_EQUAL(rd.QueryStringBuf(), qs);
  64. UNIT_ASSERT_STRINGS_EQUAL(rd.OrigQueryStringBuf(), qs);
  65. rd.Scan();
  66. UNIT_ASSERT(rd.CgiParam.Has("gta"));
  67. UNIT_ASSERT(rd.CgiParam.Has("haha"));
  68. UNIT_ASSERT(!rd.CgiParam.Has("uberParam"));
  69. }
  70. Y_UNIT_TEST(MisplacedHashCut) {
  71. TServerRequestData rd;
  72. rd.Parse(" /y#ndsearch?&gta=fake&haha=da&uberParam=yes&q=? HTTP 1.1 OK");
  73. UNIT_ASSERT_STRINGS_EQUAL(rd.QueryStringBuf(), "");
  74. UNIT_ASSERT_STRINGS_EQUAL(rd.OrigQueryStringBuf(), "");
  75. rd.Scan();
  76. UNIT_ASSERT(rd.CgiParam.empty());
  77. }
  78. Y_UNIT_TEST(CornerCase) {
  79. TServerRequestData rd;
  80. rd.Parse(" /yandsearch?#");
  81. UNIT_ASSERT_STRINGS_EQUAL(rd.QueryStringBuf(), "");
  82. UNIT_ASSERT_STRINGS_EQUAL(rd.OrigQueryStringBuf(), "");
  83. rd.Scan();
  84. UNIT_ASSERT(rd.CgiParam.empty());
  85. }
  86. Y_UNIT_TEST(AppendQueryString) {
  87. const TString qs("gta=fake&haha=da");
  88. TServerRequestData rd(qs.c_str());
  89. UNIT_ASSERT(rd.CgiParam.Has("gta", "fake"));
  90. UNIT_ASSERT(rd.CgiParam.Has("haha", "da"));
  91. UNIT_ASSERT_STRINGS_EQUAL(rd.QueryStringBuf(), qs);
  92. UNIT_ASSERT_STRINGS_EQUAL(rd.QueryStringBuf(), rd.OrigQueryStringBuf());
  93. constexpr TStringBuf appendix = "gta=true&gta=new";
  94. rd.AppendQueryString(appendix.data(), appendix.size());
  95. UNIT_ASSERT_STRINGS_EQUAL(rd.QueryStringBuf(), qs + '&' + appendix);
  96. UNIT_ASSERT_STRINGS_EQUAL(rd.OrigQueryStringBuf(), qs);
  97. rd.Scan();
  98. UNIT_ASSERT(rd.CgiParam.Has("gta", "true"));
  99. UNIT_ASSERT(rd.CgiParam.Has("gta", "new"));
  100. }
  101. Y_UNIT_TEST(SetRemoteAddrSimple) {
  102. static const TString TEST = "abacaba.search.yandex.net";
  103. TServerRequestData rd;
  104. rd.SetRemoteAddr(TEST);
  105. UNIT_ASSERT_STRINGS_EQUAL(TEST, rd.RemoteAddr());
  106. }
  107. Y_UNIT_TEST(SetRemoteAddrRandom) {
  108. for (size_t size = 0; size < 2 * INET6_ADDRSTRLEN; ++size) {
  109. const TString test = NUnitTest::RandomString(size, size);
  110. TServerRequestData rd;
  111. rd.SetRemoteAddr(test);
  112. UNIT_ASSERT_STRINGS_EQUAL(test.substr(0, INET6_ADDRSTRLEN - 1), rd.RemoteAddr());
  113. }
  114. }
  115. } // TRequestServerDataTest