前言
通过浏览器访问自己的http服务器.
http服务器给浏览器回一段html, 假设回的html是一段500的错误.
如果Content-Length算错, html不会显示在浏览器上,浏览器是空白的.
只能在F12模式的控制台下看到回的失败信息是500.
但是有报错提示 net::ERR_CONTENT_LENGTH_MISMATCH
正确的html回包 = http头信息 + \r\n + Content-Length:实际内容长度 + \r\n\r\n + 实际内容 + \r\n\0
实验
// @file test.cpp
// @brief calculate html content length
// @note build on vs2017
// http错误码后面跟啥描述信息都行
// "HTTP/1.0 500 error_request_page\r\nConnection: close\r\nContent-Type: text/html\r\nContent-Length: 50\r\n\r\n<HTML>\r\n<BODY>\r\nInvalid request.\r\n</BODY>\r\n</HTML>\r\n\0"
#include "pch.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int calc_html_content_length(const char* psz_html)
{
int i_len = 0; // psz_html的串长度
int i_html_content_length = 0; // 回包的Content-Length数值
do {
if (NULL == psz_html) {
return 0;
}
// "\r\n\r\n<HTML>\r\n<BODY>\r\nInvalid request.\r\n</BODY>\r\n</HTML>\r\n\0"
//
// 一个合格的回包格式 : "\r\n\r\n" + "real content" + "\r\n\0"
// \r\n\r\n
// <HTML>\r\n<BODY>\r\nInvalid request.\r\n</BODY>\r\n</HTML>
// \r\n\0
//
// 换句话来说, html回包中的Content-Length就是实际内容的长度
// 但是组包时, 要先写上Content-Length: 实际内容长度
// 然后加\r\n\r\n代表实际内容的开始
// 然后才跟上实际内容
// 然后再加上\r\n\0作为实际内容的结束
i_len = strlen(psz_html);
if (i_len < 6) {
break; // 给的实际内容长度必须>=6("\r\n\r\n" + "" + "\r\n")
}
if ((psz_html[0] != '\r')
|| (psz_html[1] != '\n')
|| (psz_html[2] != '\r')
|| (psz_html[3] != '\n')
|| (psz_html[i_len - 2] != '\r')
|| (psz_html[i_len - 1] != '\n')) {
break;
}
i_html_content_length = i_len - 6;
} while (0);
return i_html_content_length;
}
int main()
{
// "\r\n\r\n<HTML>\r\n<BODY>\r\nInvalid request.\r\n</BODY>\r\n</HTML>\r\n\0"
// "\r\n\r\n1234567890\r\n\0"
const char* psz_html = "\r\n\r\n1234567890\r\n\0";
printf("html's Content-Length = %d\n", calc_html_content_length(psz_html));
// run result
// html's Content-Length = 50
system("pause");
return EXIT_SUCCESS;
}
在chromeF12模式source中看到的html内容
<HTML>
<BODY>
Invalid request.
</BODY>
</HTML>
在chrome页面上看到的内容
Invalid request.
在chromeF12控制台上显示的错误信息
x.ico:1 GET http://192.168.1.100/x.ico 500 (error_request_page)