calculate html Content-Length

前言

通过浏览器访问自己的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)
发布了436 篇原创文章 · 获赞 126 · 访问量 175万+

猜你喜欢

转载自blog.csdn.net/LostSpeed/article/details/95048682