HTTP Compression

支持方

TsgcWebSocketHTTPServer

HTTPCompression 在响应发送给客户端之前,用 gzip 或 deflate 压缩 HTTP/1.1 响应,前提是客户端使用 Accept-Encoding 请求头声明了对它的支持。它同时适用于从 DocumentRoot 提供的静态文件以及你在 OnCommandGet 中自行构建的响应。它默认禁用,因此在你开启之前不会影响既有应用程序。

这是与 Compression 不同的功能,后者使用 PerMessage_Deflate 协议压缩 WebSocket 消息。HTTPCompression 仅影响普通的 HTTP/1.1 请求和响应;它对 WebSocket 流量没有影响,而 Compression 对 HTTP 响应没有影响。

要启用它,请设置:

HTTPCompression / Enabled

你还可以对它进行调整:

Level — 压缩级别,从 0(无)到 9(最大);默认 6。

MinSize — 小于此大小(以字节为单位)的响应不会被压缩;默认为 1024。

Algorithms — 服务器允许使用哪些编码;默认同时支持 gzip 和 deflate。当客户端两者都接受时,优先使用 gzip。

ContentTypes — 有资格压缩的内容类型列表,支持诸如 "text/*" 之类的通配符;默认为常见的 text、JSON、JavaScript、XML 和 SVG 类型。

服务器根据请求的 Accept-Encoding 头协商编码,将质量值为 0 视为拒绝(例如 "gzip;q=0")。它绝不会压缩已经带有 Content-Encoding 的响应、204/304/1xx 状态、Server-Sent Events 流,或压缩后不会变得更小的正文。当它确实进行压缩时,会设置响应的 Content-Encoding 头,并添加 Vary: Accept-Encoding,以便缓存正确地按编码作为键。

HTTPCompression 目前仅适用于 HTTP/1.1 响应;HTTP/2 响应不会被此属性压缩。如果您在 TLS 连接上压缩将机密(例如 CSRF 令牌)与受攻击者影响的数据混合在一起的内容,请注意,正是响应压缩使得 BREACH 类攻击成为可能;这是 HTTP 压缩的普遍特性,而非此实现所特有的。


oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.DocumentRoot := 'C:\inetpub\wwwroot';
oServer.HTTPCompression.Enabled := true;
oServer.HTTPCompression.MinSize := 1024;
oServer.Active := true;