Kaydet (Commit) e220d679 authored tarafından Tarek Ziadé's avatar Tarek Ziadé

Merged revisions 76952 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r76952 | tarek.ziade | 2009-12-21 00:23:34 +0100 (Mon, 21 Dec 2009) | 1 line

  Fixed #7552: fixed distutils.command.upload failure on very long passwords
........
üst 59a38989
...@@ -11,7 +11,7 @@ import os ...@@ -11,7 +11,7 @@ import os
import socket import socket
import platform import platform
import httplib import httplib
import base64 from base64 import standard_b64encode
import urlparse import urlparse
import cStringIO as StringIO import cStringIO as StringIO
from ConfigParser import ConfigParser from ConfigParser import ConfigParser
...@@ -115,7 +115,8 @@ class upload(PyPIRCCommand): ...@@ -115,7 +115,8 @@ class upload(PyPIRCCommand):
open(filename+".asc").read()) open(filename+".asc").read())
# set up the authentication # set up the authentication
auth = "Basic " + base64.encodestring(self.username + ":" + self.password).strip() auth = "Basic " + standard_b64encode(self.username + ":" +
self.password)
# Build up the MIME payload for the POST data # Build up the MIME payload for the POST data
boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
......
"""Support code for distutils test cases.""" """Support code for distutils test cases."""
import os
import shutil import shutil
import tempfile import tempfile
from distutils import log from distutils import log
from distutils.dist import Distribution
class LoggingSilencer(object): class LoggingSilencer(object):
...@@ -55,6 +55,23 @@ class TempdirManager(object): ...@@ -55,6 +55,23 @@ class TempdirManager(object):
finally: finally:
f.close() f.close()
def create_dist(self, pkg_name='foo', **kw):
"""Will generate a test environment.
This function creates:
- a Distribution instance using keywords
- a temporary directory with a package structure
It returns the package directory and the distribution
instance.
"""
tmp_dir = self.mkdtemp()
pkg_dir = os.path.join(tmp_dir, pkg_name)
os.mkdir(pkg_dir)
dist = Distribution(attrs=kw)
return pkg_dir, dist
class DummyCommand: class DummyCommand:
"""Class to store options for retrieval via set_undefined_options().""" """Class to store options for retrieval via set_undefined_options()."""
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
import sys import sys
import os import os
import unittest import unittest
import httplib
from distutils.command.upload import upload from distutils.command.upload import upload
from distutils.core import Distribution from distutils.core import Distribution
...@@ -9,8 +10,66 @@ from distutils.core import Distribution ...@@ -9,8 +10,66 @@ from distutils.core import Distribution
from distutils.tests import support from distutils.tests import support
from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase
PYPIRC_LONG_PASSWORD = """\
[distutils]
index-servers =
server1
server2
[server1]
username:me
password:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[server2]
username:meagain
password: secret
realm:acme
repository:http://another.pypi/
"""
class _Resp(object):
def __init__(self, status):
self.status = status
self.reason = 'OK'
_CONNECTIONS = []
class _FakeHTTPConnection(object):
def __init__(self, netloc):
self.requests = []
self.headers = {}
self.body = None
self.netloc = netloc
_CONNECTIONS.append(self)
def connect(self):
pass
endheaders = connect
def send(self, body):
self.body = body
def putrequest(self, type_, data):
self.requests.append((type_, data))
def putheader(self, name, value):
self.headers[name] = value
def getresponse(self):
return _Resp(200)
class uploadTestCase(PyPIRCCommandTestCase): class uploadTestCase(PyPIRCCommandTestCase):
def setUp(self):
super(uploadTestCase, self).setUp()
self.old_klass = httplib.HTTPConnection
httplib.HTTPConnection = _FakeHTTPConnection
def tearDown(self):
httplib.HTTPConnection = self.old_klass
super(uploadTestCase, self).tearDown()
def test_finalize_options(self): def test_finalize_options(self):
# new format # new format
...@@ -27,6 +86,33 @@ class uploadTestCase(PyPIRCCommandTestCase): ...@@ -27,6 +86,33 @@ class uploadTestCase(PyPIRCCommandTestCase):
self.assertEquals(getattr(cmd, attr), waited) self.assertEquals(getattr(cmd, attr), waited)
def test_upload(self):
tmp = self.mkdtemp()
path = os.path.join(tmp, 'xxx')
self.write_file(path)
command, pyversion, filename = 'xxx', '2.6', path
dist_files = [(command, pyversion, filename)]
self.write_file(self.rc, PYPIRC_LONG_PASSWORD)
# lets run it
pkg_dir, dist = self.create_dist(dist_files=dist_files)
cmd = upload(dist)
cmd.ensure_finalized()
cmd.run()
# what did we send ?
res = _CONNECTIONS[-1]
headers = res.headers
self.assertEquals(headers['Content-length'], '2086')
self.assertTrue(headers['Content-type'].startswith('multipart/form-data'))
method, request = res.requests[-1]
self.assertEquals(method, 'POST')
self.assertEquals(res.netloc, 'pypi.python.org')
self.assertTrue('xxx' in res.body)
self.assertFalse('\n' in headers['Authorization'])
def test_suite(): def test_suite():
return unittest.makeSuite(uploadTestCase) return unittest.makeSuite(uploadTestCase)
......
...@@ -35,6 +35,10 @@ Core and Builtins ...@@ -35,6 +35,10 @@ Core and Builtins
Library Library
------- -------
- Issue #7552: Removed line feed in the base64 Authorization header in
the Distutils upload command to avoid an error when PyPI reads it.
This occurs on long passwords. Initial patch by JP St. Pierre.
- Issue #7231: urllib2 cannot handle https with proxy requiring auth. Patch by - Issue #7231: urllib2 cannot handle https with proxy requiring auth. Patch by
Tatsuhiro Tsujikawa. Tatsuhiro Tsujikawa.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment