-
Couldn't load subscription status.
- Fork 708
Open
@sqwxl
Description
What I'm trying to do
The bitbucket cloud api offers an endpoint to commit a text file using the Content-Type: x-www-form-urlencoded header. Using curl the call looks something like:
curl -u username:password https://api.bitbucket.org/2.0/repositories/myorg/myrepo/src \ --data-urlencode '/file.txt=File content.' \ --data-urlencode 'author=Me McMyself <my@email.com>' \ --data-urlencode 'message=A commit message.' \ --data-urlencode 'branch=somebranch'
What I've tried
from atlassian.bitbucket import Cloud session = Cloud(username=username, password=password, cloud=True) repo = session.workspaces.get(myorg).repositories.get(myrepo) data = { "/file.txt": "File content." "author": "Me McMyself <my@email.com>", "message": "A commit message.", "branch": "somebranch", } repo.post( "src", headers={"Content-Type": "application/x-www-form-urlencoded"}, data=data )
Expected behavior
The outgoing request should have a payload that looks like this:
/file.txt=File+content.&author=Me+McMyself+%3Cmy%40email.com%3E&message=A+commit+message.&branch=somebranch
Actual behavior
Instead, it looks like this:
'"{\"/file.txt\": \"File content.\", \"message\": \"A commit message.\", \"author\": \"Me McMyself <my@email.com>\", \"branch\": \"somebranch\"}"'
...which isn't correctly interpreted by bitbucket because they are expecting a urlencoded payload as above.
Explanation
AtlassianRestAPI's request method has the following lines
if files is None: data = None if not data else dumps(data) json_dump = None if not json else dumps(json)
which run before the request is passed along to the requests module...
Workaround
After trying all kinds of variations using this library, I ended up making a call with requests directly:
requests.request( "POST", repo.url + "/src", data=data, auth=(session.username, session.password), )