Convert tabs to spaces

This commit is contained in:
james 2016-04-24 20:09:27 -06:00
parent b7945e6a60
commit 615be0ae8a
1 changed files with 168 additions and 168 deletions

View File

@ -27,228 +27,228 @@ verbose = False
def barf(msg):
print >> sys.stderr, "Error! %s" % msg
sys.exit(1)
print >> sys.stderr, "Error! %s" % msg
sys.exit(1)
if sys.version_info < (2, 4):
barf("Requires Python 2.4+")
barf("Requires Python 2.4+")
def parseuri(uri):
"""Parse URI, return (host, port, path) tuple.
"""Parse URI, return (host, port, path) tuple.
>>> parseuri('http://example.org/testing?somequery#frag')
('example.org', 80, '/testing?somequery')
>>> parseuri('http://example.net:8080/test.html')
('example.net', 8080, '/test.html')
"""
>>> parseuri('http://example.org/testing?somequery#frag')
('example.org', 80, '/testing?somequery')
>>> parseuri('http://example.net:8080/test.html')
('example.net', 8080, '/test.html')
"""
scheme, netplace, path, query, fragid = urlparse.urlsplit(uri)
scheme, netplace, path, query, fragid = urlparse.urlsplit(uri)
if ':' in netplace:
host, port = netplace.split(':', 2)
port = int(port)
else:
host, port = netplace, 80
if ':' in netplace:
host, port = netplace.split(':', 2)
port = int(port)
else:
host, port = netplace, 80
if query: path += '?' + query
if query: path += '?' + query
return host, port, path
return host, port, path
def putfile(f, uri, username=None, password=None):
"""HTTP PUT the file f to uri, with optional auth data."""
host, port, path = parseuri(uri)
"""HTTP PUT the file f to uri, with optional auth data."""
host, port, path = parseuri(uri)
redirect = set([301, 302, 307])
authenticate = set([401])
okay = set([200, 201, 204])
redirect = set([301, 302, 307])
authenticate = set([401])
okay = set([200, 201, 204])
authorized = False
authorization = None
tries = 0
authorized = False
authorization = None
tries = 0
while True:
# Attempt to HTTP PUT the data
h = httplib.HTTPConnection(host, port)
while True:
# Attempt to HTTP PUT the data
h = httplib.HTTPConnection(host, port)
h.putrequest('PUT', path)
h.putrequest('PUT', path)
h.putheader('User-Agent', 'put.py/1.0')
h.putheader('Connection', 'keep-alive')
h.putheader('Transfer-Encoding', 'chunked')
h.putheader('Expect', '100-continue')
h.putheader('Accept', '*/*')
if authorization:
h.putheader('Authorization', authorization)
h.endheaders()
h.putheader('User-Agent', 'put.py/1.0')
h.putheader('Connection', 'keep-alive')
h.putheader('Transfer-Encoding', 'chunked')
h.putheader('Expect', '100-continue')
h.putheader('Accept', '*/*')
if authorization:
h.putheader('Authorization', authorization)
h.endheaders()
# Chunked transfer encoding
# Cf. 'All HTTP/1.1 applications MUST be able to receive and
# decode the "chunked" transfer-coding'
# - http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html
while True:
bytes = f.read(1024)
if not bytes: break
length = len(bytes)
# h.send('%X\r\n' % length)
h.send(bytes)
# h.send('0\r\n\r\n')
# Chunked transfer encoding
# Cf. 'All HTTP/1.1 applications MUST be able to receive and
# decode the "chunked" transfer-coding'
# - http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html
while True:
bytes = f.read(1024)
if not bytes: break
length = len(bytes)
# h.send('%X\r\n' % length)
h.send(bytes)
# h.send('0\r\n\r\n')
resp = h.getresponse()
status = resp.status # an int
resp = h.getresponse()
status = resp.status # an int
# Got a response, now decide how to act upon it
if status in redirect:
location = resp.getheader('Location')
uri = urlparse.urljoin(uri, location)
host, port, path = parseuri(uri)
# Got a response, now decide how to act upon it
if status in redirect:
location = resp.getheader('Location')
uri = urlparse.urljoin(uri, location)
host, port, path = parseuri(uri)
# We may have to authenticate again
if authorization:
authorization = None
# We may have to authenticate again
if authorization:
authorization = None
elif status in authenticate:
# If we've done this already, break
if authorization:
# barf("Going around in authentication circles")
barf("Authentication failed")
elif status in authenticate:
# If we've done this already, break
if authorization:
# barf("Going around in authentication circles")
barf("Authentication failed")
if not (username and password):
barf("Need a username and password to authenticate with")
if not (username and password):
barf("Need a username and password to authenticate with")
# Get the scheme: Basic or Digest?
wwwauth = resp.msg['www-authenticate'] # We may need this again
wauth = wwwauth.lstrip(' \t') # Hence use wauth not wwwauth here
wauth = wwwauth.replace('\t', ' ')
i = wauth.index(' ')
scheme = wauth[:i].lower()
# Get the scheme: Basic or Digest?
wwwauth = resp.msg['www-authenticate'] # We may need this again
wauth = wwwauth.lstrip(' \t') # Hence use wauth not wwwauth here
wauth = wwwauth.replace('\t', ' ')
i = wauth.index(' ')
scheme = wauth[:i].lower()
if scheme in set(['basic', 'digest']):
if verbose:
msg = "Performing %s Authentication..." % scheme.capitalize()
print >> sys.stderr, msg
else:
barf("Unknown authentication scheme: %s" % scheme)
if scheme in set(['basic', 'digest']):
if verbose:
msg = "Performing %s Authentication..." % scheme.capitalize()
print >> sys.stderr, msg
else:
barf("Unknown authentication scheme: %s" % scheme)
if scheme == 'basic':
import base64
userpass = username + ':' + password
userpass = base64.encodestring(userpass).strip()
authorized, authorization = True, 'Basic ' + userpass
if scheme == 'basic':
import base64
userpass = username + ':' + password
userpass = base64.encodestring(userpass).strip()
authorized, authorization = True, 'Basic ' + userpass
elif scheme == 'digest':
if verbose:
msg = "uses fragile, undocumented features in urllib2"
print >> sys.stderr, "Warning! Digest Auth %s" % msg
elif scheme == 'digest':
if verbose:
msg = "uses fragile, undocumented features in urllib2"
print >> sys.stderr, "Warning! Digest Auth %s" % msg
import urllib2 # See warning above
import urllib2 # See warning above
passwd = type('Password', (object,), {
'find_user_password': lambda self, *args: (username, password),
'add_password': lambda self, *args: None
})()
passwd = type('Password', (object,), {
'find_user_password': lambda self, *args: (username, password),
'add_password': lambda self, *args: None
})()
req = type('Request', (object,), {
'get_full_url': lambda self: uri,
'has_data': lambda self: None,
'get_method': lambda self: 'PUT',
'get_selector': lambda self: path
})()
req = type('Request', (object,), {
'get_full_url': lambda self: uri,
'has_data': lambda self: None,
'get_method': lambda self: 'PUT',
'get_selector': lambda self: path
})()
# Cf. urllib2.AbstractDigestAuthHandler.retry_http_digest_auth
auth = urllib2.AbstractDigestAuthHandler(passwd)
token, challenge = wwwauth.split(' ', 1)
chal = urllib2.parse_keqv_list(urllib2.parse_http_list(challenge))
userpass = auth.get_authorization(req, chal)
authorized, authorization = True, 'Digest ' + userpass
# Cf. urllib2.AbstractDigestAuthHandler.retry_http_digest_auth
auth = urllib2.AbstractDigestAuthHandler(passwd)
token, challenge = wwwauth.split(' ', 1)
chal = urllib2.parse_keqv_list(urllib2.parse_http_list(challenge))
userpass = auth.get_authorization(req, chal)
authorized, authorization = True, 'Digest ' + userpass
elif status in okay:
if (username and password) and (not authorized):
msg = "Warning! The supplied username and password went unused"
print >> sys.stderr, msg
elif status in okay:
if (username and password) and (not authorized):
msg = "Warning! The supplied username and password went unused"
print >> sys.stderr, msg
if verbose:
resultLine = "Success! Resource %s"
statuses = {200: 'modified', 201: 'created', 204: 'modified'}
print resultLine % statuses[status]
if verbose:
resultLine = "Success! Resource %s"
statuses = {200: 'modified', 201: 'created', 204: 'modified'}
print resultLine % statuses[status]
statusLine = "Response-Status: %s %s"
print statusLine % (status, resp.reason)
statusLine = "Response-Status: %s %s"
print statusLine % (status, resp.reason)
body = resp.read(58)
body = body.rstrip('\r\n')
body = body.encode('string_escape')
body = resp.read(58)
body = body.rstrip('\r\n')
body = body.encode('string_escape')
if len(body) >= 58:
body = body[:57] + '[...]'
if len(body) >= 58:
body = body[:57] + '[...]'
bodyLine = 'Response-Body: "%s"'
print bodyLine % body
break
bodyLine = 'Response-Body: "%s"'
print bodyLine % body
break
# @@ raise PutError, do the catching in main?
else:
barf('Got "%s %s"' % (status, resp.reason))
# @@ raise PutError, do the catching in main?
else:
barf('Got "%s %s"' % (status, resp.reason))
tries += 1
if tries >= 50:
barf("Too many redirects")
tries += 1
if tries >= 50:
barf("Too many redirects")
return status, resp
return status, resp
def putname(fn, uri, username=None, password=None):
"""HTTP PUT the file with filename fn to uri, with optional auth data."""
auth = {'username': username, 'password': password}
"""HTTP PUT the file with filename fn to uri, with optional auth data."""
auth = {'username': username, 'password': password}
if fn != '-':
f = open(fn, 'rb')
status, resp = putfile(f, uri, **auth)
f.close()
else:
status, resp = putfile(sys.stdin, uri, **auth)
if fn != '-':
f = open(fn, 'rb')
status, resp = putfile(f, uri, **auth)
f.close()
else:
status, resp = putfile(sys.stdin, uri, **auth)
return status, resp
return status, resp
def put(s, uri, username=None, password=None):
"""HTTP PUT the string s to uri, with optional auth data."""
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
"""HTTP PUT the string s to uri, with optional auth data."""
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
f = StringIO(s)
f.seek(0)
status, resp = putfile(f, uri, username=username, password=password)
f.close()
f = StringIO(s)
f.seek(0)
status, resp = putfile(f, uri, username=username, password=password)
f.close()
return status, conn
return status, conn
def main(argv=None):
usage = ('%prog [options] filename uri\n' +
'The filename may be - for stdin\n' +
'Use command line password at your own risk!')
usage = ('%prog [options] filename uri\n' +
'The filename may be - for stdin\n' +
'Use command line password at your own risk!')
parser = OptionParser(usage=usage)
parser.add_option('-u', '--username', help='HTTP Auth username')
parser.add_option('-p', '--password', help='HTTP Auth password')
parser.add_option('-q', '--quiet', action='store_true', help="shhh!")
options, args = parser.parse_args(argv)
parser = OptionParser(usage=usage)
parser.add_option('-u', '--username', help='HTTP Auth username')
parser.add_option('-p', '--password', help='HTTP Auth password')
parser.add_option('-q', '--quiet', action='store_true', help="shhh!")
options, args = parser.parse_args(argv)
if len(args) != 2:
parser.error("Requires two arguments, filename and uri")
if len(args) != 2:
parser.error("Requires two arguments, filename and uri")
fn, uri = args
if not uri.startswith('http:'):
parser.error("The uri argument must start with 'http:'")
fn, uri = args
if not uri.startswith('http:'):
parser.error("The uri argument must start with 'http:'")
if ((options.username and not options.password) or
(options.password and not options.username)):
parser.error("Must have both username and password or neither")
if ((options.username and not options.password) or
(options.password and not options.username)):
parser.error("Must have both username and password or neither")
global verbose
verbose = (not options.quiet)
global verbose
verbose = (not options.quiet)
auth = {'username': options.username, 'password': options.password}
putname(fn, uri, **auth)
auth = {'username': options.username, 'password': options.password}
putname(fn, uri, **auth)
if __name__ == '__main__':
main()
main()