1. HTTP请求/响应报文封装测试

测试请求/响应类对报文封装的正确性。

  • 请求报文:

请求方法默认为GET, 也可以调用setMethod(HttpMethod::POST)来进行指定。
设置一个请求首部字段Host:xxxx,这里封装一个百度网址。
设置一个报文主体,可以是任意内容,这里设置为字符串"hello baidu"
最终调用dump将破碎的成员组合成一个完整报文。

  • 响应报文:

响应状态码默认为200 OK, 也可以调用setStatus(HttpStatus::MOVED_PERMANENTLY)
设置一个响应首部字段X-X:kit
设置连接状态connection: keep-alive
设置报文主体,为字符串"hello kit"
最终调用dump将破碎的成员组合成一个完整报文。

  1. static Logger::ptr g_logger = KIT_LOG_ROOT();
  2. /*封装请求报文*/
  3. void test_request()
  4. {
  5. http::HttpRequest::ptr req(new http::HttpRequest);
  6. //req->setMethod(http::HttpMethod::POST);
  7. req->setHeader("host", "www.baidu.com");
  8. req->setBody("hello baidu");
  9. req->dump(std::cout) << std::endl;
  10. }
  11. /*封装响应报文*/
  12. void test_response()
  13. {
  14. http::HttpResponse::ptr rsp(new http::HttpResponse);
  15. // rsp->setStatus(http::HttpStatus::MOVED_PERMANENTLY);
  16. rsp->setHeader("X-X", "kit");
  17. rsp->setBody("hello kit");
  18. rsp->setClose(false);
  19. rsp->dump(std::cout) << std::endl;
  20. }
  21. int main()
  22. {
  23. KIT_LOG_INFO(g_logger) << "test begin";
  24. test_request();
  25. test_response();
  26. KIT_LOG_INFO(g_logger) << "test end";
  27. return 0;
  28. }

image.png
image.png

2. HTTP请求/响应报文解析测试

目的:通过telnet工具,请求www.baidu.com,将百度的响应报文内容拿出来手动置为一个数组,让其去解析该数组内容。

  • test_http_parser.cpp: ```cpp static Logger::ptr g_logger = KIT_LOG_ROOT();

char test_request_data[] = “POST / HTTP/1.1\r\n” “host: www.baidu.com\r\n” “content-leng”;

void test_request() { http::HttpRequestParser parser; std::string temp = test_request_data; size_t ret = parser.execute(&temp[0], temp.size());

  1. KIT_LOG_INFO(g_logger) << "execute ret = " << ret
  2. << ",has error=" << parser.hasError()
  3. << ",is finished=" << parser.isFinished()
  4. << ", total len=" << temp.size()
  5. << ", content length=" << parser.getContentLength();
  6. temp.resize(temp.size() - ret);
  7. KIT_LOG_INFO(g_logger) << "data=\n" << parser.getData()->toString();
  8. KIT_LOG_INFO(g_logger) << "re temp=" << temp;

}

char test_response_data[] = “HTTP/1.0 200 OK\r\n” “Accept-Ranges: bytes\r\n” “Cache-Control: no-cache\r\n” “Content-Length: 9508\r\n” “Content-Type: text/html\r\n” “Date: Fri, 21 Jan 2022 09:10:09 GMT\r\n” “P3p: CP=\” OTI DSP COR IVA OUR IND COM \”\r\n” “P3p: CP=\” OTI DSP COR IVA OUR IND COM \”\r\n” “Pragma: no-cache\r\n” “Server: BWS/1.1\r\n” “Set-Cookie: BAIDUID=724BAEA1537982702513F8E2FB225C4A:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com\r\n” “Set-Cookie: BIDUPSID=724BAEA1537982702513F8E2FB225C4A; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com\r\n” “Set-Cookie: PSTM=1642758641; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com\r\n” “Set-Cookie: BAIDUID=724BAEA153798270D2ABD4B41739368C:FG=1; max-age=31536000; expires=Sat, 21-Jan-23 09:50:41 GMT; domain=.baidu.com; path=/; version=1; comment=bd\r\n” “Traceid: 164275864109089502828095481575910497583\r\n” “Vary: Accept-Encoding\r\n” “X-Frame-Options: sameorigin\r\n” “X-Ua-Compatible: IE=Edge,chrome=1\r\n”;

void test_response() { http::HttpResponseParser parser; std::string temp = test_response_data; size_t ret = parser.execute(test_response_data, temp.size(), false);

  1. KIT_LOG_INFO(g_logger) << "execute ret = " << ret
  2. << ",has error=" << parser.hasError()
  3. << ",is finished=" << parser.isFinished()
  4. << ",total len=" << temp.size()
  5. << ",content length=" << parser.getContentLength();
  6. temp.resize(temp.size() - ret);
  7. KIT_LOG_INFO(g_logger) << "data=\n" << parser.getData()->toString();
  8. KIT_LOG_INFO(g_logger) << "re temp=" << temp;

}

int main() { KIT_LOG_INFO(g_logger) << “test begin”;

  1. test_request();
  2. std::cout << "---------------\n";
  3. test_response();
  4. KIT_LOG_INFO(g_logger) << "test end";
  5. return 0;

} ``` image.png