You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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面板验证:

  1. 找到目标请求,查看Response Headers里的Content-Length值。
  2. 切换到Response标签,复制响应体到文本编辑器查看实际字节数。
  3. 确认两者数值一致,这样Chrome就不会再提示有未下载的字节了。

内容的提问来源于stack exchange,提问作者Piotr Boho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:21:02