tst_httpparser.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #include "tst_httpparser.h"
  2. void TST_HttpParser::test()
  3. {
  4. testGet();
  5. testPost();
  6. testPostWithFiles();
  7. }
  8. void TST_HttpParser::testGet()
  9. {
  10. QByteArray req(buildGetRequest());
  11. CWF::HttpParser parser(req);
  12. QVERIFY2(parser.getCookies().size() == 1, "Should be 1");
  13. QVERIFY2(parser.getUrl() == "/home", "Should be /home");
  14. QVERIFY2(parser.getParameter("id").toInt() == 10, "Should be 10");
  15. QVERIFY2(parser.getParameter("nome") == "Herik", "Should be Herik");
  16. QVERIFY2(parser.getHttpVersion().endsWith("1.1"), "Should be 1.1");
  17. QVERIFY2(parser.getMethod() == "GET", "Should be GET");
  18. QVERIFY2(!parser.isMultiPart(), "Should be not be multiPart");
  19. req = buildGetRequestWithoutEndMsg();
  20. QVERIFY2(!CWF::HttpParser(req).isValid(), "Should be false");
  21. req = buildInvalidRequest();
  22. QVERIFY2(!CWF::HttpParser(req).isValid(), "Should be false");
  23. }
  24. void TST_HttpParser::testPost()
  25. {
  26. QByteArray req(buildPostRequest('A'));
  27. CWF::HttpParser parser(req);
  28. QVERIFY2(parser.getCookies().size() == 1, "Should be 1");
  29. QVERIFY2(parser.getUrl() == "/home", "Should be /home");
  30. QVERIFY2(parser.getParameter("id").toInt() == 10, "Should be 10");
  31. QVERIFY2(parser.getParameter("nome") == "Herik", "Should be Herik");
  32. QVERIFY2(parser.getHttpVersion().endsWith("1.1"), "Should be 1.1");
  33. QVERIFY2(parser.getMethod() == "POST", "Should be POST");
  34. QVERIFY2(!parser.isMultiPart(), "Should be not be multiPart");
  35. req = buildPostRequest('B');
  36. QVERIFY2(CWF::HttpParser(req).getParameter("nome").isEmpty(), "Should be true");
  37. req = buildPostRequest('C');
  38. QVERIFY2(CWF::HttpParser(req).getParameter("id").toInt() == 10, "Should be 10");
  39. req = buildPostRequest('D');
  40. QVERIFY2(CWF::HttpParser(req).getParameter("id").isEmpty(), "Should be true");
  41. }
  42. void TST_HttpParser::testPostWithFiles()
  43. {
  44. QByteArray req(buildPostRequestWithFiles());
  45. CWF::HttpParser parser(req);
  46. QVERIFY2(parser.getCookies().size() == 2, "Should be 2");
  47. QVERIFY2(parser.getUrl() == "/savefiles", "Should be savefiles");
  48. QVERIFY2(parser.getParameter("id") == "", "Should be 10");
  49. QVERIFY2(parser.getUploadedFiles().size() == 2, "Should be 2");
  50. QVERIFY2(parser.getHttpVersion().endsWith("1.1"), "Should be 1.1");
  51. QVERIFY2(parser.getMethod() == "POST", "Should be POST");
  52. QVERIFY2(parser.isMultiPart(), "Should be be multiPart");
  53. }
  54. QByteArray TST_HttpParser::buildGetRequest()
  55. {
  56. QByteArray req;
  57. req = "GET /home?id=10&nome=Herik&x HTTP/1.1\r\n";
  58. req += "Host: localhost:8080\r\n";
  59. req += "Connection: keep-alive\r\n";
  60. req += "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\r\n";
  61. req += "Cookie: sessionId=12345678901234567890\r\n\r\n";
  62. return req;
  63. }
  64. QByteArray TST_HttpParser::buildPostRequest(char condition)
  65. {
  66. QByteArray req;
  67. req = "POST /home HTTP/1.1\r\n";
  68. req += "Host: localhost:8080\r\n";
  69. req += "Connection: keep-alive\r\n";
  70. req += "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\r\n";
  71. req += "Content-Type: application/x-www-form-urlencoded\r\n";
  72. req += "Cookie: sessionId=\"12345678901234567890\"\r\n\r\n";
  73. if(condition == 'A')
  74. req += "id=10&nome=Herik";
  75. else if(condition == 'B')
  76. req += "id=10&nome";
  77. else if(condition == 'C')
  78. req += "id=10";
  79. else if(condition == 'D')
  80. req += "id";
  81. return req;
  82. }
  83. QByteArray TST_HttpParser::buildPostRequestWithFiles()
  84. {
  85. QByteArray req;
  86. req = "POST /savefiles?id= HTTP/1.1\r\n";
  87. req += "Host: localhost:8080\r\n";
  88. req += "Connection: keep-alive\r\n";
  89. req += "Content-Length: 890\r\nCache-Control: max-age=0\r\n";
  90. req += "Origin: http://localhost:8080\r\n";
  91. req += "Upgrade-Insecure-Requests: 1\r\n";
  92. req += "Cookie: xxx=10; yyy=20\r\n";
  93. req += "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryRfRRkSFRgWLngq8y\r\n";
  94. req += "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\r\n";
  95. req += "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n";
  96. req += "Referer: http://localhost:8080/pages/savefiles.html\r\n";
  97. req += "Accept-Encoding: gzip, deflate, br\r\n";
  98. req += "Accept-Language: pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7\r\n\r\n";
  99. req += "------WebKitFormBoundaryRfRRkSFRgWLngq8y\r\nContent-Disposition: form-data; name=\"theFile\"; filename=\"test.txt\"\r\nContent-Type: text/plain\r\n\r\naaaaaaaa\n\r\n------WebKitFormBoundaryRfRRkSFRgWLngq8y\r\nContent-Disposition: form-data; name=\"theFile2\"; filename=\"test2.txt\"\r\nContent-Type: text/plain\r\n\r\naaaaaaaa\n\r\n------WebKitFormBoundaryRfRRkSFRgWLngq8y\r\nContent-Disposition: form-data; name=\"theFile3\"; filename=\"\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n------WebKitFormBoundaryRfRRkSFRgWLngq8y\r\nContent-Disposition: form-data; name=\"theFile4\"; filename=\"\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n------WebKitFormBoundaryRfRRkSFRgWLngq8y\r\nContent-Disposition: form-data; name=\"theFile5\"; filename=\"\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n------WebKitFormBoundaryRfRRkSFRgWLngq8y\r\nContent-Disposition: form-data; name=\"moo\"\r\n\r\nSend Files\r\n------WebKitFormBoundaryRfRRkSFRgWLngq8y--\r\n";
  100. return req;
  101. }
  102. QByteArray TST_HttpParser::buildGetRequestWithoutEndMsg()
  103. {
  104. QByteArray req;
  105. req = "GET /home?id=10&nome=Herik HTTP/1.1\r\n";
  106. req += "Host: localhost:8080\r\n";
  107. req += "Connection: keep-alive";
  108. return req;
  109. }
  110. QByteArray TST_HttpParser::buildInvalidRequest()
  111. {
  112. return "GET HTTP/1.1\r\n\r\n";
  113. }