【发布时间】:2023-03-09 20:50:01
【问题描述】:
我正在对现有的基于 python 的 Nagios 插件进行故障排除,该插件使用 PycURL 来测试可以对远程 WebDav 服务(GET、PUT、DELETE)执行不同的操作。当服务响应 301 重定向并显示错误“411 长度要求”时,我们遇到了问题。
在检查原始服务和重定向服务的 PUT 请求的标头后,后者缺少“Content-Length”标头,这就是失败的原因。我一直无法找到是否需要设置一个可能需要设置的选项。
我可以在 Python2 中通过使用“INFILESIZE”选项添加文件大小来解决此问题:
c.setopt(c.INFILESIZE, os.path.getsize(filepath))
代码如下所示:
#!/bin/python2
import pycurl
import os
filepath = '/tmp/testfile'
c = pycurl.Curl()
c.setopt(c.URL, 'http://remote_host.com/filename')
c.setopt(c.UPLOAD, 1)
file = open(filepath)
c.setopt(c.READDATA, file)
c.setopt(c.FOLLOWLOCATION, 1)
c.setopt(c.INFILESIZE, os.path.getsize(filepath))
c.perform()
c.close()
file.close()
但是在 Python3 上(我在 3.4、3.6 和 3.7 上尝试过)相同的代码退出并出现错误:
Traceback (most recent call last):
File "/usr/lib64/python3.7/codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 2: invalid continuation byte
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
pycurl.error: (42, 'operation aborted by callback')
我不明白这是否是服务器回复的问题。但是如果我删除了 INFILESIZE 选项,那么它就会失败并出现上面提到的 411 错误。
如果有人知道我做错了什么,将不胜感激。
【问题讨论】:
标签: python python-3.x pycurl