github.com/vicanso/pike@v1.0.1-0.20210630235453-9099e041f6ec/docs/response.md (about) 1 --- 2 description: 请求响应处理 3 --- 4 5 请求响应的处理主要分两步,一是从upstream中获取响应(或从缓存中),二是根据响应与客户端选择符合的响应数据。HTTP响应数据主要有以下字段: 6 7 - `GzipBody` gzip压缩的body 8 - `BrBody` br压缩的body 9 - `RawBody` 原始未压缩的body 10 - `Header` HTTP响应头 11 12 <p align="center"> 13 <img src="./images/response.png"/> 14 </p> 15 16 ## 从Upstream中获取响应 17 18 参考上面的流程图,从upstream中获取响应之后,主要根据响应头的Encoding以及是否可缓存生成不同的响应数据。 19 20 - 如果upstream的响应数据是gzip或br压缩,直接生成对应的GzipBody或BrBody 21 - 如果upstream的响应数据是未压缩的,直接生成对应的RawBody 22 - 生成HTTP Response之后,判断该请求是否缓存并且可压缩(根据Content-Type判断),如果可缓存压缩则生成GzipBody以及BrBody,并清除RawBody 23 24 需要注意,对于不可缓存的数据,生成HTTP Response时,upstream返回的数据并不处理,直接保存。而对于可缓存的数据,则根据其是否可压缩生成gzip与br的数据,并清除RawBody,因此RawBody并不会与压缩的数据同时存在。 25 26 ## 从HTTP Response中响应数据 27 28 参考上面的流程图,从HTTP Response中响应客户端的主要流程如下: 29 30 - 客户端支持br压缩,而且已有br压缩数据,则直接返回响应 31 - 客户端支持gzip压缩,而且已有gzip压缩数据,则直接返回响应 32 - 响应数据不应该被压缩,则直接返回原始数据 33 - 客户支持br压缩,则对数据压缩后返回 34 - 客户端支持gzip压缩,则对数据压缩后返回 35 - 客户端不支持压缩,则返回原始数据 36 37 需要注意,对于可缓存压缩数据,在生成缓存时会预压缩(同时生成br与gzip压缩),因此可以减少压缩数据对性能的损耗(一次压缩多次使用)