100型响应
当客户端发送 Expect:100-Continue时, 服务端可以响应 100 Continue 为允许,或者不许可(417 Expectation Failed) 。100 Continue 状态码通知客户端可以继续发送请求。
在发送大文件之前,客户端可以首先发出询问,如果在服务器不接受大文件的话,服务器就可以直接拒绝继续。否则,服务器只能从请求头内提取内容大小,当发现不符合条件的时候,实体内容这时候可能已经在传递了。这可是在浪费带宽了。
案例
在此案例中,客户端试图 POST 一个 MP3 视频到服务器,这个文件大小为101MB。客户端并没有在请求主体内发送这个文件,而是添加一个 Expect: 100-continue 的请求首部字段。如果可以接受这样大小的文件,服务器就返回100 Continue ,否则返回417 状态码。
编写此服务器代码(app.js)
var http = require("http");
function onRequest(request, response) {
response.end("hello world\n")
}
http.createServer(onRequest).listen(8181);
执行
$node app.js
发起请求
使用nc 做客户端,直接在console内贴入请求消息文本,并回车两次就可以发出请求到服务器。
$ nc localhost 8181
POST /content/videos HTTP/1.1
Host: media.example.org
Content-Type: video/mp4
Content-Length: 105910000
Authorization: Basic bWFkZTp5b3VfbG9vaw==
Expect: 100-continue
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Mon, 23 Nov 2015 06:27:53 GMT
Connection: keep-alive
Transfer-Encoding: chunked
c
hello world
0
Node.js的 http 服务器默认接受任何大小的文件。因此,当它发现 Expect: 100-continue时,会返回 HTTP/1.1 100 Continue。
(读者的代码:
$ nc localhost 8181
POST /content/videos HTTP/1.1
Host: media.example.org
Content-Type: video/mp4
Content-Length: 105910000
Authorization: Basic bWFkZTp5b3VfbG9vaw==
Expect: 100-continue
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Mon, 25 Sep 2017 13:28:48 GMT
Connection: keep-alive
Content-Length: 12
hello world
0
^C
)
希望覆盖默认行为的方法,根据条件(比较具体文件大小)决定是否接受的话,可以参考 Node.js 手册:https://nodejs.org/api/http.html#http_event_continue
101 型响应
HTTP 协议提供一个机制,允许在已经建立的连接上把HTTP协议切换到一个新的、不兼容的协议上(amazing!!!读者补充。)。
客户端可以发起这个协议切换请求,而服务器可以选择拒绝并关闭连接,或者选择接受。如果服务器选择了接受,接下来就可以在此连接上传递新的协议内容。这样做的好处在于不必重建连接即可做协议升级或者调整为新的协议。服务器可以发送101型响应消息给客户端表示接受协议切换。比如本来是HTTP/1.1协议可以经过101 Switch Protocols就改变为h2c 、WebSocket、TLS。握手完成后,传递的协议就此改变。
案例:如何利用101 Switch Protocols 把HTTP协议切换为WebSocket?
客户端通过http协议的 GET 方法的首部字段,向服务器发起请求: