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

Merged revisions 73436 via svnmerge from

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

........
  r73436 | tarek.ziade | 2009-06-16 01:30:13 +0200 (Tue, 16 Jun 2009) | 1 line

  Issue #6286: distutils upload command now uses urllib2
........
üst 2c02bdc8
...@@ -5,10 +5,9 @@ import sys ...@@ -5,10 +5,9 @@ import sys
import os, io import os, io
import socket import socket
import platform import platform
import configparser from urllib.request import urlopen, Request, HTTPError
import http.client as httpclient
import base64 import base64
import urllib.parse from urllib.parse import urlparse
from hashlib import md5 from hashlib import md5
from distutils.errors import * from distutils.errors import *
...@@ -61,6 +60,15 @@ class upload(PyPIRCCommand): ...@@ -61,6 +60,15 @@ class upload(PyPIRCCommand):
self.upload_file(command, pyversion, filename) self.upload_file(command, pyversion, filename)
def upload_file(self, command, pyversion, filename): def upload_file(self, command, pyversion, filename):
# Makes sure the repository URL is compliant
schema, netloc, url, params, query, fragments = \
urlparse(self.repository)
if params or query or fragments:
raise AssertionError("Incompatible url %s" % self.repository)
if schema not in ('http', 'https'):
raise AssertionError("unsupported schema " + schema)
# Sign if requested # Sign if requested
if self.sign: if self.sign:
gpg_args = ["gpg", "--detach-sign", "-a", filename] gpg_args = ["gpg", "--detach-sign", "-a", filename]
...@@ -153,40 +161,30 @@ class upload(PyPIRCCommand): ...@@ -153,40 +161,30 @@ class upload(PyPIRCCommand):
self.announce("Submitting %s to %s" % (filename, self.repository), log.INFO) self.announce("Submitting %s to %s" % (filename, self.repository), log.INFO)
# build the Request # build the Request
# We can't use urllib since we need to send the Basic headers = {'Content-type':
# auth right with the first request 'multipart/form-data; boundary=%s' % boundary,
# TODO(jhylton): Can we fix urllib? 'Content-length': str(len(body)),
schema, netloc, url, params, query, fragments = \ 'Authorization': auth}
urllib.parse.urlparse(self.repository)
assert not params and not query and not fragments request = Request(self.repository, data=body,
if schema == 'http': headers=headers)
http = httpclient.HTTPConnection(netloc) # send the data
elif schema == 'https':
http = httpclient.HTTPSConnection(netloc)
else:
raise AssertionError("unsupported schema "+schema)
data = ''
loglevel = log.INFO
try: try:
http.connect() result = urlopen(request)
http.putrequest("POST", url) status = result.getcode()
http.putheader('Content-type', reason = result.msg
'multipart/form-data; boundary=%s'%boundary)
http.putheader('Content-length', str(len(body)))
http.putheader('Authorization', auth)
http.endheaders()
http.send(body)
except socket.error as e: except socket.error as e:
self.announce(str(e), log.ERROR) self.announce(str(e), log.ERROR)
return return
except HTTPError as e:
status = e.code
reason = e.msg
r = http.getresponse() if status == 200:
if r.status == 200: self.announce('Server response (%s): %s' % (status, reason),
self.announce('Server response (%s): %s' % (r.status, r.reason),
log.INFO) log.INFO)
else: else:
self.announce('Upload failed (%s): %s' % (r.status, r.reason), self.announce('Upload failed (%s): %s' % (status, reason),
log.ERROR) log.ERROR)
if self.show_response: if self.show_response:
self.announce('-'*75, r.read(), '-'*75) self.announce('-'*75, result.read(), '-'*75)
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
import sys import sys
import os import os
import unittest import unittest
import http.client as httpclient
from distutils.command import upload as upload_mod
from distutils.command.upload import upload from distutils.command.upload import upload
from distutils.core import Distribution from distutils.core import Distribution
...@@ -19,48 +19,37 @@ index-servers = ...@@ -19,48 +19,37 @@ index-servers =
[server1] [server1]
username:me username:me
""" """
class Response(object):
def __init__(self, status=200, reason='OK'):
self.status = status
self.reason = reason
class FakeConnection(object): class FakeOpen(object):
def __init__(self): def __init__(self, url):
self.requests = [] self.url = url
self.headers = [] if not isinstance(url, str):
self.body = '' self.req = url
else:
self.req = None
self.msg = 'OK'
def __call__(self, netloc): def getcode(self):
return self return 200
def connect(self):
pass
endheaders = connect
def putrequest(self, method, url):
self.requests.append((method, url))
def putheader(self, name, value):
self.headers.append((name, value))
def send(self, body):
self.body = body
def getresponse(self):
return Response()
class uploadTestCase(PyPIRCCommandTestCase): class uploadTestCase(PyPIRCCommandTestCase):
def setUp(self): def setUp(self):
super(uploadTestCase, self).setUp() super(uploadTestCase, self).setUp()
self.old_class = httpclient.HTTPConnection self.old_open = upload_mod.urlopen
self.conn = httpclient.HTTPConnection = FakeConnection() upload_mod.urlopen = self._urlopen
self.last_open = None
def tearDown(self): def tearDown(self):
httpclient.HTTPConnection = self.old_class upload_mod.urlopen = self.old_open
super(uploadTestCase, self).tearDown() super(uploadTestCase, self).tearDown()
def _urlopen(self, url):
self.last_open = FakeOpen(url)
return self.last_open
def test_finalize_options(self): def test_finalize_options(self):
# new format # new format
...@@ -105,12 +94,13 @@ class uploadTestCase(PyPIRCCommandTestCase): ...@@ -105,12 +94,13 @@ class uploadTestCase(PyPIRCCommandTestCase):
cmd.run() cmd.run()
# what did we send ? # what did we send ?
headers = dict(self.conn.headers) headers = dict(self.last_open.req.headers)
self.assertEquals(headers['Content-length'], '2087') self.assertEquals(headers['Content-length'], '2087')
self.assert_(headers['Content-type'].startswith('multipart/form-data')) self.assert_(headers['Content-type'].startswith('multipart/form-data'))
self.assertEquals(self.last_open.req.get_method(), 'POST')
self.assertEquals(self.conn.requests, [('POST', '/pypi')]) self.assertEquals(self.last_open.req.get_full_url(),
self.assert_((b'xxx') in self.conn.body) 'http://pypi.python.org/pypi')
self.assert_(b'xxx' in self.last_open.req.data)
def test_suite(): def test_suite():
return unittest.makeSuite(uploadTestCase) return unittest.makeSuite(uploadTestCase)
......
...@@ -839,6 +839,9 @@ Core and Builtins ...@@ -839,6 +839,9 @@ Core and Builtins
Library Library
------- -------
- Issue #6286: Now Distutils upload command is based on urllib2 instead of
httplib, allowing the usage of http_proxy.
- Issue #6287: Added the license field in Distutils documentation. - Issue #6287: Added the license field in Distutils documentation.
- Issue #6263: Fixed syntax error in distutils.cygwincompiler. - Issue #6263: Fixed syntax error in distutils.cygwincompiler.
......
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