Content-Length被剥离

2 投票
1 回答
2092 浏览
提问于 2025-04-16 15:07

我正在使用webpy 0.34和python 2.6.6,同时也在用mimerender。我想在我的HTTP响应中加入内容长度这个信息,但不知道为什么这个头信息总是被去掉了。我说是被去掉,因为我可以正常创建自定义的头信息,并且在客户端也能看到这些头信息。但是当我尝试设置内容长度时,这个头信息就是传不到客户端。我已经尝试在web.created对象中加入这个头信息(如示例所示),也试过其他方法。

web.header('Content-Length', len(data))

我到底哪里做错了,或者对这段代码的理解有什么问题呢?

render_json = lambda **args: json.JSONEncoder().encode(args)

class MyHandler:
    @mimerender(
            default = 'json',
            json = render_json,
            )
    def POST(self):
        data = "abcd"
        raise web.created(data, headers={'Content-Length': len(data)})

1 个回答

3

如果数据是以分块的方式发送的(也就是使用了 Transfer-Encoding: chunked),那么就不能包含 Content-Length 这个头部,具体规定可以参考 RFC 2616

  1. [省略]
  1. 如果有一个 Transfer-Encoding 头部(在第14.41节中提到),并且它的值不是“identity”,那么传输的长度就由“chunked”这种传输编码来定义(在第3.6节中提到),除非消息是通过关闭连接来结束的。
  1. 如果有一个 Content-Length 头部(在第14.13节中提到),它的十进制值表示的是实体长度和传输长度。如果这两个长度不一样(也就是说,如果有 Transfer-Encoding 头部),那么就不能发送 Content-Length 头部。如果收到的消息同时有 Transfer-Encoding 头部和 Content-Length 头部,那么必须忽略 Content-Length 头部。

撰写回答