Python3上的301重定向后Pycurl无法上载
我正在对一个现有的基于python的Nagios插件进行故障排除,该插件使用PycURL测试可以在远程WebDav服务上执行不同的操作(GET、PUT、DELETE)。当服务响应301重定向时出现问题,错误为“411所需长度” 在检查原始服务和重定向服务的PUT请求的头之后,后者缺少“Content Length”头,这就是失败的原因。我还没有找到是否有一个选项,需要设置,这可能是需要的发生 我可以在Python2中通过使用“infiresize”选项添加文件大小来解决这个问题:Python3上的301重定向后Pycurl无法上载,python,python-3.x,pycurl,Python,Python 3.x,Pycurl,我正在对一个现有的基于python的Nagios插件进行故障排除,该插件使用PycURL测试可以在远程WebDav服务上执行不同的操作(GET、PUT、DELETE)。当服务响应301重定向时出现问题,错误为“411所需长度” 在检查原始服务和重定向服务的PUT请求的头之后,后者缺少“Content Length”头,这就是失败的原因。我还没有找到是否有一个选项,需要设置,这可能是需要的发生 我可以在Python2中通过使用“infiresize”选项添加文件大小来解决这个问题: c.setop
c.setopt(c.infiresize,os.path.getsize(filepath))
代码如下所示:
#/垃圾箱/蟒蛇2
导入pycurl
导入操作系统
filepath='/tmp/testfile'
c=pycurl.Curl()
c、 setopt(c.URL,'http://remote_host.com/filename')
c、 setopt(c.UPLOAD,1)
文件=打开(文件路径)
c、 setopt(c.READDATA,文件)
c、 setopt(c.FOLLOWLOCATION,1)
c、 setopt(c.infiresize,os.path.getsize(filepath))
c、 执行
c、 关闭()
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')
回溯(最近一次呼叫最后一次):
文件“/usr/lib64/python3.7/codecs.py”,第322行,解码中
(结果,消耗)=自身缓冲区解码(数据,自身错误,最终)
UnicodeDecodeError:“utf-8”编解码器无法解码位置2中的字节0xda:无效的连续字节
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
pycurl.error:(42,“操作被回调中止”)
我不明白这是否是服务器回复的问题。但是如果我删除了infiesize选项,那么它就会失败,出现上面提到的411错误
如果有人知道我做错了什么,我们将不胜感激。PycURL在Python 2和Python 3中对文件有不同的处理方式。听起来你好像遇到了这种不同。有关行为说明,请参见本手册页: 听起来像是在Python2上,libcurl能够对打开的文件描述执行stat(2)调用,以确定其大小。在Python3上,传递的不是文件描述符,而是函数,因此stat(2)方法不起作用,也不会为您计算文件长度
要解决Unicode解码错误,请在Python2上将代码更改为使用
READFUNCTION
而不是READDATA
,然后查看出现的错误。如果服务器在响应中返回的错误消息不是有效的utf-8,则Python 3可能会按照您描述的方式失败。PycURL在Python 2和Python 3中对文件的处理方式不同。听起来你好像遇到了这种不同。有关行为说明,请参见本手册页:
听起来像是在Python2上,libcurl能够对打开的文件描述执行stat(2)调用,以确定其大小。在Python3上,传递的不是文件描述符,而是函数,因此stat(2)方法不起作用,也不会为您计算文件长度
要解决Unicode解码错误,请在Python2上将代码更改为使用READFUNCTION
而不是READDATA
,然后查看出现的错误。如果服务器在响应中返回的错误消息不是有效的utf-8,则Python 3可能会按照您描述的方式失败