CONNECT方法请求接收者建立一个隧道到由请求目标标识的目的源服务器,如果成功,之后将其行为限制为子啊两个方向上转发数据包,知道隧道被关闭。隧道通常被用于通过一个或多个代理创建一个端到端的虚拟连接,它可以使用TLS(传输层安全性协议,RFC5246)进行保护。
CONNECT仅用于请求代理。接收到CONNECT请求到其自身的源服务器可能响应一个2xx(成功)状态码表示连接被建立。然而,大多数源服务器没有实现CONNECT。
客户端发送CONNECT请求必须发送权威形式的请求目标(RFC7230,5.3节);即,请求目标只由隧道目的地的主机名和端口号组成,由冒号分隔。例如,
CONNECT server.example.com:80 HTTP/1.1 Host: server.example.com:80
接收者代理可以通过直接连接到请求目标,或者如果被配置为使用另一个代理,通过转发CONNECT请求到下一个入站代理来建立一个隧道。任何2xx(成功)响应表明发送者(和所有的入站代理)将在结束成功响应的头部分的空行后马上切换到隧道模式;在空行后接收到的数据时从由请求目标标识的服务器上来的。任何不是成功的响应表明隧道还没有形成并且连接继续由HTTP管理。
当一个隧道中介探测到任何一边关闭它的连接后,隧道就被关闭了:中介必须尝试将关闭方的未完成数据发送给另一方,关闭两个连接,然后丢弃任何未传递的剩余数据。
代理认证可能被用于建立权威来创建隧道。例如:
CONNECT server.example.com:80 HTTP/1.1 Host: server.example.com:80 Proxy-Authorization: basic aGVsbG86d29ybGQ=
建立到任意服务器的隧道存在重大风险,特别时当目的地是一个有名的或保留的不是为Web流量准备的TCP端口。例如,一个请求目标为“``example.com:25”的CONNCET连接将会按时网关连接到为SMTP流量保留的端口;如果被允许,这可能欺骗代理转发垃圾邮件。支持CONNECT的代理应该限制它的使用为一个已知端口的集合或一个可配置的安全请求目标白名单。
服务器不得在CONNECT的2xx(成功)响应中发送任何Transfer-Encoding或Content-Length头字段。客户端必须忽略任何在CONNECT的成功响应中接收到的Content-Length或Transfer-Encoding头字段。
CONNETC请求消息中的负载体没有定义语义;在CONNETC请求中发送负载体可能造成一些已经存在的实现拒绝服务。
CONNECT方法的响应不能被缓存。