WireMock记录模式下修改响应体后Content-Length无效问题
解决WireMock修改响应后Content-Length头部不更新的问题
我之前也踩过WireMock这个坑,刚好可以给你捋清楚怎么解决!你的思路方向是对的——WireMock不会自动帮你更新修改后响应体对应的Content-Length,它默认会保留原始头部,但这里有个容易忽略的细节:直接用modifiedBody.length()计算长度可能会出错,因为它返回的是字符数,而HTTP的Content-Length是按字节数统计的,不同编码下字符和字节的对应关系不一样(比如UTF-8的中文是3字节)。
完整的ResponseTransformer实现示例
下面是调整后的代码,重点修正了字节数计算逻辑,同时正确复制和更新头部:
import com.github.tomakehurst.wiremock.http.HttpHeaders; import com.github.tomakehurst.wiremock.http.Response; import com.github.tomakehurst.wiremock.transformer.ResponseTransformer; import com.github.tomakehurst.wiremock.transformer.TransformerParameters; import java.nio.charset.StandardCharsets; public class UrlRewritingTransformer extends ResponseTransformer { @Override public Response transform(Request request, Response response, FileSource files, TransformerParameters parameters) { // 1. 获取原始响应体并替换绝对URL String originalBody = response.getBodyAsString(); String modifiedBody = originalBody.replaceAll("https://original-domain.com", "http://localhost:8080"); // 2. 计算修改后响应体的字节数(用WireMock默认的UTF-8编码) byte[] modifiedBodyBytes = modifiedBody.getBytes(StandardCharsets.UTF_8); int newContentLength = modifiedBodyBytes.length; // 3. 更新Content-Length头部 HttpHeaders updatedHeaders = updateContentLength(response.getHeaders(), newContentLength); // 4. 构建并返回新响应 return Response.Builder.like(response) .body(modifiedBodyBytes) .headers(updatedHeaders) .build(); } private HttpHeaders updateContentLength(HttpHeaders originalHeaders, int newContentLength) { // 复制原始头部,避免修改原对象 HttpHeaders.Builder headerBuilder = HttpHeaders.copyOf(originalHeaders); // 先移除旧的Content-Length(如果存在),再添加新值 headerBuilder.removeHeader("Content-Length"); headerBuilder.addHeader("Content-Length", String.valueOf(newContentLength)); return headerBuilder.build(); } @Override public String getName() { return "url-rewriting-transformer"; // 给Transformer命名,方便配置调用 } }
关键注意事项
- 编码一致性:必须用和WireMock处理响应体一致的编码计算字节数,默认是UTF-8,所以用
StandardCharsets.UTF_8是安全的。如果你的响应是其他编码(比如GBK),要对应调整。 - 移除旧头部:如果原始响应已经有Content-Length,一定要先移除再添加新值,否则可能出现重复头部,导致浏览器解析异常。
- 压缩响应特殊处理:如果原始响应是gzip/deflate压缩的,需要先解压响应体,修改后再重新压缩,同时更新Content-Length和
Content-Encoding头部,这种情况要额外处理流的压缩逻辑。
验证方法
修改后可以用Chrome开发者工具的Network面板验证:
- 找到目标请求,查看Response Headers里的
Content-Length值。 - 切换到Response标签,复制响应体到文本编辑器查看实际字节数。
- 确认两者数值一致,这样Chrome就不会再提示有未下载的字节了。
内容的提问来源于stack exchange,提问作者Piotr Boho
相关产品推荐
相关产品推荐

