On 01/17/2014 04:54 AM, Khokhar cth wrote:
Hi Cole,
I think I've figured out the reason why attached file being corrupted.
To upload the file we need to pass Base64 encoded data.
Data has to encode as Base64 and data must be declared as Base64 encoded as
well. Else it's passed as a string and is not decoded by Bugzilla.
I presume the following code of "attachfile" method needs to be modify in
base.py
data = f.read()
if not isinstance(data, bytes):
data = data.encode(locale.getpreferredencoding())
kwargs['data'] = Binary(data)
I've tried like this but unfortunately it doesn't work.
# data = f.read()
# encoded_data = base64.b64encode(data)
# kwargs['data'] = encoded_data
Reference Bug:
https://bugzilla.mozilla.org/show_bug.cgi?id=958559
Any Suggestion?
If I add this patch to git:
diff --git a/bugzilla/base.py b/bugzilla/base.py
index bb7b940..0a6213b 100644
--- a/bugzilla/base.py
+++ b/bugzilla/base.py
@@ -34,6 +34,9 @@ import requests
from bugzilla import __version__, log
from bugzilla.bug import _Bug, _User
+import httplib
+httplib.HTTPConnection.debuglevel = 1
+
# Backwards compatibility
Bug = _Bug
Then run an attach command like:
PYTHONPATH=. ./bugzilla-cli --debug --bugzilla
partner-bugzilla.redhat.com
attach --file ~/py.png 946419
I see this result:
send: "POST /xmlrpc.cgi HTTP/1.1\r\nHost:
partner-bugzilla.redhat.com\r\nContent-Length: 1557\r\nAccept-Encoding: gzip,
deflate, compress\r\nAccept: */*\r\nUser-Agent: Python/Bugzilla\r\nCookie:
Bugzilla_logincookie=Jzkuaso0fH; Bugzilla_login=199727\r\nContent-Type:
text/xml\r\n\r\n<?xml
version='1.0'?>\n<methodCall>\n<methodName>Bug.add_attachment</methodName>\n<params>\n<param>\n<value><struct>\n<member>\n<name>file_name</name>\n<value><string>py.png</string></value>\n</member>\n<member>\n<name>data</name>\n<value><base64>\niVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A\n/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9gEGxE4IQYzJ14AAAI3SURBVDjL\nZZNPSFVBFIe/e9+zd3silBCl0SZoU4s2rVq0EB5tQip4UNvATVGu3QRBiyAi2iltWkgbF5EgRhFF\nRpiWtrWIzDIV1Pzz7p15M2fmtvDevOqBw8DM9zvnN8ycgF3R/eDtM2mac96ZdrFNxBikqbRV+vHH\n/ut9gAZczoe7C3gnF0f6au1OLM5avFi8d1Ea+JvAMSAq8nsKOGs5f2cYJ3Y7rc2PO4BqkS8DdD98\nf9tbe1ysCoxOBo1qlEXHJWcM4b5KPU19zleA0o4Clx99eO3EdqVewHsCoFRugUoVghJO7A6H6Vx9\nwdtYi27cr5x6dy/03nVtWTU7bWeZh6jNUcAiCaFTURl9A+gs56AviHzh3mnqtdPxm6knfQPLU7Ua\nokASQq/agY7yDrG16Mba6Pz48NP56VdrgAApYObGaicPtkovToFLQBKA/WUxTe3FRk4san15aGKg\nd3Dj560rrdGJS6FT0X9YYvLuiMKL1kAQOpHZ3PqfyZfP41+9PW1VfzX0RXFSECfgNEmSTgImdDru\nF2O0E8vvqZG1auQubAsKooIYYHpGvwA2g+xndQBHgWa6!
cG0ih5cW/w
6VvEq3nChwCoBvs+bL2Z7V\nceBHGTDAIrABpMVuhw+4OiLgLIglOLPYBTQAlfErIeCzjRVg1dtEb1kt5Omv+DTV2YssAN+zNdkz\nC42N9brV8WdvYp07seOdM2Of1F3AAknW0AJpwN6IgEPAEaANaMlcbmZdl7KRBuAfAb+v//yMAJoA\nAAAASUVORK5CYII=\n</base64></value>\n</member>\n<member>\n<name>ids</name>\n<value><array><data>\n<value><string>946419</string></value>\n</data></array></value>\n</member>\n<member>\n<name>content_type</name>\n<value><string>application/octet-stream</string></value>\n</member>\n<member>\n<name>summary</name>\n<value><string>py.png</string></value>\n</member>\n</struct></value>\n</param>\n</params>\n</methodCall>\n"
reply: 'HTTP/1.1 200 OK\r\n'
header: Date: Fri, 17 Jan 2014 15:04:14 GMT
header: Server: Apache
header: SOAPServer: SOAP::Lite/Perl/0.710.06
header: X-Content-Type-Options: nosniff
header: X-Frame-Options: SAMEORIGIN
header: X-Xss-Protection: 1; mode=block
header: Vary: Accept-Encoding,User-Agent
header: Content-Encoding: gzip
header: Content-Length: 164
header: Content-Type: text/xml
header: Connection: close
Created attachment 728575 on bug 946419
In the 'send' bit, you can see that the data is declared as <base64>, so it
seems like we are doing the correct thing here.
What does that change give you?
- Cole