如何在 Jupyter 中增加 HTTP header 大小?

How to increase HTTP header size in Jupyter?

当使用 matplotlib 小部件和 k3d 可视化 3D 数据时,请求的构造方式是将图形数据打包到 HTTP header 中。此 header 大小在 jupyter 服务器 (tornado) 使用的底层网络服务器中受到限制。如果客户端请求超出(例如可视化大图),Jupyter 的日志文件中会弹出以下异常:

[I 2021-11-30 15:42:35.323 ServerApp] Unsatisfiable read, closing connection: delimiter re.compile(b'\r?\n\r?\n') not found within 65536 bytes

因此绘图超出了 64 KiB 的缓冲区大小。

我的问题是如何在 Jupyter 中永久设置更大的 header 大小?我已经尝试过这样的事情:

jupyter_server_config.py:

c.ServerApp.tornado_settings = {
    "max_header_size": 500*1024**2,
    "max_buffer_size": 1024**3,
}

没有任何成功。

这是包含此错误消息的相关错误报告: https://github.com/codota/TabNine/issues/255 暗示

"...changed the Tornado package's code because there does not seem to be a directive to pass options to the HTTPServer object in Jupyter's configuration."

我希望这不是真的,但可以以某种方式理智地操纵。

I hope this does not hold true, but can be manipulated sanely somehow.

好吧,猴子补丁总是动态语言中的一个选项,例如 Python。

我们将修补 Tornado 的 http connection parameters 并覆盖 max_header_size

将此代码放入您的 jupyter_server_config.py 文件中:

from tornado import http1connection

def init_patch(
    self,
    no_keep_alive=False,
    chunk_size=None,
    max_header_size=None,
    header_timeout=None,
    max_body_size=None,
    body_timeout=None,
    decompress=False,
):
    self.no_keep_alive = no_keep_alive
    self.chunk_size = chunk_size or 65536
    self.max_header_size = 500*1024**2 # <- custom value
    self.header_timeout = header_timeout
    self.max_body_size = max_body_size
    self.body_timeout = body_timeout
    self.decompress = decompress

http1connection.HTTP1ConnectionParameters.__init__ = init_patch

如果这个 class 的签名会改变,我们就会遇到问题,所以这个基于 @xyres 猴子补丁的解决方案避免 运行 进入未来的变化。它还将所有内容包装在一个函数中以保持命名空间干净。

def patch_tornado_header_size():
    from tornado import http1connection

    init_orginal = http1connection.HTTP1ConnectionParameters.__init__

    def init_patch(self, *args, **kwargs):
        init_orginal(self, *args, **kwargs)
        self.max_header_size = 500 * 1024 ** 2

    http1connection.HTTP1ConnectionParameters.__init__ = init_patch


patch_tornado_header_size()