On Tue, Oct 15, 2013 at 06:16:01PM +0800, Crispin Wellington wrote:
> I've been trying to get a full round trip happening from/to a repo on
> bitbucket over Https. Firstly my Https client (that remembers username and
> password):
> 
> ---------------
> 
> class HttpsGitClient(HttpGitClient):
>     USER_AGENT = 'git/1.7.9.5'
> 
>     def __init__(self, base_url, username=None, password=None, dumb=None,
> *args, **kwargs):
>         parsed = urlparse.urlparse(base_url)
>         assert parsed.scheme in ('http', 'https')
>         self.username = username or parsed.username
>         self.password = password or parsed.password
> 
>         # strip username:password if its there
>         if parsed.username:
>             base_url = urlparse.urlunparse([parsed[0],
>                                             parsed[1].split('@',1)[1],
>                                             parsed[2],
>                                             parsed[3],
>                                             parsed[4],
>                                             parsed[5]])
> 
>         return HttpGitClient.__init__(self, base_url, dumb, *args, **kwargs)
> 
>     def _perform(self, req):
>         """Perform a HTTP(S) request with auth"""
>         base64string = base64.encodestring('%s:%s' % (self.username,
> self.password)).replace('\n', '')
>         req.add_header("Authorization", "Basic %s" % base64string)
> 
>         if self.USER_AGENT:
>             req.add_header('User-Agent', self.USER_AGENT)
> 
>         return HttpGitClient._perform(self,req)
> 
> -----------
> 
> This adds a user agent string (bitbuckets nginx rejects it otherwise) and
> adds the authorization in the http headers.
See https://bitbucket.org/site/master/issue/6666/ for the background on this.

Ideally I'd like HttpGitClient to just take a urllib http client; that way
HttpGitClient doesn't have to support every authentication method under
the sun.

> Doing the pull as follows works fine:
> 
>         client = HttpsGitClient(url, ....)
>         parse = urlparse(url)
>         remote_refs = client.fetch(parse.path, self.repo,
> progress=sys.stderr.write)
>         self.repo['HEAD'] = remote_refs['HEAD']
>         self.repo._build_tree()
Note that with the porcelain branch of Dulwich you can now just use
dulwich.porcelain.clone().

> Now when I try and do the push as follows:
> 
>         client = HttpsGitClient(url, ...)
>         parse = urlparse(url)
> 
>         def wantmaster(oldrefs):
>             return self.repo.get_refs()
> 
>         client.send_pack(parse.path, wantmaster,
> self.repo.object_store.generate_pack_contents)
> 
> Traceback (most recent call last):
>   File "repository.py", line 257, in <module>
>     r.push('https://bitbucket.org/username/project.git',
> username="username", password=sys.argv[1])
>   File "/.../repository.py", line 85, in push
>     self.repo.object_store.generate_pack_contents)
>   File "/.../python2.7/site-packages/dulwich/client.py", line 924, in
> send_pack
>     progress)
>   File "/.../python2.7/site-packages/dulwich/client.py", line 345, in
> _handle_receive_pack_tail
>     self._report_status_parser.check()
>   File "/.../python2.7/site-packages/dulwich/client.py", line 99, in check
>     raise SendPackError(self._pack_status)
> dulwich.errors.SendPackError: unpack eof before pack header was fully read
> 
> Has anyone has any luck pushing to bitbucket using HTTPS?
> What is the meaning of this error?

Can you check what the actual contents are of the response? Is it just
some sort of authentication error?

Cheers,

Jelmer


_______________________________________________
Mailing list: https://launchpad.net/~dulwich-users
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~dulwich-users
More help   : https://help.launchpad.net/ListHelp

Reply via email to