簡體   English   中英

在Python3上進行301重定向后,Pycurl無法上傳

[英]Pycurl fails to upload after 301 redirection on Python3

我正在對現有的基於Python的Nagios插件進行故障排除,該插件使用PycURL來測試可以對遠程WebDav服務(GET,PUT,DELETE)執行不同的操作。 當服務響應301重定向並出現錯誤“ 411 Length Required”時,我們遇到問題。

在檢查了原始服務和重定向服務的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錯誤而失敗。

如果有人知道我在做什么錯,將不勝感激。

PycURL在Python 2和Python 3中對文件的處理不同。聽起來好像您遇到了這種差異。 有關行為的說明,請參見此手冊頁: http : //pycurl.io/docs/latest/files.html

聽起來像在Python 2上,libcurl能夠對打開的文件描述執行stat(2)調用來確定其大小。 在Python 3上,沒有傳遞文件描述符,而是傳遞了一個函數,因此stat(2)方法不起作用,並且沒有為您計算文件長度。

要解決Unicode解碼錯誤,請在Python 2 READFUNCTION代碼更改為使用READFUNCTION而不是READDATA然后看看會遇到什么錯誤。 如果服務器在響應中返回的錯誤消息是無效的utf-8,則Python 3可能會以您描述的方式失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM