HTTP/1.1 100 Continue - I 服了 You
今天用 c 的 socket() 模拟发送http请求:上传一张图片到服务器。
在本地测试,本地电脑: xp, iis5.1
经过半天时间对 http post file 协议的了解,代码已经写好,测试发现,socket使用http协议上传文件,服务器端已经可以正常的接收,并保存数据到新生成的文件中,但是 客户端 socket 发送完所有数据,然后读取服务器端返回的数据时,显示结果:
HTTP/1.1 100 Continue
Server: Microsoft-IIS/5.1
Date: Mon, 31 Mar 2014 05:52:22 GMT
X-Powered-By: ASP.NET
并不是我所期望的 HTTP/1.1 200 OK
在网上不断的搜索相关资料,找到原因:
100状态码 的目的在于允许客户端判定服务器是否愿意接受客户端发来的消息主体(基于请求头域)在客户端发送此请求消息主体前。 在有些情况下,如果服务器拒绝查看消息主体,这时客户端发送消息主体是不合适的或会降低效率。)
就是说 Expect:100-Continue的作用是,设定Client 和 Server在Post数据前需要进行 “请求头域” 的数据匹配,相当于是握手。如果匹配则开始进行body 的内容,Post数据。否则,报错(417) Unkown。
来源: http://hi.baidu.com/leo_han/item/9bdd1068bc6f7131ad3e8333
其他相关资料:http://zhidao.baidu.com/question/396434329.html
http://www.laruence.com/2011/01/20/1840.html
我仔细检查了源代码,发送的http header中没有与 Expect:100-Continue 相关的任何数据。
我后来测试上传图片到 win2003(iis6.0)上,就可以正常的返回 HTTP/1.1 200 OK
这就是说,上传到不同的系统不同的服务器上,有可能返回 HTTP/1.1 100 Continue,也有可能不返回。
那在代码中,send()完 http header 部分后,我该怎么办?
我测试了,如果发送完 http header 部分,然后先 recv(), 如果遇到 iis5.1 会马上接收到 HTTP/1.1 100 Continue
可遇到 iis6.0,就会阻塞住,直到 recv timeout, 这会严重影响处理的性能。
接收也不是,不接收也不是。
解决办法就是,发送完数据后,接收到两段消息,写程序过滤掉 HTTP/1.1 100 Continue,检查是否有HTTP/1.1 200 OK:
HTTP/1.1 100 Continue
Server: Microsoft-IIS/5.1
Date: Mon, 31 Mar 2014 07:12:52 GMT
X-Powered-By: ASP.NET
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Date: Mon, 31 Mar 2014 07:12:52 GMT
X-Powered-By: ASP.NET
Connection: close
Content-Length: 18
Content-Type: text/html; Charset=utf-8
Set-Cookie: ASPSESSIONIDAQDQBASB=APILENHAPOJMNCDIANAHGHJM; path=/
Cache-control: private
abc123131abcefgkad
----------------------------------------------------------------------------------------------
http post file 简单协议,我的了解是这样:
POST /up/test.asp?action=submit HTTP/1.1
Accept: */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA)
Host: www
Content-Type: multipart/form-data; boundary=x580xo3z1x2yemam
Content-Length: 144
Connection: close
\r\n
--x580xo3z1x2yemam
Content-Disposition: form-data; name="pic"; filename="x.txt"
Content-Type: image/jpeg
\r\n
文件内容[二进制数据]
--x580xo3z1x2yemam--\r\n
其中这里的 Content-Length: 144 特别需要注意, 这个 144 = 上面黑色粗体的所有内容加起来的 size
来源:http://blog.csdn.net/ruixj/article/details/5986063#t2
来源:http://www.cnblogs.com/cswuyg/archive/2013/07/11/3185164.html
来源:http://blog.csdn.net/xiaojianpitt/article/details/6856536
关于 http header 详细的介绍:
http://www.cnblogs.com/pipelone/archive/2009/03/26/1422140.html
2014-03-31
HTTP/1.1 100 Continue - I 服了 You的更多相关文章
- HTTP报文中的100状态码
HTTP状态码(status codes)是HTTP协议中,响应报文的起始行中包含的一种服务器用于向客户端说明操作状态的三位数字.例如在一个正常的GET请求完成后,服务器会向客户端返回 HTTP/ O ...
- shell 100
1.编写hello world脚本 #!/bin/bash# 编写hello world脚本 echo "Hello World!"2.通过位置变量创建 Linux 系统账户及密码 ...
- 快速入门:Python简单实例100个(入门完整版)
Python3 100例 文章目录 Python3 100例 实例001:数字组合 实例002:“个税计算” 实例003:完全平方数 实例004:这天第几天 实例005:三数排序 实例006:斐波那契 ...
- Linux记录-shell 100例(转载)
1.编写hello world脚本 #!/bin/bash # 编写hello world脚本 echo "Hello World!" 2.通过位置变量创建 Linux 系统账户及 ...
- python break/continue - python基础入门(10)
在昨天的文章:python while循环 文章结尾,我们留下了一个bug,当条件成立时,程序陷入了死循环,如何解决呢? 为了规避这个问题,今天介绍两个关键词:break和continue. ...
- HTTP 1.1, 返回值100.
HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401.客户端如果接受到100,才开始把请求body发送到服务器. 这样 ...
- Python break/continue - Python零基础入门教程
目录 一.break 二.continue 三.重点总结 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python wh ...
- shell编程100列
1.编写hello world脚本 #!/bin/bash# 编写hello world脚本 echo "Hello World!"2.通过位置变量创建 Linux 系统账户及密码 ...
- 每天一个 HTTP 状态码 100
100 Continue 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分:指示客户端应该继续当前请求:如果请求已经完成,客户端可以忽略该响应. 常用于服务器已经接受了请求头,客户端应该继续 ...
随机推荐
- ireportdesigner下载页面
iReport主页:http://community.jaspersoft.com/project/ireport-designer iReport下载地址:http://sourceforge.ne ...
- linux-镜像下载
https://blog.csdn.net/sinat_36564972/article/details/81560395 Centos6.5镜像下载 2018年08月10日 11:35:53 深夜搬 ...
- #个人博客作业week3——微软必应词典的使用
产品的调研和评测 笔者使用的是win8的必应词典客户端. 首先打开客户端,用户界面的设计十分简洁,使用方便.但是词典主页与大多外语软件的设计相仿,例如有每日一句,每日阅读等模块,并没有令人感到新奇的地 ...
- Daily Scrum NO.9
工作概况 符美潇 昨日完成的工作 1.Daily Scrum.日常会议及日常工作的分配和查收. 2.根据第二小组的要求对数据库表的属性进行修改. 今日工作 1.Daily Scrum.日常会议及日常工 ...
- 使用git命令创建分支到团队项目
背景 在我们的团队中,我作为管理者,创建了一个叫HelloWorld的项目,大家各自在本地进行开发,将自己的工作贡献到我们的团队项目中.为了便于审核,我希望大家先将自己的贡献先放在属于自己的一个分支上 ...
- 第三个Sprint冲刺第四天(燃尽图)
- 递归拼装Tree结构数据
@Override public List<Map<String, Object>> queryListTree() { List<Map<String,Objec ...
- 软件工程(GZSD2015) 第三次作业提交进度
第三次作业题目请查看这里:软件工程(GZSD2015)第三次作业 开始进入第三次作业提交进度记录中,童鞋们,虚位以待哈... 2015年4月19号 徐镇.尚清丽,C语言 2015年4月21号 毛涛.徐 ...
- HTML DOM 学习笔记
一.HTML DOM定义了所有HTML元素的对象和属性,以及访问他们的方法即:HTML DOM是关于如何获取,修改,添加,删除HTML元素的标准二.DOM节点1.分类整个文档是一个文档节点每个HTML ...
- 面象对象设计原则之三:里氏替换原则(The Liskov Substitution Principle,LSP)
里氏代换原则由2008年图灵奖得主.美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing教授于1994年提出.其严格表述如下:如果对每一个类型为S的 ...