2019独角兽企业重金招聘Python工程师标准>>>
怎么用socket编程编写一个HTTP response header?其实没什么特别的,只要了解HTTP response header的构成就行。关于HTTP request/response header的fields的介绍和详解——http://my.oschina.net/Bruce370/admin/new-blog 既有解释又有例子,很好的一个博客。
举个例子,我正在写的一个程序:
strcpy(s_header, "HTTP/1.1 200 Ok\r\nConnection: close\r\n");//必须以HTTP协议版本和状态码开头,其他的field顺序不重要
strcat(s_header, "Content-Type:text/html; charset=utf-8\r\nContent-Length:");//我打算发个html文件给客户端,所以Content-Type:text/html
itoa(fp_len, fp_len_char, 10);//fp_len_char是个字符串,存放html文件的长度
strcat(s_header, fp_len_char);
strcat(s_header, "\r\n");
strcat(s_header, s_buffer);//s_buffer是html文件读取后所在的buffer
接下来说说遇到的问题——
在firefox上测试连接了我的server,可以成功接收到html文件并成功打开网页;
但是在Chrome上,却只能看见网页一直是一片空白,小圆圈一直转,最后显示没有接收到任何回复。
打开网页信息控制台(快捷键 ctrl+shift+j)后发现,显示以下错误
错误信息 net::ERR_CONTENT_LENGTH_MISMATCH
意思是,HTTP response header提供的内容长度信息和Chrome实际收到的不一致,因此浏览器将其判定为不合法的包,不进行显示。
网上查找之后,在stackoverflow里发现一些答案——
即浏览器的一些代理插件或者去广告工具可能导致修改了包的一些内容,但是并没有更改Header里Content Length的值,导致这种情况发生·······
我最后的解决办法就是·····················把Content Length这个属性去掉!于是成功debug~
(题外话,HTTP response Header 里,除了协议版本号和状态码,其他属性基本都不是一定要写的···stackoverflow里找到的一个帖子—— http://stackoverflow.com/questions/4726515/what-http-response-headers-are-required)